在完成 Flask 应用的开发后,我们需要将其部署到生产环境并保障安全性。本章将涵盖:
- 如何部署 Flask 应用
- 使用 WSGI 服务器
- Nginx 反向代理
- 使用 Docker 部署
- HTTPS 配置
- 常见安全风险及防护措施
12.1 Flask 部署方式概览
Flask 运行在 开发服务器 上,但生产环境推荐使用更稳定的 WSGI 服务器,如:
- Gunicorn(适用于 Linux)
- uWSGI(适用于高性能需求)
- Docker 部署
- 云服务(如 AWS, GCP, 阿里云等)
12.2 使用 Gunicorn 部署 Flask
Gunicorn 是一个高性能的 WSGI 服务器,适用于生产环境。
12.2.1 安装 Gunicorn
pip install gunicorn
12.2.2 启动 Flask 应用
gunicorn -w 4 -b 0.0.0.0:8000 app:app
- -w 4:使用 4 个 worker 进程
- -b 0.0.0.0:8000:监听所有 IP 的 8000 端口
12.2.3 配置 Systemd 让 Flask 后台运行
在 /etc/systemd/system/flask.service 创建以下内容:
[Unit]
Description=Gunicorn instance to serve Flask appAfter=network.target
[Service]
User=www-dataGroup=www-dataWorkingDirectory=/home/ubuntu/myflaskappExecStart=/usr/local/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app
[Install]
WantedBy=multi-user.target
启动 Flask:
sudo systemctl start flask
sudo systemctl enable flask
12.3 Nginx 反向代理
使用 Nginx 将流量转发到 Gunicorn,提高 Flask 访问速度。
12.3.1 安装 Nginx
sudo apt update
sudo apt install nginx
12.3.2 配置 Nginx
在 /etc/nginx/sites-available/flask 添加:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
激活配置:
sudo ln -s /etc/nginx/sites-available/flask /etc/nginx/sites-enabled
sudo systemctl restart nginx
12.4 使用 Docker 部署 Flask
Docker 可以封装 Flask 及其所有依赖,使部署更便捷。
12.4.1 创建 Dockerfile
FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
12.4.2 构建和运行容器
docker build -t myflaskapp .
docker run -d -p 8000:8000 myflaskapp
12.5 配置 HTTPS
为了确保安全,推荐使用 Let's Encrypt 配置 HTTPS。
12.5.1 安装 Certbot
sudo apt install certbot python3-certbot-nginx
12.5.2 生成 SSL 证书
sudo certbot --nginx -d example.com
12.6 Flask 安全防护
Flask 内置多个安全机制,但仍需额外防护以下攻击:
- SQL 注入
- XSS(跨站脚本攻击)
- CSRF(跨站请求伪造)
- Cookie 安全
12.6.1 防止 SQL 注入
Flask-SQLAlchemy 使用参数化查询,避免 SQL 注入:
user = User.query.filter_by(username=request.args.get('username')).first()
12.6.2 防止 XSS
Flask 默认转义 HTML,避免 XSS 攻击:
{{ user_input }}
如果确实需要渲染 HTML,需要 safe 过滤:
{{ user_input | safe }}
12.6.3 防止 CSRF
使用 Flask-WTF 保护表单:
pip install flask-wtf
在 config.py 配置 CSRF 保护:
SECRET_KEY = 'your-secret-key'
WTF_CSRF_ENABLED = True
表单示例:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
submit = SubmitField('Submit')
12.6.4 保护 Cookie
使用 secure 和 HttpOnly 选项:
app.config['SESSION_COOKIE_SECURE'] = True # 仅允许 HTTPS
app.config['SESSION_COOKIE_HTTPONLY'] = True # 仅允许服务器访问
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # 防止 CSRF
12.7 结语
本章介绍了 Flask 的生产环境部署 及 安全防护措施,确保应用稳定运行。在实际项目中,推荐结合 Docker、Gunicorn、Nginx、HTTPS,并加强安全防护,防止 SQL 注入、XSS 和 CSRF 攻击。
至此,Flask系列已完整覆盖 Flask 的各项功能与实战技巧,希望与各位优秀码农的一起进步!
欢迎留言讨论
【完】