使用Django+Apache2+mod_wsgi进行Web服务器配置的步骤
首先
每次在Apache上发布由Django创建的Web应用程序时,都需要对mod_wsgi进行配置。由于每次都会忘记步骤,所以我重新整理了一下。
执行流程
准备Django的执行环境。
在venv的虚拟环境中安装Django,并准备进行开发。
# python関係のパッケージをインストール
# devのインストールにはマイナーバージョンまで指定する必要があるので注意
sudo apt install python3-venv python3.8-dev
cd ~
mkdir django
cd django
python3 -m venv venv
source venv/bin/activate
pip install wheel django mod_wsgi
在虚拟环境中,除了Django之外,还安装了mod_wsgi以便稍后在Apache上运行Django所需。
关于mod_wsgi,可以参考维基百科等外部网站。简单来说,Python的Web应用程序框架有Django和Flask等各种存在,而mod_wsgi可以将这些框架的接口标准化,使得可以在Apache等Web服务器上运行,而不需要考虑框架的类型。我理解mod_wsgi是为了在Web服务器上运行Python的Web应用程序而设计的。
mod_wsgi是一个模块,用于在Apache HTTP Server上运行符合WSGI(Web Server Gateway Interface)接口的Python程序。
使用Django进行Web应用开发
尽管和Apache或mod_wsgi无关,但还是保留下来。在这里,我们将项目名称设置为alice,应用程序名称设置为artemis。
django-admin startproject alice
cd alice
为了避免使用默认文件夹名难以理解,我们将项目中的alice目录重命名为config。由于重命名后路径发生了变化,因此我们需要将以下文件中的alice.*等部分改为config.*。
-
- manager.py
-
- config/asgi.py
-
- config/settings.py
- config/wsgi.py
当完成初期设置后,我们将使用startapp开始开发应用程序。
python manager.py startapp artemis
创建一个用于应用程序的urls.py文件,并编辑根路径和应用程序的URLConf文件。IndexView是在views.py中创建的一个适当的视图。
from django.urls import path
from . import views
urlpatterns = [
path('', views.IndexView.as_view(), name="index"),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("artemis.urls")),
]
最后,我们将编辑settings.py文件,并进行必要的配置以注册和外部公开所开发的应用程序。
・・・
DEBUG = False
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'artemis.apps.ArtemisConfig',
・・・
]
・・・
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
汇集静态内容
当开发完成后,将静态内容(如.jpg、.js、.css等)汇集到一个目录中。
Django为我们提供了collectstatic命令,使用它可以自动将各个应用程序使用的静态内容收集到在settings.py中指定的STATIC_ROOT目录中。
cd [プロジェクトディレクトリ]
mkdir static
python manage.py collectstatic
安装Apache2
在APT中安装Apache2。
sudo apt install apache2 apache2-dev
本次我们将使用8000作为HTTP端口。我们将在apache的配置中更改接收请求的端口,并且也会开放8000端口的防火墙。
sudo nano /etc/apache2/ports.conf
# - Listen 80
# + Listen 8000
sudo ufw allow 8000/tcp
sudo ufw enable
修改mod_wsgi的配置
进入Django的虚拟环境,执行mod_wsgi-express命令,并保存输出。之后将它粘贴到mod_wsgi的配置文件中。
source ~/django/venv/bin/activate
mod_wsgi-express module-config
# LoadModule wsgi_module "/home/vboxuser/django/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
# WSGIPythonHome "/home/vboxuser/django/venv"
接下来,我们要创建一个在Apache中执行的应用程序配置文件。由于已经有了名为000-default.conf的默认配置文件,我们将复制并使用它。
cd /etc/apache2/sites-available
sudo cp 000-default.conf alice.conf
sudo nano alice.conf
设置的内容如下所示。
# 先程控えたmod_wsgi-expressの出力を貼り付ける
LoadModule wsgi_module "/home/vboxuser/django/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
WSGIPythonHome "/home/vboxuser/django/venv"
<VirtualHost *:8000>
# Djangoのwsig.pyのパスを記述する
WSGIScriptAlias / /home/vboxuser/django/alice/config/wsgi.py
# 仮想環境のホームディレクトリとPYTHONPATHを指定する
# processとthreadsにはApacheで起動するプロセス数とスレッド数を指定する
# display-nameにはtopやpsで確認するための起動プロセス名を指定する
WSGIDaemonProcess alice_http python-home=/home/vboxuser/django/venv python-path=/home/vboxuser/django/alice:/home/vboxuser/django/venv/lib/python3.8/site-packages processes=2 threads=2 display-name=alice
WSGIProcessGroup alice_http
# Djangoのconfigディレクトリを指定する
<Directory /home/vboxuser/django/alice/config>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# 静的コンテンツがある場合のみ
# collectstaticで集積したディレクトリを指定する
Alias /static/ /home/vboxuser/django/alice/static/
<Directory /home/vboxuser/django/alice/static>
Require all granted
</Directory>
</VirtualHost>
最後,禁用默认应用程序000-default的配置文件,并启用创建的alice.conf。
sudo a2dissite 000-default
sudo a2ensite alice
sudo systemctl restart apache2.service
sudo systemctl enable apache2.service
确认行动
通过Web浏览器访问http://localhost:8000以进行操作确认。此外,还可以在http://localhost:8000/admin/中确认是否可以加载CSS等静态内容。
ps -ax | grep alice
3320 ? Sl 0:00 alice -k start
3321 ? Sl 0:00 alice -k start
使用ps命令确认正在运行的进程,可以看到根据alice.conf配置文件中指定的,有两个以alice作为进程名的进程在运行。
请对以下内容进行中文释义,仅需要一个选项:
参考