寫在前面,雖然翻譯得很爛,但也是我的勞動成果,轉載請注明出處,謝謝。
Gunicorn版本號19.7.1
Gunicorn配置
概述
三種配置方式
優先級如下,越后的優先級越大
1.框架的設置(現在只有paster在用這個)
2.配置文件(推薦使用這個)
3.命令行的賦值
查看配置的方法
$ gunicorn --check-config APP_MODULE
這個命令可以檢查app的配置
設置的參數詳細說明
關於環境變量
如前文所講,可以通過多種方式來設置運行參數,但是有一些參數是只能寫在配置文件中,而剩下那些可以寫在命令行中的參數,都是可以通過設置環境變量來設置的。
$ GUNICORN_CMD_ARGS="--bind=127.0.0.1 --workers=3" gunicorn app:app
config File
config 配置文件的地址
用法:'-c CONFIG, --config CONFIG
'
默認值:None
這個參數需要在命令行中傳入,或者作為應用特定配置的一部分(后面半句我也不懂)
參數要求是文件的地址,或者是python的module(我猜是類似 python:some_module.module.conf)
需要注意的是,如果參數是python的module,則參數的形式必須是python:module_name
Server Socket 服務端口
bind 綁定端口
用法:-b ADDRESS, --bind ADDRESS
默認值:['127.0.0.1:8000']
就是指定綁定的端口號
官方提了一個可以綁定多個地址的例子
$ gunicorn -b 127.0.0.1:8000 -b [::1]:8000 test:app
如上,就是將app綁到了本地的ipv4和ipv6的接口
backlog 允許掛起的鏈接數
用法:--backlog INT
默認值:2048
就是設置允許掛起的連接數的最大值
官方推薦這個值設在64-2048
Worker Processes 工作進程相關
workers 進程數量
用法:-w INT, --workers INT
默認值:1
設置處理請求的進程數,官方推薦的值是2-4 x $(NUM_CORES)
,就是核心數的2-4倍,而我在網上查到的,大多數是推薦設置為核心數的兩倍+1
worker_class 進程的工作方式
用法:-k STRING, --worker-class STRING
默認值:sync
設置進程的工作方式,默認是同步,如果需要設置異步,則需要下載相關的庫
可選的參數如下:
*eventlet
-要求eventlet版本大於0.9.7
*gevent
-要求gevent版本大於0.13
*tornado
-要求tornado版本大於0.2
*gthread
-安裝了futures庫的python2(意思就是python3隨便用?)
*giohttp
-python3.4以上,且aiohttp版本大於0.21.5
如果要用自己的庫來處理的話,就將庫添加到gunicorn.workers
,然后再選擇自己的worker
threads 線程數
用法:--threads INT
默認值:1
就是設置開啟的多線程的數目,官方也是推薦設置為核心數的兩至四倍。
這個設置只對進程工作方式為Gthread的產生影響。
worker_connections 進程鏈接數
用法: --workers-connections INT
默認值:1000
設置同時鏈接客戶端的閥值。
這個設置只對進程工作方式為Eventlet和Gevent的產生影響。
max_requests 最大請求數
用法:--max-requests INT
默認值:0
設置一個進程處理完max_requests次請求后自動重啟
就是設置這個可以預防內存泄漏,如果不設置的話,則進程不會自動重啟
max_requests_jitter 最大請求數的變化值
用法:--max-requests-jitter INT
默認值:0
這個的作用與max_requests的幾乎一致,只是后者設置為固定值,而這個的值是randint(0, max_requests_jitter)
timeout 過期時間
用法:-t INT, --timeout INT
默認值:30
worker沉默(不工作?不發送response?)超過timeout秒之后就會重啟
對於同步worker來講,官方建議用default值就可以了,當然,如果你確認這個值不滿足你的要求的時候,可以調高。
對於異步worker來講,worker仍然會繼續通信(發response?),而且對於處理一個獨立的請求來講,它是與所需的時間無關。(個人理解為,對於異步來講,這個參數是沒有意義的)
graceful_time 優雅的timeout(后置的timeout)
用法:--graceful-timeout INT
默認值:30
其實就是當worker接收到重啟的信號之后,再工作這么久才真正執行重啟。
keepalive 鏈接存活時間
用法:--keep-alive INT
默認值:2
發送完一個response后,等待keepalive秒再關閉連接
建議設置為1-5
Security 安全方面的設置
limit_request_line 設置請求行的最大長度
用法:--limit-request-line INT
默認值:4094
允許設置的值為0-8190,0是不限制的意思。
文檔中提到這個參數可以防止DDOS攻擊,具體我還要去查一下為什么。
(網上查到的request-line其實就是請求的第一行,后面的都是鍵值對。因為RESTful的要求,這個第一行會包含挺多的信息)
limit_request_fields 設置請求頭的字段的范圍
用法:--limit-request-fields INT
默認值:100
(這個我並不是很懂)
limit_request_field_size 設置請求頭的大小
用法:--limit-request-field_size INT
默認值:8190
Debugging 調試
reload 重載
用法:--reload
默認值:False
更改代碼的時候重啟workers, 只建議在開發過程中開啟。
文檔推薦下載inotify
這個包來作為重載引擎。
reload_engine 重載的引擎
用法:--reload-engine STRING
默認值:auto
選擇重載的引擎,支持的有三種,分別是auto
,poll
,inotify
(需要單獨安裝)
spew 顯示
用法:--spew
默認值:False
啟動一個能夠將服務器執行過的每一條語句都打印出來的函數,然后這個選項是原子性的,就是要么全打,要么不打。
check_config 檢查配置
用法:--check-config
默認值:False
顯示現在的配置。
Server Mechanics 服務結構方面
preload_app 預重載應用
用法:--preload
默認值:False
在worker進程被復制(派生)之前載入應用的代碼。
通過預加載應用,可以節省內存資源和提高服務啟動時間。當然,如果你將應用加載進worker進程這個動作延后,那么重啟worker將會容易很多。
sendfile 發送文件?
用法:--no-sendfile
默認值:None
這個值可以在環境變量設置。(文檔中並沒有提到這個選項是干嘛的 )
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
默認值:[]
用鍵值對來設置環境變量。
$ gunicorn -b 127.0.0.1:8000 --env FOO=1 test:app
pidfile 進程文件名
用法:-p FILE, --pid FILE
默認值:None
設置pid文件的文件名,如果不設置的話,不會創建pid文件。
worker_tmp_dir 工作臨時地址
用法:--worker-tmp-dir DIR
默認值:None
設置工作的臨時文件夾的地址。
如果不設置,則會采用默認值,也就是調用os.fchmod
來找一個地址,但是如果這個地址是disk-backed類型的文件系統,很有可能會讓worker阻塞;或者如果默認的硬盤滿掉了,Gunicorn也不會啟動。所以文檔建議我們在新掛載一個/tmpfs,然后把這個地址賦到這里來
sudo cp /etc/fstab /etc/fstab.orig
sudo mkdir /mem
echo 'tmpfs /mem tmpfs defaults,size=64m,mode=1777,noatime,comment=for-gunicorn 0 0' | sudo tee -a /etc/fstab
sudo mount /mem
..... --worker-tmp-dir /mem
user 設置用戶
用法:-u USER, --user USER
默認值:1005
選擇一個工作進程來作為當前用戶。
這里可以輸入有效的用戶id或者用戶名,那么在用pwd.getpwnam(value)
的時候就可以取到這個值。如果輸入None
,則不會改變當前工作進程的用戶。
group 設置用戶組
用法:-g GROUP, --group GROUP
默認值:205
與上面那個類似。
umask 權限掩碼
用法:-m INT, --umask INT
默認值:0
Gunicorn對寫文件的權限。
initgroups 設置新組
用法:--initgroups
默認值:False
設置為真的時候,會將所有worker進程加到一個指定名字的新組中。
tmp_upload_dir 上傳文件的臨時存放地址
默認值:None
保存那些臨時的請求內容。
文檔講這個選型未來可能會被移除。
如果設置了路徑,要確保worker進程有權限去寫。如果不設置,則會選擇/tmp來存放。
secure_scheme_headers
默認值: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
這個字典指明了哪些請求頭是HTTPS請求。
forwarded_allow_ips 選擇接收的對象
用法:--forwarded-allow-ips STRING
默認值:127.0.0.1
比如在跟Nginx一起部署的時候,如果Nginx不在本機上(localhost),為了避免偽造host的攻擊,可以指定只接收從那些指定的地址傳來的連接,而如果Nginx就在本機上,就直接按默認的127.0.0.1
就行了。
Logging 日志設置
accesslog 設置訪問日志存放的地方
用法:--access-logfile FILE
默認值:None
設置為-
就是記錄到標准輸出。
access_log_format 訪問日志的格式
用法:--access-logformat STRING
默認值:%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
Identifier | Description |
---|---|
h | remote address |
l | '-' |
u | user name |
t | date of the request |
r | status line (e.g. GET / HTTP/1.1) |
m | request method |
U | URL path without query string |
q | query string |
H | protocol |
s | status |
B | response length |
b | response length or '-' (CLF format) |
f | referer |
a | user agent |
T | request time in seconds |
D | request time in microseconds |
L | request time in decimal seconds |
p | process ID |
{Header}i | request header |
{Header}o | response header |
{Variable}e | environment variable |
errorlog 設置錯誤日志的存放地址
用法:--error-logfile FILE, --log-file FILE
默認值:-
設置為-
就是記錄到標准輸出。
loglevel 設置日志等級
用法:--log-level LEVEL
默認值:info
debug,info,warning,error,critical
capture_output 捕捉標准輸出
用法:--capture-output
默認值:False
重定向標准輸出和標准錯誤信息到錯誤日志。
logger_class 選擇處理日志的方法
用法:--logger-class STRING
默認值:gunicorn.glogging.Logger
logconfig 日志的配置
用法:--log-config FILE
默認值:None
默認使用python標准庫logging的配置文件形式。
syslog_addr 系統日志的地址
用法:--log-syslog-to SYSLOG_ADDR
默認值:udp://localhost:514
設置發送系統日志信息的地址。
可傳遞的方式
unix://PATH#TYPE
對於unix的socket來講,可以用stream或者gram形式。udp://HOST:PORT
tcp://HOST:PORT
syslog 啟用系統日志來記載
用法:--log-syslog
默認值:False
把Gunicorn的日志發送到系統日志。
syslog_prefix 系統日志的前綴
用法:--log-syslog-prefix SYSLOG_RREFIX
默認值:None
設置每條系統日志的前綴,默認是進程的名字。
syslog_facility 系統日志的別名
用法:--log-syslog-facility SYSLOG_FACILITY
默認值:user
enable_stdio_inheritance 標准輸入輸出的繼承
用法:-R, --enable-stdio-inhertitance
默認值:False
允許標准輸入輸出的繼承,允許標准輸入輸出文件描述符在守護進程模式下的繼承。
可以設置環境變量PYHTONUNBUFFERED
來取消python標准輸出的緩存(?)
statsd_host
網上查到statsd的意思是單機搭建,暫時沒理解是什么意思。
statsd_prefix
不懂不懂
Process Naming 進程命名
proc_name 設置進程名字
用法:-n STRING, --name STRING
默認值:None
用setproctitle
這個模塊(需要額外安裝)去給進程命名,方便我們在ps
或者top
的時候分辨出哪個是我們想要的。
不設置的時候,會用default_proc_name
default_proc_name 默認的進程名
gunicorn
Server Mechanics 服務架構
pythonpath
用法:--pythonpath STRING
默認值:None
將這些路徑加到python path去
e.g.'/home/djangoprojects/myproject,/home/python/mylibrary'
paste
PASS
Server Hooks 服務的鈎子函數
on_starting
def on_starting(sever):
pass
這個函數會在主進程初始化后被調用。
函數需要接收一個服務的實例作為參數。
on_reload
def on_reload(server):
pass
函數會在接收到掛起信號而重載的時候被調用。
函數需要接收一個服務的實例作為參數。
when_ready
def when_ready(sever):
pass
函數會在服務啟動之后就被調用。
函數需要接收一個服務的實例作為參數。
pre_fork
def post_fork(sever, worker):
pass
函數在worker派生(生成)之前被調用。
函數需要接收一個服務的實例和一個新的worker。(不懂,既然函數是在生成worker之前調用,那又怎么將這個未生成的worker傳到這個函數里面來呢)
post_fork
def post_fork(sever, worker):
pass
函數在worker派生(生成)之后被調用。
函數需要接收一個服務的實例和一個新的worker。
post_worker_init
def post_worker_init(worker):
pass
函數在worker完成應用初始化之后被調用。
函數需要接收一個完成初始化的worker。
work_int
def worker_int(worker):
pass
函數會在worker退出信號流(?)或者掛起的時候調用。
函數需要接收一個完成初始化的worker。
work_abort
def worker_abort(worker):
pass
函數會在worker接收到請求異常終止信號的時候被調用。
一般這個情況發生在timeout(超時)。
函數需要接收一個完成初始化的worker。
pre_exec
def pre_exec(server):
pass
函數會在新的主進程生成(派生)之前被調用。
函數需要接收一個服務的實例。
pre_request
def pre_request(worker, req):
worker.log.debug("%s %s" % (req.method, req.path))
函數會在worker處理請求之前被調用。
函數需要接收這個worker,和請求作為參數。
post_request
def post_request(worker, req, environ, resp):
pass
函數會在worker處理請求后被調用。
函數需要接收這個worker,和請求作為參數。
child_exit
def child_ext(sever, worker):
pass
函數會在worker完全退出之后,在主進程被調用。
函數需要接收這個服務的實例,和這個worker作為參數。
worker_exit
def worker_exit(server, worker):
pass
函數會在worker完全退出之后,在worker進程被調用。
函數需要接收這個服務的實例,和這個worker作為參數。
nworkers_changed
def nworkers_changed(server, new_value, old_value):
pass
函數在worker數量產生變化后被調用。
函數接收的參數為,服務的實例,新的worker數量,和變化之前的數量。
第一次的時候,old_value是None
on_exit
def on_exit(server):
pass
函數在退出Gunicorn的時候被調用。
函數接收服務的實例作為參數。
Server Mechanics
proxy_protocol 代理協議
用法:--proxy_protocol
默認值:False
使用代理模式。
文檔介紹了開啟這個模式后,可以讓stunnel作為HTTPS的前端,然后Gunicorn作為HTTP的服務器。(並不是很懂,暫時略過)
proxy_allow_ips
用法:--proxy-allow-from
默認值:127.0.0.1
不懂不懂
設置*
來禁用這個功能。
SSL
keyfile
用法:--keyfile FILE
默認值:None
指定ssl的key文件(那是公匙還是私匙?)
certfile
用法:--certfile FILE
默認值:None
指定ssl的證書文件
ssl_version
用法:--ssl-version
默認值:2
指定使用的ssl版本(也要看標准庫的ssl模塊是否支持)
cert_reqs
用法:--cert-reqs
默認值:0
是否需要客戶端提供證書(也要看標准庫的ssl模塊是否支持)
ca_certs
用法:--ca-certs FILE
默認值:None
指定CA證書文件
suppress_ragged_eofs
用法:--suppress-ragged-eofs
默認值:True
禁止粗魯的停止?不是很懂
do_handshake_on_connect
用法:--do-handshake-on-connect
默認值:False
在socket連接的時候是否執行ssl握手(也要看標准庫的ssl模塊是否支持)
ciphers
用法:--ciphers
默認值:TLSv1
指定使用的加密算法(也要看標准庫的ssl模塊是否支持)
Server Mechanics
raw_paste_global_conf
pass