Flask/Django 生产部署:Gunicorn vs Nginx,Windows 与 Linux 实战指引

TL;DR

  • Gunicorn:Python WSGI 应用服务器,运行 Flask/Django(Linux 用)。
  • Nginx:反向代理/网关(TLS、静态、限流、缓存、IP 过滤),不运行 Python。
  • Windows:不要用 Gunicorn,用 Waitress;如需 Gunicorn,用 WSL2/Docker。
  • Linux:标准做法 Nginx → Gunicorn(多 worker)→ 应用。

1. 角色与分工

  • Gunicorn(应用服务器):多进程/线程、连接处理、超时、重启、日志;负责把 Python 应用跑起来。
  • Nginx(反向代理/网关):TLS、静态文件、缓冲/抗慢连接、压缩、缓存、限流、负载均衡、黑白名单。
  • 常见拓扑:互联网 → Nginx → Gunicorn → Flask/Django。

2. Windows 部署(Gunicorn 不支持)

2.1 单机/内网(最简)

  • Waitress(WSGI) 直接运行 Flask/Django。
# run_waitress.py
from app import create_app
from waitress import serve
app = create_app()
if __name__ == '__main__':serve(app, host='0.0.0.0', port=5000, threads=8)

2.2 多实例 + 负载(推荐)

  • 启多个 Waitress 实例(不同端口),前置 Nginx/Caddy/IIS 做负载均衡。
# 启动 4 个实例:5001..5004
1..4 | % { Start-Process python -ArgumentList "run_waitress.py --port $([int](5000+$_))" }
  • Nginx(Windows)示例:
upstream backend {server 127.0.0.1:5001;server 127.0.0.1:5002;server 127.0.0.1:5003;server 127.0.0.1:5004;keepalive 64;
}
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_pass http://backend;}
}
  • Caddy(更易用):
:80 {reverse_proxy 127.0.0.1:5001 127.0.0.1:5002 127.0.0.1:5003 127.0.0.1:5004
}
  • 守护与自启动:用 NSSM 把每个实例注册为 Windows 服务。

2.3 想用 Gunicorn?

  • WSL2 或 Docker 内运行 Linux 栈:Nginx + Gunicorn + 应用;Windows 侧通过端口映射访问。

3. Linux 部署(标准做法)

3.1 单服务多 worker(最常用)

  • 启动(Flask 工厂函数):
pip install gunicorn
gunicorn 'app:create_app()' -b unix:/run/cbs/app.sock -w 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
# 或 -b 127.0.0.1:5000;workers≈2*CPU+1,I/O 多可加 --threads 或 -k gevent
  • systemd:
[Unit]
Description=CBS via Gunicorn
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/srv/cbs
ExecStart=/srv/cbs/venv/bin/gunicorn 'app:create_app()' --bind unix:/run/cbs/app.sock --workers 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
  • Nginx:
upstream backend { server unix:/run/cbs/app.sock; keepalive 64; }
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_http_version 1.1;proxy_set_header Connection "";proxy_pass http://backend;}
}
  • 平滑重载:systemctl reload cbs.service 或向 master 发送 HUP

3.2 多 Gunicorn master + 负载(更强隔离)

  • 启两个 socket,Nginx upstream 负载;便于滚动升级与故障隔离。

3.3 Django 说明

  • 启动目标改为 myproject.wsgi:application;静态资源 collectstatic 后由 Nginx 下发。

4. 调优与实践要点

  • 分工:静态、TLS、缓冲、限流交给 Nginx;业务交给应用服务器。
  • 并发模型:CPU 密集——多 worker;I/O 多——加 --threads-k gevent
  • 超时:Gunicorn --timeout 与 Nginx proxy_read_timeout 对齐。
  • 预加载--preload + CoW 可省内存(确认初始化无副作用)。
  • 真实 IP:只信任边界代理注入的 X-Forwarded-For/X-Real-IP
  • 守护:Windows 用 NSSM;Linux 用 systemd;容器用 Compose/K8s。

5. FAQ

  • 后端“用 Gunicorn 代理还是 Nginx 代理”?
    • 说法不准确:Gunicorn 运行应用,Nginx 才是代理。生产推荐二者搭配。
  • Windows 一定要 Nginx 吗?
    • 不是必须;内网可直连 Waitress。需要 TLS/限流/负载时再加 Nginx/Caddy/IIS。
  • 非得用 Gunicorn 又是 Windows?
    • WSL2/Docker 跑 Linux 栈。

  • 小结
    • Windows:Waitress 多实例 + Nginx/Caddy/IIS;Gunicorn 走 WSL2/Docker。
    • Linux:Nginx + Gunicorn,多 worker 或多 master 皆可;用 systemd 管理与平滑重载。
    • 关键:网关层与应用层分工明确,按并发特性选择 worker/threads,统一处理真实 IP。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96326.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96326.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96326.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 优化与防盗链全解析:从性能调优到资源保护

