使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。
目录
- Flask 项目简介
- 环境准备
- Gunicorn 配置
- 使用 Systemd 管理 Gunicorn 服务
- 配置 Nginx 作为反向代理
- 配置防火墙
- 使用 SSL 启用 HTTPS(可选)
- 总结
1. Flask 项目简介
假设你已经有了一个简单的 Flask 应用。如果还没有,你可以使用以下代码创建一个简单的 Flask 项目:
python
# 文件名: app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, this is a Flask app!'
if __name__ == '__main__':
app.run()
这个项目的目标是通过 Nginx 和 Gunicorn 将它部署到生产服务器上,确保它能够高效处理请求,并且在服务器重启时自动启动。
2. 环境准备
在开始部署之前,确保你的服务器已经安装了以下组件:
步骤 1:更新服务器并安装 Python 和 pip
bash
sudo apt update
sudo apt upgrade
sudo apt install python3 python3-pip python3-venv
步骤 2:创建 Python 虚拟环境并激活
在你的项目目录中创建一个虚拟环境,并激活它:
bash
# 进入你的项目目录
cd /path/to/your/flask/project
# 创建虚拟环境
python3 -m venv myenv
# 激活虚拟环境
source myenv/bin/activate
步骤 3:安装 Flask 和 Gunicorn
在激活的虚拟环境下安装 Flask 和 Gunicorn:
bash
pip install flask gunicorn
3. Gunicorn 配置
Gunicorn 是一个 WSGI 服务器,用于运行 Flask 应用,并将其作为后台服务。我们可以通过以下命令启动 Flask 应用:
bash
gunicorn --workers 3 app:app
参数解释:
--workers 3
:表示使用 3 个工作线程来处理请求。app:app
:第一个app
是指app.py
文件的名字,第二个app
是 Flask 应用实例的名字。
4. 使用 Systemd 管理 Gunicorn 服务
为了让 Gunicorn 在服务器启动时自动启动,我们可以使用 Systemd 来管理 Gunicorn 服务。
步骤 1:创建 Gunicorn 服务文件
bash
sudo nano /etc/systemd/system/flask_app.service
在文件中添加以下内容:
ini
[Unit]
Description=Gunicorn instance to serve Flask app
After=network.target
[Service]
User=your_username # 替换为你的服务器用户名
Group=www-data
WorkingDirectory=/path/to/your/flask/project # 替换为你的 Flask 应用目录
ExecStart=/path/to/your/flask/project/myenv/bin/gunicorn --workers 3 --bind unix:flask_app.sock -m 007 app:app
[Install]
WantedBy=multi-user.target
步骤 2:启动 Gunicorn 服务
启动 Gunicorn 服务并将其设置为开机自启:
bash
# 启动服务
sudo systemctl start flask_app
# 设置为开机自启
sudo systemctl enable flask_app
步骤 3:检查 Gunicorn 服务状态
bash
sudo systemctl status flask_app
如果服务启动成功,你应该能看到类似如下的输出:
bash
● flask_app.service - Gunicorn instance to serve Flask app
Loaded: loaded (/etc/systemd/system/flask_app.service; enabled; vendor preset: enabled)
Active: active (running)
5. 配置 Nginx 作为反向代理
Nginx 作为反向代理,将所有来自外部的请求转发到 Gunicorn 来处理。
步骤 1:安装 Nginx
在服务器上安装 Nginx:
bash
sudo apt install nginx
步骤 2:为 Flask 项目创建 Nginx 配置文件
创建 Nginx 配置文件:
bash
sudo nano /etc/nginx/sites-available/flask_app
在文件中添加以下内容:
nginx
server {
listen 80;
server_name your_domain_or_IP; # 替换为你的域名或服务器的IP
# 处理静态文件
location /static/ {
alias /path/to/your/flask/project/static/; # Flask 的静态文件目录
}
# 处理应用的请求
location / {
proxy_pass http://unix:/path/to/your/flask/project/flask_app.sock;
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;
}
# 日志配置(可选)
access_log /var/log/nginx/flask_app.access.log;
error_log /var/log/nginx/flask_app.error.log;
}
步骤 3:激活 Nginx 配置
使用符号链接将配置文件链接到 sites-enabled
:
bash
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled
步骤 4:检查 Nginx 配置是否正确
bash
sudo nginx -t
步骤 5:重启 Nginx
bash
sudo systemctl restart nginx
现在,你可以通过服务器的 IP 或域名来访问你的 Flask 应用了。
6. 配置防火墙
如果你的服务器使用了 UFW 作为防火墙工具,确保允许 Nginx 的 HTTP 和 HTTPS 流量:
bash
sudo ufw allow 'Nginx Full'
7. 使用 SSL 启用 HTTPS(可选)
为了保护用户数据,可以使用 Let's Encrypt 配置免费的 SSL 证书。
步骤 1:安装 Certbot
Certbot 是一个自动化工具,用来获取免费的 SSL 证书:
bash
sudo apt install certbot python3-certbot-nginx
步骤 2:获取 SSL 证书
运行以下命令为你的域名获取 SSL 证书:
bash
sudo certbot --nginx -d your_domain
Certbot 会自动更新你的 Nginx 配置并启用 SSL。
步骤 3:设置证书自动更新
Let's Encrypt 的 SSL 证书默认有效期为 90 天,你可以通过设置自动更新来保持证书有效:
bash
sudo certbot renew --dry-run
8. 总结
通过使用 Gunicorn 和 Nginx ,你可以轻松地将 Flask 项目部署到生产服务器中。Gunicorn 作为 WSGI 服务器处理 Python 请求,Nginx 作为反向代理处理静态文件和请求路由。通过 Systemd ,你可以管理 Gunicorn 服务,确保它在服务器重启时自动启动。最后,通过 Let's Encrypt 配置 SSL 证书,你可以启用 HTTPS 提升安全性。
这种方式适用于小型和中型 Flask 应用的生产环境部署,希望这篇文章能帮助你快速、高效地部署 Flask 项目。