Nginx + gunicorn + Flask 快速部署实现上线水平
发布日期:2021-05-10 07:23:09 浏览次数:12 分类:精选文章

本文共 2726 字,大约阅读时间需要 9 分钟。

使用Nginx、Gunicorn和Flask构建高效稳定的后端接口

在部署Django项目时,我曾遭遇过严重的内存泄漏问题,这迫使我放弃了Nginx + uwsgi的架构。经过仔细考虑,我决定采用Gunicorn作为应用服务器搭配Flask,这种组合在性能和可靠性上表现优异。

首先,我为项目安装所需的库:

pip3 install flask flask_restful gunicorn

接下来,我按照以下代码结构编写了一个基础的接口示例。这个例子结合了Flask和flask_restful,满足了基本的HTTP接口需求。

from flask import Flask, request, jsonifyfrom flask_restful import reqparse, Resource, Apifrom functools import wrapsapp = Flask(__name__)api = Api(app)class Task1(Resource):    @wraps(request)    def get(self):        parser = reqparse.RequestParser()        parser.add_argument("url", type=str, location="args", required=False)        parser.add_argument("type", type=int, location="args", required=False)        parser.add_argument("id", type=str, location="args", required=False)        params = parser.parse_args()                if params['url'] == "/about":            return jsonify({"message": "访问了关于我们页面"})        return jsonify({"message": "欢迎访问vulncn"})

如需更复杂的功能,可参考完整代码:

from flask import Flask, request, jsonifyfrom flask_restful import reqparse, Resource, Apifrom functools import wrapsapp = Flask(__name__)api = Api(app)class Task1 Resource):    @wraps(request)    def get(self):        parser = reqparse.RequestParser()        parser.add_argument("url", type=str, location="args", required=False)        parser.add_argument("type", type=int, location="args", required=False)        parser.add_argument("id", type=str, location="args", required=False)        params = parser.parse_args()                if params['action'] == 'fresh':            return 'vuln.cn demo 1'        else:            return 'hello vuln.cn'class Task2 Resource):    @wraps(request)    def get(self):        parser = reqparse.RequestParser()        parser.add_argument("id", type=str, location="args", required=False)        params = parser.parse_args()        return 'vuln.cn demo 2'api.add_resource(Task1, '/demo1/')api.add_resource(Task2, '/demo2/')

启动Flask应用时可使用以下命令:

flask run -h 0.0.0.0 -p 5000 --reload

为了提高生产环境的稳定性和性能,接下来我配置了Gunicorn:

gunicorn -b 0.0.0.0:8000 --reload app:app --workers 4 --timeout 120

这里,--workers 4设置了4个工作进程,--timeout 120为每个请求设置120秒超时。

为了确保Gunicorn的高效运行,建议配合使用进程管理工具如syslogPrometheus,并定期收集性能指标。

最后,为了提升静态资源的加载速度,我配置了Nginx作为反向代理:

server {    listen 80;    server_name yourdomain.com;        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;        access_log /var/log/nginx/access.log;    }    location /static {        alias /path/to/your/static;        autoindex on;    }}

通过以上配置,我成功实现了一个高性能、稳定的接口系统。这不仅解决了原有的内存泄漏问题,还显著提升了系统的负载能力和可靠性。

上一篇:如何用Python操作数据库
下一篇:Flask中请求勾子

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月26日 00时41分01秒