Flask API生产环境部署流程咨询
Flask API生产环境部署流程咨询
兄弟,我太懂你刚从Spring Boot转Flask的别扭了——毕竟Spring Boot打个Jar扔服务器上就能跑,Flask这边确实得换一套路数。结合你提到的项目情况,我给你唠唠生产环境部署的靠谱流程,都是实际在服务器上跑通的方案:
一、先把项目依赖和环境准备妥当
- 先在本地项目根目录导出所有依赖到
requirements.txt,命令是:pip freeze > requirements.txt,这样服务器上就能一键安装所有需要的包,省得一个个装。 - 服务器上一定要用虚拟环境隔离,避免和系统Python环境冲突,步骤很简单:
- 创建虚拟环境:
python3 -m venv venv - 激活虚拟环境(Linux/macOS):
source venv/bin/activate - 安装项目依赖:
pip install -r requirements.txt
- 创建虚拟环境:
二、用Gunicorn作为WSGI服务器 (核心一步!)
Flask自带的flask run是开发服务器,性能和稳定性都扛不住生产流量,必须用专门的WSGI服务器,Gunicorn是业界标配
- 先安装Gunicorn:
pip install gunicorn - 先测试启动:如果你的Flask应用入口是根目录
app.py里的app对象,命令是:gunicorn -w 4 -b 0.0.0.0:8000 app:app- 给你解释下参数:
-w 4是开4个工作进程(一般按服务器CPU核心数*2+1来设置,比如4核CPU就开9个),-b是绑定的地址和端口,让服务器能对外接收请求。
- 给你解释下参数:
- 做成系统服务(避免你退出终端就停服):
新建一个systemd配置文件/etc/systemd/system/flask-api.service,内容如下:
然后执行这几个命令搞定服务:[Unit] Description=Flask API Service After=network.target [Service] User=你的服务器登录用户名 WorkingDirectory=/你的项目在服务器上的绝对路径(比如/opt/my_flask_api) Environment="PATH=/你的项目路径/venv/bin" ExecStart=/你的项目路径/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app [Install] WantedBy=multi-user.target- 启动服务:
sudo systemctl start flask-api - 设置开机自启(服务器重启后自动跑起来):
sudo systemctl enable flask-api - 查看服务状态(确认没报错):
sudo systemctl status flask-api
- 启动服务:
三、配置Nginx做反向代理 (生产环境标配!)
Nginx能帮你处理静态文件、负载均衡、SSL证书这些杂事,还能把Gunicorn藏在后面,避免直接暴露在外被攻击:
- 先安装Nginx:Debian/Ubuntu用
sudo apt install nginx,CentOS/RHEL用sudo yum install nginx - 新建Nginx配置文件
/etc/nginx/sites-available/flask-api,内容如下:server { listen 80; server_name 你的服务器IP或者公司分配的域名; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $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; } # 如果你的项目有static静态文件目录,加上这段可以让Nginx直接处理静态请求,减轻Gunicorn的压力 location /static { alias /你的项目路径/static; expires 30d; } } - 启用配置并重启Nginx:
- 创建软链接让Nginx识别这个配置:
sudo ln -s /etc/nginx/sites-available/flask-api /etc/nginx/sites-enabled - 测试配置是否有语法错误:
sudo nginx -t - 重启Nginx生效:
sudo systemctl restart nginx
- 创建软链接让Nginx识别这个配置:
四、最后几个关键细节别忘
- 防火墙:记得开放服务器的80端口(如果用HTTPS就开443),比如Ubuntu系统用
sudo ufw allow 80/tcp,CentOS用sudo firewall-cmd --permanent --add-port=80/tcp && sudo firewall-cmd --reload - HTTPS加密:如果需要加密访问,用Certbot给Nginx配置免费的SSL证书,命令是
sudo certbot --nginx,跟着向导点几下就搞定,全自动配置 - 项目入口调整:如果你的Flask app不是在根目录的
app.py里,比如在子模块src/app.py,那Gunicorn的启动命令要改成gunicorn -w 4 -b 0.0.0.0:8000 src.app:app
备注:内容来源于stack exchange,提问作者Dilpreet Singh




