安裝
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,