Skip to content

Django - Apache 配置

在本教程中,我们一直依赖 Django 内置的开发服务器 (manage.py runserver)。虽然它因自动重载特性非常适合开发和测试,但不适用于生产环境。它未经过安全审计,也并非设计来处理高流量负载。

对于生产部署,你需要一个强大的Web 服务器 (web server),例如 Apache 或 Nginx,并结合一个 WSGI (Web 服务器网关接口 (Web Server Gateway Interface)) 服务器。WSGI 是 Python Web 应用和 Web 服务器之间的标准接口。Django 在项目结构中包含一个 wsgi.py 文件,专门用于此目的。

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 目录下)。

最佳实践是使用虚拟主机 (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>
  • 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。
  1. 启用站点(例如,在 Debian/Ubuntu 上运行 sudo a2ensite myproject.conf)。
  2. 检查 Apache 配置是否存在错误(例如,运行 sudo apache2ctl configtest 或 sudo httpd -t)。
  3. 重启或重载 Apache(例如,运行 sudo systemctl restart apache2 或 sudo systemctl reload httpd)。

Apache 运行的用户(例如,www-data, apache)需要对你的项目文件和虚拟环境具有读取权限,并可能需要对你的 media 目录和数据库文件(如果使用 SQLite)具有写入权限。相应地调整权限。

如果一切配置正确,访问 http://your_domain.com(或者如果你在本地测试且没有域名,则访问服务器的 IP 地址)现在应该能提供你的 Django 应用服务,而不仅仅是列出目录。

如前所述,一个流行的替代方案是使用 Nginx 作为反向代理 (reverse proxy),放在专用的 WSGI 服务器(如 Gunicorn 或 uWSGI)前面。Gunicorn 通常因其简单性而受到青睐。

  1. 安装 Nginx 和 Gunicorn (pip install gunicorn)。
  2. 运行 Gunicorn,让它提供 Django 应用服务(例如,gunicorn --bind 0.0.0.0:8000 myproject.wsgi)。通常通过进程管理器 (process supervisor),如 systemd 或 supervisor 来管理。
  3. 将 Nginx 配置为反向代理,将请求转发给 Gunicorn(在此示例中运行在 8000 端口)。Nginx 也会直接处理静态文件和媒体文件的服务。
  4. 此设置的详细配置超出本章范围,但在网上有广泛的文档。搜索 ‘deploy django nginx gunicorn’。