第九章:部署 — 9.2 Web 服务器配置(Nginx 与 Apache) Django 应用的生产环境部署离不开高性能、安全可靠的 Web 服务器。Nginx 与 Apache 作为两大主流开源 Web 服务器,在 Django 生产架构中分别承担静态资源服务、反向代理、SSL 终止、安全加固与负载分发等关键职能。本文系统讲解二者在 Django 部署中的角色定位、配置实践、安全加固与性能调优策略,帮助开发者构建稳定、高效、符合生产标准的 Web 服务层。 9.2.1 Web 服务器在 Django 部署中的核心角色 Django 本身并非为直接暴露于公网而设计,其内置开发服务器仅适用于调试。
Django 应用的生产环境部署离不开高性能、安全可靠的 Web 服务器。Nginx 与 Apache 作为两大主流开源 Web 服务器,在 Django 生产架构中分别承担静态资源服务、反向代理、SSL 终止、安全加固与负载分发等关键职能。本文系统讲解二者在 Django 部署中的角色定位、配置实践、安全加固与性能调优策略,帮助开发者构建稳定、高效、符合生产标准的 Web 服务层。
Django 本身并非为直接暴露于公网而设计,其内置开发服务器仅适用于调试。在生产环境中,Web 服务器是 Django 架构中不可或缺的前置组件,承担以下关键职责:
请求入口与协议终止
监听 80(HTTP)或 443(HTTPS)端口,接收并解析客户端 HTTP/HTTPS 请求,完成 TLS 握手与证书验证。
静态资源高效服务
直接响应 /static/ 与 /media/ 路径下的 CSS、JavaScript、图片、用户上传文件等,避免请求进入 Python 进程,显著降低应用服务器负载。
反向代理与动态请求路由
将非静态路径(如 /api/、/admin/、/)通过 proxy_pass(Nginx)或 WSGIScriptAlias(Apache)转发至后端 WSGI 服务器(Gunicorn/uWSGI 或 mod_wsgi),实现动静分离。
安全网关功能
提供访问控制、请求速率限制、恶意头过滤、HTTP 安全头注入、IP 黑白名单等能力,构成应用第一道防护屏障。
高可用支撑(可选)
在集群部署中,可作为负载均衡器,将流量分发至多个 Django 应用实例,提升系统吞吐量与容错能力。
✅ 关键认知:Web 服务器不是 Django 的替代品,而是其生产就绪的“基础设施适配器”——它释放 Django 的业务逻辑专注力,同时保障性能、安全与可扩展性。
Nginx 是基于事件驱动异步非阻塞模型的高性能 HTTP 服务器与反向代理,凭借低内存占用、高并发处理能力及简洁配置语法,已成为现代 Django 部署的事实标准。
| 维度 | 说明 |
|---|---|
| 并发性能 | 单进程可轻松处理数万并发连接,适合突发流量与高 I/O 场景 |
| 静态服务效率 | 零拷贝(sendfile)、内存映射(mmap)等机制使静态文件响应延迟低于 1ms |
| 反向代理灵活性 | 支持负载均衡(轮询、权重、IP hash)、健康检查、缓存、重写、请求头操作等企业级功能 |
| 资源占用 | 内存常驻约 2–5 MB,远低于 Apache 的 prefork 模式(每连接数十 MB) |
| 配置可维护性 | 声明式语法清晰,模块化结构便于版本控制与 CI/CD 集成 |
以下配置适用于 Ubuntu/Debian 系统,假设项目路径为 /opt/myproject,Gunicorn 通过 Unix 套接字运行:
# /etc/nginx/sites-available/my_django_app upstream django_app { # 推荐:Unix 套接字(同机部署,零网络开销) server unix:/opt/myproject/myproject.sock fail_timeout=0; # 备用:HTTP 连接(跨主机或调试用) # server 127.0.0.1:8001 fail_timeout=0; } server { listen 80; listen [::]:80; server_name example.com www.example.com; # 强制 HTTPS 重定向(启用 SSL 后取消注释) # return 301 https://$server_name$request_uri; # 日志配置 access_log /var/log/nginx/my_django_app.access.log main; error_log /var/log/nginx/my_django_app.error.log warn; # 静态资源服务(Django collectstatic 输出目录) location /static/ { alias /opt/myproject/staticfiles/; expires 1y; add_header Cache-Control "public, immutable"; } # 媒体资源服务(用户上传内容) location /media/ { alias /opt/myproject/mediafiles/; expires 7d; add_header Cache-Control "public"; } # 根路径:反向代理至 Django 应用 location / { proxy_pass http://django_app; proxy_redirect off; # 透传关键请求头 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Forwarded-Port $server_port; # 超时设置(防止长连接阻塞) proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 120s; send_timeout 60s; # 缓冲区优化 proxy_buffering on; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } # 禁止访问敏感路径 location ~ ^/(manage\.py|settings\.py|\.git|\.env|db\.sqlite3) { deny all; } }
# 1. 创建软链接启用站点 sudo ln -sf /etc/nginx/sites-available/my_django_app /etc/nginx/sites-enabled/ # 2. 测试配置语法 sudo nginx -t # 3. 重载配置(不中断服务) sudo systemctl reload nginx # 4. 检查监听状态与日志 sudo ss -tlnp | grep ':80' sudo tail -f /var/log/nginx/my_django_app.error.log
💡 提示:生产环境务必使用
systemctl reload nginx替代restart,确保配置热更新无请求丢失。
Apache HTTP Server 凭借模块化架构、丰富生态与长期企业支持,仍在金融、政务等对稳定性要求极高的场景中广泛使用。其与 Django 的集成主要通过 mod_wsgi 实现进程内托管。
| 维度 | 说明 |
|---|---|
| 稳定性与成熟度 | 25+ 年持续演进,核心模块经过海量生产环境验证 |
| 模块生态 | 超 300 个官方/第三方模块(mod_security、mod_evasive、mod_authnz_ldap 等) |
mod_wsgi 深度集成 |
原生支持 WSGI 协议,提供进程/线程模型、内存隔离、优雅重启等高级特性 |
| 管理工具链 | a2ensite/a2dissite、apache2ctl 等工具大幅降低运维复杂度 |
假设 Python 虚拟环境位于 /opt/myproject/venv,Django 项目名为 myproject:
# /etc/apache2/sites-available/my_django_app.conf <IfModule mod_ssl.c> <VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect permanent / https://example.com/ </VirtualHost> </IfModule> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com # SSL 配置(需先配置证书) SSLEngine on SSLCertificateFile /etc/ssl/certs/example.com.crt SSLCertificateKeyFile /etc/ssl/private/example.com.key SSLCertificateChainFile /etc/ssl/certs/chain.pem # 日志 ErrorLog ${APACHE_LOG_DIR}/my_django_app-error.log CustomLog ${APACHE_LOG_DIR}/my_django_app-access.log combined # 静态资源别名 Alias /static /opt/myproject/staticfiles <Directory /opt/myproject/staticfiles> Require all granted ExpiresActive On ExpiresDefault "access plus 1 year" Header set Cache-Control "public, immutable" </Directory> # 媒体资源别名 Alias /media /opt/myproject/mediafiles <Directory /opt/myproject/mediafiles> Require all granted ExpiresActive On ExpiresDefault "access plus 7 days" Header set Cache-Control "public" </Directory> # WSGI 应用入口 WSGIDaemonProcess my_django_app python-path=/opt/myproject:/opt/myproject/venv/lib/python3.10/site-packages python-home=/opt/myproject/venv WSGIProcessGroup my_django_app WSGIScriptAlias / /opt/myproject/myproject/wsgi.py # Django 项目目录权限 <Directory /opt/myproject/myproject> <Files wsgi.py> Require all granted </Files> </Directory> # 安全加固 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header always set X-Frame-Options "DENY" Header always set X-Content-Type-Options "nosniff" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "no-referrer-when-downgrade" </VirtualHost>
# 1. 启用必要模块 sudo a2enmod wsgi ssl headers expires # 2. 启用站点配置 sudo a2ensite my_django_app.conf # 3. 禁用默认站点(可选) sudo a2dissite 000-default.conf # 4. 语法检查 sudo apache2ctl configtest # 5. 重载服务 sudo systemctl reload apache2 # 6. 查看模块与进程 sudo apache2ctl -M | grep wsgi sudo systemctl status apache2
⚠️ 注意:
mod_wsgi必须与 Django 所用 Python 版本及架构(x86_64/aarch64)严格匹配,推荐使用pip install mod_wsgi编译安装以确保兼容性。
| 评估维度 | 推荐 Nginx 的场景 | 推荐 Apache 的场景 |
|---|---|---|
| 性能与并发 | 高流量网站、API 网关、实时应用(WebSocket 支持更优) | 中小流量、传统 CMS 或遗留系统集成 |
| 部署架构 | 容器化(Docker/K8s)、微服务网关、Serverless 边缘节点 | 物理机/VM 部署、需深度 LDAP/AD 集成、已有 Apache 运维体系 |
| 安全需求 | 需要细粒度速率限制、Bot 检测、WAF 集成(如 Nginx Plus) | 依赖 mod_security 规则引擎、复杂认证链(Kerberos + OAuth) |
| 运维成熟度 | DevOps 团队熟悉 YAML/CI/CD、倾向声明式配置 | 运维团队长期使用 Apache、已有 Ansible/Puppet 模块库 |
| 功能扩展 | 需要原生 gRPC、HTTP/3、动态上游发现 | 需要 mod_perl、mod_php 多语言混部、复杂 RewriteMap |
✅ 行业共识:新项目首选 Nginx;存量 Apache 环境且无性能瓶颈时,无需强行迁移。二者均可通过
nginx + apache混合架构(Nginx 做边缘代理,Apache 做应用服务器)实现优势互补。
无论选用何种 Web 服务器,以下安全配置均为生产环境强制要求:
ECDHE-ECDSA-AES256-GCM-SHA384 等前向保密套件max-age=31536000; includeSubDomains; preload)server_tokens off;(隐藏 Server: nginx/1.18.0)ServerTokens Prod + ServerSignature Off| 防护类型 | Nginx 配置 | Apache 配置 |
|---|---|---|
| 速率限制 | limit_req_zone $binary_remote_addr zone=rate:10m rate=10r/s; + limit_req zone=rate burst=20 nodelay; |
mod_evasive 或 mod_ratelimit |
| 请求体大小 | client_max_body_size 20M; |
LimitRequestBody 20971520 |
| 恶意路径拦截 | `location ~ .(php | htaccess |
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Referrer-Policy: no-referrer-when-downgrade Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;
🔐 审计建议:定期使用 Mozilla Observatory 或 SSL Labs 扫描评分,目标达 A+ 级别。
gzip on; gzip_types text/plain text/css application/json application/javascript;mod_deflate 并配置 AddOutputFilterByType DEFLATElisten 443 ssl http2;Protocols h2 http/1.1Expires + Cache-Control: public, immutable(配合文件哈希命名)sendfile on;:启用内核零拷贝tcp_nopush on;:优化 TCP 包合并worker_processes auto; + worker_connections 1024;:匹配 CPU 核心数event MPM(非 prefork):sudo a2enmod mpm_eventThreadsPerChild 25、MaxRequestWorkers 400、KeepAliveTimeout 5mod_cache + mod_cache_disk 缓存动态响应(需谨慎评估缓存语义)/static/ 与 /media/ 路径 CNAME 至 Cloudflare/AWS CloudFront,启用 Brotli、HTTP/3、边缘规则ManifestStaticFilesStorage,配合 collectstatic 生成哈希文件名,实现永久缓存log_format json '{ "time": "$time_iso8601", "status": "$status", "uri": "$uri", "referer": "$http_referer" }';,接入 ELK/SplunkWeb 服务器配置是 Django 生产部署的基石,其质量直接决定用户体验、系统稳定性与安全水位。Nginx 凭借性能与云原生友好性成为现代部署首选,Apache 则在企业级合规与复杂集成场景中持续发挥价值。关键不在于工具之争,而在于:
✅ 遵循安全基线 —— 强制 HTTPS、最小权限、安全头、定期审计
✅ 践行性能准则 —— 动静分离、合理缓存、连接复用、资源压缩
✅ 建立可观测性 —— 结构化日志、指标监控(Nginx stub_status / Apache mod_status)、告警闭环
完成本节配置后,Django 应用已具备生产就绪的网络接入能力。下一节将深入探讨 9.3 进程管理与服务守护(Supervisor / systemd / Docker),确保 Django 应用进程的高可用与自愈能力。