生产部署需用Nginx+Gunicorn组合:安全组仅放行80/443,Gunicorn绑定127.0.0.1:8000,Nginx proxy_pass与之匹配,关闭Flask的app.run和debug,确保文件权限属Nginx用户。

直接上手就能跑通,不需要宝塔、不依赖 Docker,用原生 Nginx + Gunicorn 就够用。关键不是“装什么”,而是“端口开对没、host 绑对没、反向代理转发对没”——这三处错一个,curl http://你的IP 就 502 或超时。
安全组必须放行 80 和 443,别只开 5000
很多新手在 Flask 本地调试时习惯 app.run(host='0.0.0.0', port=5000),然后以为只要开放 5000 端口就行。这是错的:生产环境不该直接暴露 Flask 内置服务器,Nginx 才是面向公网的入口,它只走 80/443;Gunicorn 在内网监听比如 8000,不对外暴露。
所以安全组里只需确保:
- 入方向放行 TCP 80(HTTP)和 443(HTTPS),其他端口一律关闭
- 5000、8000 这类后端端口 不要加到安全组,否则等于绕过 Nginx 直连 Flask,有严重安全隐患
- SSH(22)保留,但建议改非标端口或限制 IP 段
Nginx 反向代理配置要匹配 Gunicorn 绑定地址
常见错误是 Nginx 的 proxy_pass 指向 http://127.0.0.1:5000,但 Gunicorn 实际监听的是 127.0.0.1:8000 —— 或者反过来,Gunicorn 启动时没加 --bind 127.0.0.1:8000,默认绑了 0.0.0.0:8000,导致被误扫或冲突。
正确做法:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- Gunicorn 启动命令必须显式指定内网地址:
gunicorn -w 2 -b 127.0.0.1:8000 app:app - Nginx 配置中
proxy_pass必须与之一致:proxy_pass http://127.0.0.1:8000; - 检查 Nginx 配置语法:
nginx -t,重载:systemctl reload nginx
Flask 的 host 和 debug 必须关掉
开发时写的 app.run(host='0.0.0.0', port=5000, debug=True) 是毒药,绝不能出现在生产启动逻辑里。Gunicorn 会接管运行,app.run(...) 这行代码要么删掉,要么用 if __name__ == '__main__': 包住并确保不执行。
否则会出现两个问题:
- Gunicorn 启动后,Flask 自己又起一个 werkzeug server,端口冲突或响应混乱
-
debug=True会暴露代码路径、变量内容,线上等于送漏洞 - 确认方式:启动后执行
ps aux | grep flask,只应看到 gunicorn 进程,不应有 python app.py 进程
最易忽略的一点:Nginx 默认用户是 www-data(Ubuntu)或 nginx(CentOS),但你的 Flask 项目文件权限如果只给了 root 或普通用户,Nginx worker 就读不了静态文件、也加载不了 Python 模块。部署前务必执行:chown -R www-data:www-data /path/to/your/project(Ubuntu)或对应用户组。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










