Django - Apache 配置
使用 Apache 和 mod_wsgi 部署 Django
Section titled “使用 Apache 和 mod_wsgi 部署 Django”在本教程中,我们一直依赖 Django 内置的开发服务器 (manage.py runserver)。虽然它因自动重载特性非常适合开发和测试,但不适用于生产环境。它未经过安全审计,也并非设计来处理高流量负载。
对于生产部署,你需要一个强大的Web 服务器 (web server),例如 Apache 或 Nginx,并结合一个 WSGI (Web 服务器网关接口 (Web Server Gateway Interface)) 服务器。WSGI 是 Python Web 应用和 Web 服务器之间的标准接口。Django 在项目结构中包含一个 wsgi.py 文件,专门用于此目的。
项目结构回顾:
Section titled “项目结构回顾:”myproject/ manage.py myproject/ __init__.py settings.py urls.py wsgi.py # 这个文件将 Django 连接到 WSGI 服务器本章重点介绍如何使用带有 mod_wsgi 模块的 Apache 部署 Django。虽然这仍然是一个有效的选择,但许多现代部署更倾向于使用 Nginx 和专用的 WSGI 服务器(如 Gunicorn 或 uWSGI),以获得更好的性能和更简便的配置,尤其是在容器化设置中(如 Docker)。然而,理解 Apache/mod_wsgi 仍然很有价值。
- 已安装 Apache Web 服务器。
- 已安装并启用 Apache 的
mod_wsgi模块。确保安装与你的 Python 3 环境兼容的版本(例如,根据你的操作系统,可能是python3-mod-wsgi或类似的包名)。 - 你的 Django 项目代码已部署到服务器上(例如,在
/srv/myproject目录下)。
Apache 配置(使用虚拟主机)
Section titled “Apache 配置(使用虚拟主机)”最佳实践是使用虚拟主机 (virtual host) 配置 Apache,而不是直接编辑主配置文件 httpd.conf 或 apache2.conf。为你的站点创建一个配置文件(例如,在 Debian/Ubuntu 上是 /etc/apache2/sites-available/myproject.conf,在 CentOS/RHEL 上是 /etc/httpd/conf.d/myproject.conf)。
这是一个基本的配置示例:
<VirtualHost *:80> ServerName your_domain.com ServerAlias www.your_domain.com
# 静态文件的别名(通过 collectstatic 收集) Alias /static/ /srv/myproject/staticfiles/ <Directory /srv/myproject/staticfiles> Require all granted </Directory>
# 媒体文件的别名(用户上传) Alias /media/ /srv/myproject/mediafiles/ <Directory /srv/myproject/mediafiles> Require all granted </Directory>
# WSGI 配置 WSGIDaemonProcess myproject python-home=/srv/myproject/venv python-path=/srv/myproject WSGIProcessGroup myproject WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
<Directory /srv/myproject/myproject> <Files wsgi.py> Require all granted </Files> </Directory>
ErrorLog ${APACHE_LOG_DIR}/myproject_error.log CustomLog ${APACHE_LOG_DIR}/myproject_access.log combined</VirtualHost>关键配置指令说明:
Section titled “关键配置指令说明:”ServerName,ServerAlias: 定义此配置适用的域名。Alias /static/ ...: 告诉 Apache 直接从你的STATIC_ROOT目录(例如,/srv/myproject/staticfiles)提供在/static/下请求的文件。你必须先运行python manage.py collectstatic命令。<Directory ...> Require all granted </Directory>: 授予 Apache 从这些目录提供文件的权限(使用 Apache 2.4+ 语法)。Alias /media/ ...: 类似于静态文件,但用于MEDIA_ROOT定义的用户上传内容(例如,/srv/myproject/mediafiles)。WSGIDaemonProcess: 定义一个守护进程组来运行你的 Django 应用。python-home应指向你的虚拟环境,python-path应指向你项目的根目录。WSGIProcessGroup: 将应用分配到定义的守护进程组。WSGIScriptAlias / /path/to/myproject/myproject/wsgi.py: 核心指令,将根 URL (/) 映射到你的 Django 项目的wsgi.py文件,告诉 Apache 通过 mod_wsgi 将请求传递给 Django。
创建或修改配置后:
Section titled “创建或修改配置后:”- 启用站点(例如,在 Debian/Ubuntu 上运行
sudo a2ensite myproject.conf)。 - 检查 Apache 配置是否存在错误(例如,运行
sudo apache2ctl configtest或sudo httpd -t)。 - 重启或重载 Apache(例如,运行
sudo systemctl restart apache2或sudo systemctl reload httpd)。
确保文件权限
Section titled “确保文件权限”Apache 运行的用户(例如,www-data, apache)需要对你的项目文件和虚拟环境具有读取权限,并可能需要对你的 media 目录和数据库文件(如果使用 SQLite)具有写入权限。相应地调整权限。
访问你的站点
Section titled “访问你的站点”如果一切配置正确,访问 http://your_domain.com(或者如果你在本地测试且没有域名,则访问服务器的 IP 地址)现在应该能提供你的 Django 应用服务,而不仅仅是列出目录。
替代方案:Nginx + Gunicorn/uWSGI
Section titled “替代方案:Nginx + Gunicorn/uWSGI”如前所述,一个流行的替代方案是使用 Nginx 作为反向代理 (reverse proxy),放在专用的 WSGI 服务器(如 Gunicorn 或 uWSGI)前面。Gunicorn 通常因其简单性而受到青睐。
- 安装 Nginx 和 Gunicorn (
pip install gunicorn)。 - 运行 Gunicorn,让它提供 Django 应用服务(例如,
gunicorn --bind 0.0.0.0:8000 myproject.wsgi)。通常通过进程管理器 (process supervisor),如systemd或supervisor来管理。 - 将 Nginx 配置为反向代理,将请求转发给 Gunicorn(在此示例中运行在 8000 端口)。Nginx 也会直接处理静态文件和媒体文件的服务。
- 此设置的详细配置超出本章范围,但在网上有广泛的文档。搜索 ‘deploy django nginx gunicorn’。
- Django 部署文档:https://docs.djangoproject.com/en/stable/howto/deployment/
- mod_wsgi 文档:https://modwsgi.readthedocs.io/en/master/