文章目录
-
- [1、apache + mod_wsgi,nginx + waitress两种部署方式的区别](#1、apache + mod_wsgi,nginx + waitress两种部署方式的区别)
- [2、以nginx + waitress为例](#2、以nginx + waitress为例)
有些项目必须部署在windows上,有IIS + wfastcgi、apache + mod_wsgi,nginx + waitress部署方式
1、apache + mod_wsgi,nginx + waitress两种部署方式的区别
- 服务器性能
bash
apache + mod_wsgi:Apache 是一款成熟的服务器软件,具有丰富的功能和模块。mod_wsgi模块将 Apache 与 Python 的 WSGI 应用(如 Django 项目)集成。不过,Apache 在处理大量并发请求时,资源消耗相对较高,性能可能会受到一定限制。
nginx + waitress:Nginx 以高性能、轻量级和处理高并发能力强著称。Waitress 是一个纯 Python 的 WSGI 服务器,性能较为出色。Nginx 可以作为反向代理服务器,将请求转发给 Waitress 处理,这种组合在处理高并发请求时表现更优,能够提供更好的性能和响应速度。
- 配置复杂度
bash
apache + mod_wsgi:Apache 的配置相对复杂,有大量的配置指令和模块需要理解和配置。配置mod_wsgi时,需要正确设置 WSGI 应用的相关参数,如 Python 路径、项目路径等,配置文件可能会比较冗长,对于初学者来说上手难度较大。
nginx + waitress:Nginx 的配置相对简洁明了,其配置文件结构清晰,主要包括服务器块、位置块等。Waitress 的配置相对简单,只需要指定端口、WSGI 应用等基本信息。整体来说,nginx + waitress的配置更容易理解和掌握,降低了部署的难度。
- 稳定性
bash
apache + mod_wsgi:Apache 经过了长期的发展和广泛的应用,具有较高的稳定性。mod_wsgi模块也比较成熟,在正确配置和维护的情况下,能够稳定地运行 Django 项目。不过,由于 Apache 的复杂性,某些配置不当或模块冲突可能会导致稳定性问题。
nginx + waitress:Nginx 以稳定性著称,在处理高并发和长时间运行时表现出色。Waitress 作为一个轻量级的 WSGI 服务器,也具有较好的稳定性。两者结合使用时,能够提供可靠的服务,并且在出现问题时,由于配置相对简单,更容易排查和解决问题。
- 灵活性
bash
apache + mod_wsgi:Apache 拥有丰富的模块和功能,可以通过各种模块实现诸如身份验证、访问控制、URL 重写等复杂功能。mod_wsgi也提供了一些配置选项来满足不同的部署需求。然而,由于其复杂性,在进行一些特殊配置或功能扩展时,可能需要深入了解 Apache 的内部机制。
nginx + waitress:Nginx 同样具有很强的灵活性,它可以方便地配置反向代理、负载均衡、SSL/TLS 加密等功能。Waitress 虽然功能相对较为单一,但作为 WSGI 服务器,能够很好地与 Django 项目集成。在nginx + waitress的组合中,可以通过 Nginx 的配置来灵活地调整服务器的行为,以适应不同的项目需求。
- 资源占用
bash
apache + mod_wsgi:Apache 在运行时会占用较多的系统资源,包括内存和 CPU。特别是在处理大量并发请求时,进程和线程的管理会消耗一定的资源。mod_wsgi模块也会占用一定的内存空间来加载 Python 解释器和 WSGI 应用。
nginx + waitress:Nginx 本身是一个轻量级的服务器,资源占用较少。Waitress 作为 Python 的 WSGI 服务器,相对来说资源消耗也比较低。在处理相同数量的并发请求时,nginx + waitress组合通常比apache + mod_wsgi占用更少的系统资源,能够在有限的硬件资源下提供更好的性能。
2、以nginx + waitress为例
- nginx的下载、安装就不用多说了。nginx 配置 主要是修改nginx目录下的conf/nginx.conf
下面的配置是比较齐全的,包括域名,ssl证书、静态文件及媒体文件
xml
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
http2 on;
# HTTP 重定向(80端口)
server {
listen 80;
server_name www.ruicare.cn;
return 301 https://$server_name$request_uri; # 强制跳转 HTTPS
}
# HTTPS 服务(443端口)
server {
listen 443 ssl;
server_name www.ruicare.cn;
# SSL 证书配置(项目 A 证书)
ssl_certificate E:/Backup/nginx/certificates/ruicare.cn_bundle.crt;
ssl_certificate_key E:/Backup/nginx/certificates/ruicare.cn.key;
# SSL 安全配置(推荐通用配置)
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# 静态文件与媒体文件(项目 A)
location /static/ {
root E:/demotm;
expires 30d; # 静态文件缓存 30天
access_log off; # 关闭静态文件访问日志
}
location /media/ {
root E:/demotm;
expires 30d;
access_log off;
}
# 前端路由处理
location / {
root D:/nginx/html; # 前端打包后的根目录
index index.html; # 默认首页
try_files $uri $uri/ /index.html; # 处理前端路由(如刷新404问题)
# 排除 API 路径,交给后端代理(更推荐用独立的 location /api/ 块)
if ($request_uri !~ ^/api/) { # 非 API 请求,返回前端页面
break;
}
}
# 后端接口代理(项目 A 后端:8090端口)
location /api/ {
proxy_pass http://localhost:8080/api/; # 注意末尾的斜杠,与后端接口前缀匹配
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; # 传递 HTTPS 协议头
# 超时与性能优化
proxy_connect_timeout 10m;
proxy_read_timeout 600s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- 后端使用waitress
bash
下载 `pip install waitress`
使用 在django项目的根目录创建run.py(文件名随意)
python
# run.py
from dltm.wsgi import application
from waitress import serve
serve(application, host='0.0.0.0', port=8080, url_scheme='https')
# 也可配置多线程多进程
启动 直接项目目录下 python run.py 来启动