Nginx 优化与防盗链全解析:从性能调优到资源保护 文章目录Nginx 优化与防盗链全解析:从性能调优到资源保护一、基础安全优化:隐藏版本号1.1 查看当前版本号1.2 两种隐藏/修改方案方案一:修改配置文件(快速隐藏&#xf…

HOT100--Day20--39. 组合总和,22. 括号生成,79. 单词搜索

HOT100–Day20–39. 组合总和,22. 括号生成,79. 单词搜索 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型:回溯。 关键:掌握排列,组合。记得回溯。可以重复选的话,下一层index从哪里开始&#x…

高并发场景下的“命令执行”注入绕道记

环境:CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景:营销团队上线了一个“图片裁剪”接口,参数直接拼进 shell_exec,结果被打成“矿机”。1. 发现:流量突增 30 倍,却不见数据库慢查询 iftop -i eth0出站 1.8…

【modbus学习】

Modbus通信(源于施耐德)串行链路:RTU(传输大量数据,适合工业)、ASCII(少量数据,适合计算机)TCP/IP:TCP(传输严谨,效率低)、…

Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令,但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序,那么redis就只有一个服务器,但是有多个客户端,就像mysql一…

前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南

在如今高度互联的 Web 应用世界里,前端安全不再是可有可无的选项,而是构建可信赖、健壮应用的基石。随着 Web 技术的发展,攻击者们也变得越来越狡猾,前端遭受的攻击手段层出不穷。其中,跨站脚本攻击 (XSS) 和跨站请求伪…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 移除低方差特征(VarianceThreshold)

锋哥原创的Scikit-learn Python机器学习视频教程: 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据…

C#(链表创建与原地反转)

链表创建(C#) 在C#中,链表可以通过自定义节点类实现。每个节点包含数据域和指向下一个节点的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源码导入Android Studio

AOSP代码量庞大,为了开发的方便,我们需要导入到android studio中,其中关键的一 项就是配置跳转。尤其是对于Framework开发来说生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh会生成如下文件首先需要修改ipr和iml文件…

游戏中的设计模式——第一篇 设计模式简介

前言 对于设计模式,相信很多开发者并不陌生,我在学习过程中希望把自己的一些总结和心得体会与你分享。 本专栏主要将重点放在设计模式在游戏中的应用,会结合大家熟悉的游戏场景和功能阐述设计模式在该处应用的好处。因为设计模式很多&#xf…

SpringBoot + RustFS 实现文件切片极速上传技术

本文将手把手教你如何通过 SpringBoot 和 RustFS 构建高性能文件切片上传系统,解决大文件传输的痛点,实现秒传、断点续传和分片上传等高级功能。 目录 一、为什么选择 RustFS SpringBoot? 二、环境准备与部署 2.1 安装 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切换英文段落大小写

在Word和WPS文字中编辑英文段落时,有时候英文字母的大小写不规范,或者需要把某一段全部改为大写字母怎么办?使用ShiftF3组合键即可快速在三种模式中切换:全部大写、全部小写、首字母大写——其中首字母大写的Word是每一句话的第一…

成都金牛区哪里租好办公室?国际数字影像产业园享税收优惠

在成都金牛区租赁优质办公室,国际数字影像产业园凭借其享有的税收优惠政策,成为了许多企业的首选之地。税收优惠对于租赁办公室的企业来说,是一笔不小的成本节省。国际数字影像产业园针对入驻企业提供的税收优惠政策,能在企业运营…

CSS `:is()` `:where()` 实战指南:简化选择器,提升可维护性

🎯 CSS :is() & :where() 实战指南:简化选择器,提升可维护性你是否在项目中写过一大串重复的选择器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }这样的代码既冗长又难维护。 现在 CSS 提供了 :is() 和…

Linux I/O 访问架构深入分析

Linux I/O 访问架构深入分析 目录 概述I/O 架构层次核心数据结构I/O 处理流程VFS 虚拟文件系统块设备I/O字符设备I/O内存映射I/O异步I/O机制I/O调度器调试工具与方法性能优化策略 概述 Linux I/O 系统是一个多层次、高度抽象的架构,旨在为应用程序提供统一的文件访问…

Linux:6_基础IO

基础IO 一.理解"文件" 文件分类 1.内存级(被打开)文件 2.磁盘级文件 1. 狭义理解 文件在磁盘里磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的磁盘是外设 (即是输出设备也是输入设备)磁盘上的文件本质是对文件的所有操作,都是对外…

Coze源码分析-资源库-删除插件-前端源码-核心逻辑

删除插件逻辑 1. 删除操作入口组件 删除插件操作主要通过 usePluginConfig hook 中的 renderActions 方法实现,该方法返回 TableAction 组件来处理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地状态(Flink 1.x)

最初的架构将状态以 JVM Heap 对象的形式存储在 TaskManager 的内存中。对于小规模数据集,这种方式效果良好,但随着状态大小的增长超出内存,将所有状态保存在内存中变得成本高昂且不稳定。 为了解决状态规模增长的问题,引入了一种…

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南 关键词:印度股票数据对接 NSE实时行情 BSE证券接口 金融API开发 Python请求示例一、印度股市数据源技术解析(核心价值) 印度两大交易所数据获取难点: 时区差异&a…

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) AFSim介绍 AFSim(Advanced Framework for Simulation Integration & Modeling【高级仿真集成与…