Windows 部署项目 apache + mod_wsgi,nginx + waitress

发布于:2025-04-14 ⋅ 阅读:(21) ⋅ 点赞:(0)


有些项目必须部署在windows上,有IIS + wfastcgi、apache + mod_wsgi,nginx + waitress部署方式

1、apache + mod_wsgi,nginx + waitress两种部署方式的区别

  • 服务器性能
apache + mod_wsgi:Apache 是一款成熟的服务器软件,具有丰富的功能和模块。mod_wsgi模块将 Apache 与 Python 的 WSGI 应用(如 Django 项目)集成。不过,Apache 在处理大量并发请求时,资源消耗相对较高,性能可能会受到一定限制。
nginx + waitress:Nginx 以高性能、轻量级和处理高并发能力强著称。Waitress 是一个纯 Python 的 WSGI 服务器,性能较为出色。Nginx 可以作为反向代理服务器,将请求转发给 Waitress 处理,这种组合在处理高并发请求时表现更优,能够提供更好的性能和响应速度。
  • 配置复杂度
apache + mod_wsgi:Apache 的配置相对复杂,有大量的配置指令和模块需要理解和配置。配置mod_wsgi时,需要正确设置 WSGI 应用的相关参数,如 Python 路径、项目路径等,配置文件可能会比较冗长,对于初学者来说上手难度较大。
nginx + waitress:Nginx 的配置相对简洁明了,其配置文件结构清晰,主要包括服务器块、位置块等。Waitress 的配置相对简单,只需要指定端口、WSGI 应用等基本信息。整体来说,nginx + waitress的配置更容易理解和掌握,降低了部署的难度。
  • 稳定性
apache + mod_wsgi:Apache 经过了长期的发展和广泛的应用,具有较高的稳定性。mod_wsgi模块也比较成熟,在正确配置和维护的情况下,能够稳定地运行 Django 项目。不过,由于 Apache 的复杂性,某些配置不当或模块冲突可能会导致稳定性问题。
nginx + waitress:Nginx 以稳定性著称,在处理高并发和长时间运行时表现出色。Waitress 作为一个轻量级的 WSGI 服务器,也具有较好的稳定性。两者结合使用时,能够提供可靠的服务,并且在出现问题时,由于配置相对简单,更容易排查和解决问题。
  • 灵活性
apache + mod_wsgi:Apache 拥有丰富的模块和功能,可以通过各种模块实现诸如身份验证、访问控制、URL 重写等复杂功能。mod_wsgi也提供了一些配置选项来满足不同的部署需求。然而,由于其复杂性,在进行一些特殊配置或功能扩展时,可能需要深入了解 Apache 的内部机制。
nginx + waitress:Nginx 同样具有很强的灵活性,它可以方便地配置反向代理、负载均衡、SSL/TLS 加密等功能。Waitress 虽然功能相对较为单一,但作为 WSGI 服务器,能够很好地与 Django 项目集成。在nginx + waitress的组合中,可以通过 Nginx 的配置来灵活地调整服务器的行为,以适应不同的项目需求。
  • 资源占用
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证书、静态文件及媒体文件
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
  下载  `pip install waitress`
  使用 在django项目的根目录创建run.py(文件名随意)
# 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 来启动


网站公告

今日签到

点亮在社区的每一天
去签到