python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python WSGI HTTP服务器Gunicorn

Python WSGI HTTP服务器Gunicorn使用详解

作者:AI手记叨叨

Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处理并发请求,需优化参数并确保生产环境安全

一、什么是 Gunicorn?

Gunicorn是一个纯Python的WSGI HTTP服务器,用于运行Python Web应用程序。它简单易用,性能良好,是部署Flask、Django等WSGI兼容应用的流行选择。

WSGI是 Python 定义的一个标准接口,用于规范 Web 服务器(如 Nginx、Apache)与 Python Web 应用(如 Flask、Django)之间的通信方式。

它的核心作用是让不同的 Web 服务器和 Python Web 框架能够无缝协作。

二、为什么需要Gunicorn?

开发服务器(如Flask内置的app.run())虽然方便,但有严重限制。

特性开发服务器Gunicorn
并发处理单线程多worker进程
性能低(约每秒几十个请求)高(可处理数千请求)
稳定性不适合长时间运行生产级稳定性
配置选项有限丰富的调优选项
请求队列智能请求队列管理

三、安装Gunicorn

pip install gunicorn

四、基本使用

启动最简单的Gunicorn服务器

假设你的Flask应用主文件是app.py,其中包含一个名为app的Flask实例:

gunicorn -w 4 -b 127.0.0.1:8000 app:app

参数说明

app = Flask(__name__)  # 这个变量名`app`就是第二个`app`所指的对象

如果你的文件是myapp.py且实例变量名为application,则命令应为:

gunicorn -w 4 -b 127.0.0.1:8000 myapp:application

常用命令行参数

参数说明示例
-w, --workersworker进程数-w 4
-b, --bind绑定地址和端口-b 0.0.0.0:8000
-k, --worker-classworker类型-k gevent
--timeoutworker超时时间(秒)--timeout 120
--log-level日志级别--log-level debug
--access-logfile访问日志文件--access-logfile - (输出到stdout)
--error-logfile错误日志文件--error-logfile - (输出到stdout)

五、Worker类型

Gunicorn支持多种worker类型,适用于不同场景:

选择建议

gunicorn -k gevent -w 4 app:app

六、配置文件

对于更复杂的配置,可以使用配置文件(通常命名为gunicorn.conf.py):

# gunicorn.conf.py

bind = "0.0.0.0:8000"
workers = 4
worker_class = "gevent"
timeout = 120
accesslog = "-"  # 输出到stdout
errorlog = "-"   # 输出到stdout

然后使用配置文件启动:

gunicorn -c gunicorn.conf.py app:app

七、与Flask结合实践

1. 项目结构建议

myapp/
├── app/              # 应用包
│   ├── __init__.py   # 创建app实例
│   ├── views.py      # 路由和视图
│   └── ...
├── gunicorn.conf.py  # Gunicorn配置
└── wsgi.py           # WSGI入口点

2. 创建WSGI入口文件

wsgi.py内容:

from app import create_app  # 假设你的app工厂函数名为create_app

app = create_app()

if __name__ == "__main__":
    app.run()

3. 使用Gunicorn启动

gunicorn -c gunicorn.conf.py wsgi:app

八、性能调优

Worker数量计算

经验公式:

workers = (2 * CPU核心数) + 1

内存考虑

每个worker都会加载完整的Python应用,确保服务器有足够内存:

总内存 ≈ (worker数量 × 单个worker内存) + 系统开销

超时设置

根据应用响应时间调整:

timeout = 120  # 秒

九、日志配置

访问日志

accesslog = "/var/log/gunicorn/access.log"
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

错误日志

errorlog = "/var/log/gunicorn/error.log"
loglevel = "info"
capture_output = True  # 捕获stdout/stderr

十、常见问题解决

Worker超时

错误信息:

[CRITICAL] WORKER TIMEOUT

解决方案:

内存泄漏

现象:内存使用持续增长

解决方案:

502 Bad Gateway

可能原因:

检查步骤:

十一、高级特性

开发时自动重载代码变化,但生产环境中不建议使用这个功能,因为它会影响性能。

gunicorn --reload app:app

十二、监控与维护

pstree -ap | grep gunicorn
kill -HUP <master_pid>
kill -TERM <master_pid>

十三、生产环境建议

十四、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文