一、为什么需要Gunicorn和Nginx?¶
Flask自带的开发服务器(flask run)仅适合本地调试,不支持高并发且不安全,无法直接对外提供生产级服务。生产环境中通常需要两个工具配合:
- Gunicorn:作为WSGI服务器,负责运行Flask应用,处理客户端请求并返回结果(类似“应用服务器”)。
- Nginx:作为反向代理服务器,负责处理静态资源(如图片、CSS、JS)、负载均衡、SSL加密,并将动态请求转发给Gunicorn(类似“门卫+管理员”)。
二、准备工作¶
假设你已安装Python环境,且有一个简单的Flask应用(以app.py为例,内容如下):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Flask!"
if __name__ == '__main__':
app.run()
三、安装必要工具¶
- 安装Gunicorn(WSGI服务器):
pip install gunicorn
- 安装Nginx(反向代理服务器):
- Ubuntu/Debian:sudo apt-get update && sudo apt-get install nginx
- CentOS/RHEL:sudo yum install nginx
- 检查安装是否成功:nginx -v(显示版本号即成功)
四、启动Gunicorn服务¶
Gunicorn需指定Flask应用的入口和端口,语法如下:
gunicorn [参数] 模块名:Flask实例名
示例:假设Flask应用在app.py中,入口为app(即app = Flask(__name__)),启动Gunicorn:
# 绑定到127.0.0.1:8000,开启4个worker(根据CPU核心数调整,通常为CPU核心数*2+1)
gunicorn -w 4 -b 127.0.0.1:8000 app:app
- 参数解释:
-w 4:指定4个worker进程(w=worker,进程数建议:CPU核心数*2 + 1,避免过多worker导致资源占用过高)。-b 127.0.0.1:8000:绑定地址和端口(仅本地访问,生产环境需暴露公网时需调整,但建议先本地测试)。app:app:app是模块名(app.py),第二个app是Flask实例名(app = Flask(__name__))。
验证Gunicorn:打开浏览器访问http://127.0.0.1:8000,或用命令行测试:
curl http://127.0.0.1:8000 # 应返回 "Hello, Flask!"
五、配置Nginx反向代理¶
Nginx需将客户端请求转发给Gunicorn(即127.0.0.1:8000),并处理静态资源。
1. 创建Nginx配置文件¶
Ubuntu/Debian系统中,Nginx配置文件通常放在/etc/nginx/sites-available/目录下。新建配置文件(如flask_app):
sudo nano /etc/nginx/sites-available/flask_app
2. 编写Nginx配置¶
将以下内容粘贴到配置文件中,替换server_name为你的域名或服务器IP(本地测试用localhost):
server {
listen 80; # 监听80端口(HTTP)
server_name localhost; # 替换为你的域名(如example.com)
# 处理动态请求:转发到Gunicorn
location / {
proxy_pass http://127.0.0.1:8000; # Gunicorn地址
proxy_set_header Host $host; # 传递请求头
proxy_set_header X-Real-IP $remote_addr; # 传递真实IP
}
# 处理静态文件(如CSS、JS、图片):Nginx直接读取本地文件
location /static {
alias /path/to/your/flask/static; # 替换为你的Flask静态文件目录
expires 30d; # 静态文件缓存30天
}
}
注意:若Flask应用无静态文件,可删除location /static块。
3. 启用配置并重启Nginx¶
- 将配置文件软链接到
sites-enabled(Nginx默认加载该目录):
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled/
- 检查配置语法是否错误:
sudo nginx -t # 显示 "syntax is ok" 表示语法正确
- 重启Nginx:
sudo systemctl restart nginx # 或 service nginx restart
六、验证最终效果¶
此时访问服务器IP或域名(如http://localhost),应看到Flask应用返回的“Hello, Flask!”。
七、进阶:Gunicorn进程管理(开机自启)¶
为避免服务器重启后需手动启动Gunicorn,可通过systemd配置开机自启:
- 创建systemd服务文件:
sudo nano /etc/systemd/system/gunicorn.service
- 写入以下内容(替换路径和参数):
[Unit]
Description=Gunicorn instance to serve Flask app
After=network.target
[Service]
User=your_username # 替换为实际用户名(如ubuntu)
WorkingDirectory=/path/to/your/flask/app # 替换为应用目录
ExecStart=/home/your_username/.local/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app # Gunicorn命令
[Install]
WantedBy=multi-user.target
- 启动并设置开机自启:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn # 开机自启
八、常见问题排查¶
-
Nginx无法转发请求:
- 检查Gunicorn是否运行:ps aux | grep gunicorn
- 检查Nginx端口是否占用:lsof -i:80(若80端口被占用,修改Nginx配置文件的listen参数)
- 检查防火墙:sudo ufw allow 80/tcp(Ubuntu)或sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT -
静态文件无法加载:
- 确认location /static的alias路径是否正确(如/home/ubuntu/myapp/static)
- 重启Nginx:sudo systemctl restart nginx
总结¶
通过Gunicorn作为WSGI服务器运行Flask应用,结合Nginx作为反向代理,即可实现生产级别的部署。核心步骤是“启动Gunicorn → 配置Nginx转发请求”,后续可通过HTTPS、负载均衡等进一步优化。