安装
pip安装
pip install gunicorn
源码安装
pip install git+https://github.com/benoitc/gunicorn.git
与github上的开发保持同步
pip install -U git+https://github.com/benoitc/gunicorn.git
指令
基本用法:
$ gunicorn [OPTIONS] [WSGI_APP]
WSGI_APP
指的是模块名称:变量名称(程序入口)
。模块名称可以是完整的路径。变量名称是指可在指定模块中找到的WSGI可调用项。
OPTIONS
是gunicorn的参数
gunicorn参数
config
指定配置文件,通过配置文件中的参数启动
命令行:-c
或者--config
后面跟配置文件的路径或者python:module_name
gunicorn -c gunicorn.conf test.wsgi # django项目
gunicorn -c gunicorn.conf test:app # flask项目
默认是:./gunicorn.conf.py
wsgi_app
默认: None
模式中的WSGI应用程序路径$(MODULE_NAME):$(VARIABLE_NAME)
。模块名称:变量名称(程序入口)
示例代码
# main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def test():
return 'Hello World'
if '__name__' == '__main__':
app.run()
启动命令
gunicorn -c gunicorn.conf main:app
reload
用于项目修改后自动重启
命令行:--reload
默认 :False
gunicorn -c gunicorn.conf --reload main:app
accesslog
要写入的访问日志文件。'-'
表示登录到标准输出。
命令行: --access-logfile FILE
默认: None
gunicorn --reload --access-logfile gunicorn.log main:app
access_log_format
写入日志的格式。
命令行: --access-logformat 日志格式
默认: '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
errorlog
要写入的错误日志文件。
命令行:--error-logfile FILE
or --log-file FILE
默认: '-'
,使gunicorn日志记录到stderr。
loglevel
日志输出的等级,会将设置等级及以上的信息写入到errorlog
参数指定的文件中。
命令行: --log-level LEVEL
默认: 'info'
gunicorn --reload --log-level error --access-logfile gunicorn.log --error-logfile error.log main:app
有效级别名称为:
'debug'
'info'
'warning'
'error'
'critical'
capture_output
命令行: --capture-output
默认: False
将stdout / stderr重定向到errorlog
中的指定文件。
chdir
命令行: --chdir
默认: '/home/docs/checkouts/readthedocs.org/user_builds/gunicorn-docs/checkouts/latest/docs/source'
加载应用程序之前,将目录更改为指定目录。
daemon
命令行: -D
或--daemon
默认: False
守护Gunicorn进程,进入后台运行
raw_env
命令行: -e ENV
或--env ENV
默认: []
在执行环境中设置环境变量。
应该是key=value
格式的字符串列表。
例如在命令行上:
$ gunicorn -b 127.0.0.1:8000 --env FOO=1 test:app
或在配置文件中:
raw_env = ["FOO=1"]
pidfile
命令行: 或-p FILE``--pid FILE
默认: None
PID文件使用的文件名,会将当前服务所使用的pid写入文件。
如果未设置,则不会写入任何PID文件。
gunicorn --reload --log-level error --access-logfile gunicorn.log --error-logfile error.log --pid pid.txt main:app
user
命令行:-u USER
或--user USER
默认: 1005
将工作进程切换为以该用户身份运行。
有效的用户ID(作为整数)或可以通过调用pwd.getpwnam(value)
或None
不更改工作进程用户的方式检索的用户名。可通过命令id查看当前用户的id或组。
group
命令行: 或-g GROUP``--group GROUP
默认: 205
切换工作进程以该组身份运行。
可以通过调用pwd.getgrnam(value)
或None
不更改工作进程组来获取的有效组ID(作为整数)或用户名。
pythonpath
命令行: --pythonpath STRING
默认: None
用逗号分隔的目录列表,以添加到Python路径。
例如 '/home/djangoprojects/myproject,/home/python/mylibrary'
。
proxy_protocol
命令行: --proxy-protocol
默认: False
启用检测代理协议(代理模式)。
允许同时使用HTTP和代理。对于将stunnel作为HTTPS前端以及将Gunicorn作为HTTP服务器,它可能会很有用。
代理协议:http : //haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
stunnel配置示例:
[https]
protocol = proxy
accept = 443
connect = 80
cert = /etc/ssl/certs/stunnel.pem
key = /etc/ssl/certs/stunnel.key
bind
命令行: 或-b ADDRESS``--bind ADDRESS
默认: ['127.0.0.1:8000']
要绑定的套接字。
形式的字符串:HOST
,HOST:PORT
,unix:PATH
, fd://FD
。IP是有效的HOST
。
backlog
命令行: --backlog INT
默认: 2048
最大挂起连接数。
这是指可以等待服务的客户端数量。超过此数字将导致客户端在尝试连接时收到错误消息。它只应影响负载很大的服务器。
必须为正整数。通常设置在64-2048范围内。
workers
命令行: 或-w INT``--workers INT
默认: 1
处理请求的工作进程数。
worker_class
服务器的类型。
命令行: -k STRING
或--worker-class STRING
默认: 'sync'
是同步服务器
sync
-
eventlet
-需要eventlet> = 0.24.1(或通过安装 )pip install gunicorn[eventlet]
-
gevent
-需要gevent> = 1.4(或通过安装 )pip install gunicorn[gevent]
-
tornado
-需要tornado> = 0.2(或通过安装 )pip install gunicorn[tornado]
-
gthread
-Python 2需要安装Futures软件包(或通过安装)pip install gunicorn[gthread]
性能最好的是gevent,推荐使用。异步服务器。
threads
命令行: --threads INT
默认: 1
用于处理请求的工作线程数。通常设置为2-4.
worker_connections
命令行: --worker-connections INT
默认: 1000
并发客户端的最大数量。
此设置仅影响Eventlet和Gevent工作者类型。
timeout
超时时间
命令行: 或-t INT``--timeout INT
默认: 30
,通常,默认的三十秒就足够了。
keepalive
命令行: --keep-alive INT
默认: 2
等待“保持活动”连接上的请求的秒数。
对于直接连接到客户端的服务器,通常设置在1-5秒的范围内(例如,当您没有单独的负载平衡器时)。当将Gunicorn部署在负载均衡器后面时,将其设置为更高的值通常是有意义的。
注意:sync
worker不支持持久连接,将忽略此选项。
使用配置文件示例
import multiprocessing
import os
from gevent import monkey
monkey.patch_all()
chdir = os.path.dirname(os.path.abspath(__file__))
bind = '0.0.0.0:8000'
backlog = 2048
timeout = 60
worker_class = 'gevent'
workers = multiprocessing.cpu_count() * 2 + 1
threads = multiprocessing.cpu_count() * 2
daemon = False
loglevel = 'info'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog = 'logs/gunicorn_access.log'
errorlog = 'logs/gunicorn_error.log'
pidfile = 'logs/gunicorn.pid'
启动
gunicorn -c gunicorn.conf.py test.wsgi
随系统启动systemctl
创建service文件
vim /etc/systemd/system/test.service
配置文件
[Unit]
Description=phytium_service
After=network.target
[Service]
User=root
WorkingDirectory=/root/xxx
ExecStart=/root/xxx/env/bin/gunicorn -c /root/xxx/gunicorn.conf.py xxx.wsgi
Restart=always
RestartSec=3
Environment=PYTHONUNBUFFERED=true
Environment=DJANGO_SETTINGS_MODULE=xxx.settings
[Install]
WantedBy=default.target
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
其他命令
systemctl [操作命令] test.service
操作命令:
start,启动服务
disable,停止自启
status,查看服务状态
restart,重新启动服务
enable,