Gunicorn配置部分的翻譯


寫在前面,雖然翻譯得很爛,但也是我的勞動成果,轉載請注明出處,謝謝。
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

選擇重載的引擎,支持的有三種,分別是autopollinotify(需要單獨安裝)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM