Gunicorn工具
Gunicorn(Green Unicorn)是一个 Python WSGI(Web Server Gateway Interface)HTTP 服务器,用于在生产环境中运行 Python Web 应用程序。它设计为轻量级、高效且易于使用,能够与多种 Python Web 框架(如 Django、Flask 等)无缝集成。这里主要介绍与Django项目的集成,实现Django后端项目的生产环境部署。
特点
- 高性能:采用预派生(pre-fork)的工作模式,能够处理大量并发请求,充分利用多核 CPU 的性能。
- 多种工作进程类型:支持多种工作进程类型,如同步(sync)、异步(gevent、eventlet)等,可根据应用的特点选择合适的工作进程类型。
- 易于配置:提供了丰富的配置选项,可以通过命令行参数或配置文件进行灵活配置。
- 热重启:支持热重启功能,在不中断服务的情况下更新应用程序代码。
- 稳定性:经过大量生产环境的验证,具有较高的稳定性和可靠性。
工作原理
Gunicorn 采用预派生(pre-fork)模型,主进程(master process)负责监听指定的地址和端口,接收客户端的请求。当有新的请求到来时,主进程会将请求分配给一个工作进程(worker process)进行处理。工作进程是预先创建好的,数量可以通过配置进行调整。每个工作进程都是独立的,它们可以并行处理请求,从而提高应用程序的并发处理能力。
Gunicorn的使用
Gunicorn支持两种参数传递方式,一种是命令行启动附带参数,一种是使用配置文件传递启动参数
1. 安装Gunicorn
首先,在我们的python运行环境中安装gunicorn
pip install gunicorn
2. 相关环境配置
# 添加app至Django配置文件中
# setting.py -> INSTALLED_APPS
INSTALLED_APPS = [
...
'gunicorn',
]
3. 命令行直接运行Gunicorn
# 在manage.py 同级目录下执行命令,注:book是项目名
gunicorn project_name.wsgi -b 127.0.0.1:8000
# project_name 项目名称
# -b 127.0.0.1 允许访问的主机IP,这里表示只允许本机访问
# 如果不使用反向代理,想要部署在公网,这里应改为0.0.0.0
# 8000 监听的端口,如果提示被占用了可以自行更换
其他额外的参数
-w 设置工作进程的数量,通常建议为(2 * CPU核心数 + 1)
-k 指定工作进程的类型。可选择的有
- sync:默认的同步工作进程类型,一次只能处理一个请求,适合CPU密集型应用
- gevent:基于gevent库的异步工作进程类型,使用协程来处理并发请求,适合I/O密集型应用
- eventlet:异步工作进程类型,基于eventlet库
--access-logfile:指定访问日志文件的路径。访问日志记录了客户端的请求信息,如请求的 URL、状态码等。如果设置为 -,则将日志输出到标准输出。
--log-file:指定错误日志文件的路径。错误日志记录了服务器运行过程中出现的错误信息。如果设置为 -,则将日志输出到标准错误输出。
--log-level:设置日志的级别,常见的级别有 debug、info、warning、error、critical。级别越高,记录的日志信息越精简。
--timeout:设置工作进程的超时时间(单位为秒)。如果一个工作进程在指定时间内没有响应,Gunicorn 会将其杀死并重新启动一个新的工作进程。
--keep-alive:设置保持连接的时间(单位为秒)。在这个时间内,服务器会保持与客户端的连接,以便处理后续的请求。
--daemon:以守护进程的方式运行 Gunicorn,即让 Gunicorn 在后台运行。
--pid:指定保存 Gunicorn 主进程 ID 的文件路径。通过这个文件可以方便地管理 Gunicorn 进程,如停止、重启等。
4. 使用配置文件传递运行参数
在manage.py同级文件夹下创建配置文件,文件名任意(一般都创建为genicorn.conf.py)
注意:位置不能出错,不然在运行的时候程序找不到配置文件
vim gunicorn.conf.py
# gunicorn_config.py
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '0.0.0.0:8000' # 绑定ip和端口号
# backlog = 500 # 监听队列
timeout = 60 # 超时
worker_class = 'gevent' # 使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1 # 进程数
threads = 2 # 指定每个进程开启的线程数
loglevel = 'info' # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 设置日志格式
accesslog = "./log/gunicorn_access.log" # 访问日志文件
errorlog = "./log/gunicorn_error.log" # 错误日志文件
基于配置文件传参运行Gunicorn
gunicorn -c gunicorn.conf.py project_name.wsgi:application
# -c指定配置文件
5. 运行成功后的相关事宜
- 如何查看运行是否成功
- 查看进程
- 查看端口号
- curl 测试web网站连通性
- 进一步使用nginx反向代理保护源IP地址或者实现高可用和负载均衡
- 使用systemd管理Gunicorn的启动
- 步骤一:书写配置文件genicorn.service
- 步骤二:使用systemctl设置开机自启