Flask部署入门:Gunicorn与Nginx配置教程

一、为什么需要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()

三、安装必要工具

  1. 安装Gunicorn(WSGI服务器):
   pip install gunicorn
  1. 安装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:appapp是模块名(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配置开机自启:

  1. 创建systemd服务文件:
   sudo nano /etc/systemd/system/gunicorn.service
  1. 写入以下内容(替换路径和参数):
   [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
  1. 启动并设置开机自启:
   sudo systemctl start gunicorn
   sudo systemctl enable gunicorn  # 开机自启

八、常见问题排查

  1. 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

  2. 静态文件无法加载
    - 确认location /staticalias路径是否正确(如/home/ubuntu/myapp/static
    - 重启Nginx:sudo systemctl restart nginx

总结

通过Gunicorn作为WSGI服务器运行Flask应用,结合Nginx作为反向代理,即可实现生产级别的部署。核心步骤是“启动Gunicorn → 配置Nginx转发请求”,后续可通过HTTPS、负载均衡等进一步优化。

Xiaoye