FastAPI環(huán)境部署

測試環(huán)境

  • 安裝 uvicorn
    Uvicorn,是一個閃電般快速的ASGI服務(wù)器,基于uvloop和httptools構(gòu)建。
pip install uvicorn
  • 命令行啟動
uvicorn main:app --host 0.0.0.0 --port 80 --reload
  • 腳本中啟動
if __name__ == '__main__':
    uvicorn.run(
        app='main:app',
        host="0.0.0.0",
        port=8899,
        workers=4,
        reload=True,
        debug=True)
  • uvicorn 幫助說明
uvicorn --help
Usage: uvicorn [OPTIONS] APP

Options:
  --host TEXT                     Bind socket to this host.  [default:
                                  127.0.0.1]
  --port INTEGER                  Bind socket to this port.  [default: 8000]
  --uds TEXT                      Bind to a UNIX domain socket.
  --fd INTEGER                    Bind to socket from this file descriptor.
  --reload                        Enable auto-reload.
  --reload-dir TEXT               Set reload directories explicitly, instead
                                  of using the current working directory.
  --reload-delay FLOAT            Delay between previous and next check if
                                  application needs to be. Defaults to 0.25s.
                                  [default: 0.25]
  --workers INTEGER               Number of worker processes. Defaults to the
                                  $WEB_CONCURRENCY environment variable if
                                  available, or 1. Not valid with --reload.
  --loop [auto|asyncio|uvloop]    Event loop implementation.  [default: auto]
  --http [auto|h11|httptools]     HTTP protocol implementation.  [default:
                                  auto]
  --ws [auto|none|websockets|wsproto]
                                  WebSocket protocol implementation.
                                  [default: auto]
  --ws-max-size INTEGER           WebSocket max size message in bytes
                                  [default: 16777216]
  --lifespan [auto|on|off]        Lifespan implementation.  [default: auto]
  --interface [auto|asgi3|asgi2|wsgi]
                                  Select ASGI3, ASGI2, or WSGI as the
                                  application interface.  [default: auto]
  --env-file PATH                 Environment configuration file.
  --log-config PATH               Logging configuration file. Supported
                                  formats: .ini, .json, .yaml.
  --log-level [critical|error|warning|info|debug|trace]
                                  Log level. [default: info]
  --access-log / --no-access-log  Enable/Disable access log.
  --use-colors / --no-use-colors  Enable/Disable colorized logging.
  --proxy-headers / --no-proxy-headers
                                  Enable/Disable X-Forwarded-Proto,
                                  X-Forwarded-For, X-Forwarded-Port to
                                  populate remote address info.
  --forwarded-allow-ips TEXT      Comma seperated list of IPs to trust with
                                  proxy headers. Defaults to the
                                  $FORWARDED_ALLOW_IPS environment variable if
                                  available, or '127.0.0.1'.
  --root-path TEXT                Set the ASGI 'root_path' for applications
                                  submounted below a given URL path.
  --limit-concurrency INTEGER     Maximum number of concurrent connections or
                                  tasks to allow, before issuing HTTP 503
                                  responses.
  --backlog INTEGER               Maximum number of connections to hold in
                                  backlog
  --limit-max-requests INTEGER    Maximum number of requests to service before
                                  terminating the process.
  --timeout-keep-alive INTEGER    Close Keep-Alive connections if no new data
                                  is received within this timeout.  [default:
                                  5]
  --ssl-keyfile TEXT              SSL key file
  --ssl-certfile TEXT             SSL certificate file
  --ssl-keyfile-password TEXT     SSL keyfile password
  --ssl-version INTEGER           SSL version to use (see stdlib ssl module's)
                                  [default: 2]
  --ssl-cert-reqs INTEGER         Whether client certificate is required (see
                                  stdlib ssl module's)  [default: 0]
  --ssl-ca-certs TEXT             CA certificates file
  --ssl-ciphers TEXT              Ciphers to use (see stdlib ssl module's)
                                  [default: TLSv1]
  --header TEXT                   Specify custom default HTTP response headers
                                  as a Name:Value pair
  --version                       Display the uvicorn version and exit.
  --app-dir TEXT                  Look for APP in the specified directory, by
                                  adding this to the PYTHONPATH. Defaults to
                                  the current working directory.  [default: .]
  --factory                       Treat APP as an application factory, i.e. a
                                  () -> <ASGI app> callable.  [default: False]
  --help                          Show this message and exit.

生產(chǎn)環(huán)境

  • 安裝 進程管理器gunicorn
pip install gunicorn
pip install uvloop
pip install httptools

查看使用的命令

gunicorn -h 
  • 啟動方式

Gunicorn 是成熟的彤蔽,功能齊全的服務(wù)器,Uvicorn 內(nèi)部包含有 Guicorn 的 workers 類缸榄,允許你運行 ASGI 應(yīng)用程序捞附,這些 workers 繼承了所有 Uvicorn 高性能的特點。

使用 Guicorn 來進行進程管理胳嘲,我們可以動態(tài)增加或減少進程數(shù)量厂僧,平滑地重啟工作進程,或者升級服務(wù)器而無需停機了牛。

在生產(chǎn)環(huán)境中颜屠,Guicorn 大概是最簡單的方式來管理 Uvicorn 了,生產(chǎn)環(huán)境部署我們推薦使用 Guicorn 和 Uvicorn 的 worker 類

gunicorn main:app -b 0.0.0.0:8899 -w 4 -k uvicorn.workers.UvicornWorker --daemon 

獲取Gunicorn進程樹

pstree -ap|grep gunicorn

重啟Gunicorn任務(wù)

kill -HUP 30080

gunicorn的參數(shù)詳解

-c CONFIG    : CONFIG,配置文件的路徑鹰祸,通過配置文件啟動甫窟;生產(chǎn)環(huán)境使用;

-b ADDRESS   : ADDRESS福荸,ip加端口蕴坪,綁定運行的主機;

-w INT, --workers INT:用于處理工作進程的數(shù)量敬锐,為正整數(shù)背传,默認(rèn)為1;

-k STRTING, --worker-class STRTING:要使用的工作模式台夺,默認(rèn)為sync異步径玖,可以下載eventlet和gevent并指定

--threads INT:處理請求的工作線程數(shù),使用指定數(shù)量的線程運行每個worker颤介。為正整數(shù)梳星,默認(rèn)為1。

--worker-connections INT:最大客戶端并發(fā)數(shù)量滚朵,默認(rèn)情況下這個值為1000冤灾。

--backlog int:未連接的最大數(shù)量,即等待服務(wù)的客戶的數(shù)量辕近。默認(rèn)2048個韵吨,一般不修改;

-p FILE, --pid FILE:設(shè)置pid文件的文件名移宅,如果不設(shè)置將不會創(chuàng)建pid文件


--access-logfile FILE   :  要寫入的訪問日志目錄

--access-logformat STRING:要寫入的訪問日志格式

--error-logfile FILE, --log-file FILE  :  要寫入錯誤日志的文件目錄归粉。

--log-level LEVEL   :   錯誤日志輸出等級椿疗。


--limit-request-line INT   :  HTTP請求頭的行數(shù)的最大大小,此參數(shù)用于限制HTTP請求行的允許大小糠悼,默認(rèn)情況下届榄,這個值為4094。值是0~8190的數(shù)字倔喂。

--limit-request-fields INT   :  限制HTTP請求中請求頭字段的數(shù)量铝条。此字段用于限制請求頭字段的數(shù)量以防止DDOS攻擊,默認(rèn)情況下滴劲,這個值為100攻晒,這個值不能超過32768

--limit-request-field-size INT  :  限制HTTP請求中請求頭的大小,默認(rèn)情況下這個值為8190字節(jié)班挖。值是一個整數(shù)或者0鲁捏,當(dāng)該值為0時,表示將對請求頭大小不做限制


-t INT, --timeout INT:超過這么多秒后工作將被殺掉萧芙,并重新啟動给梅。一般設(shè)定為30秒;

--daemon双揪,-D: 是否以守護進程啟動动羽,默認(rèn)false;

--chdir: 在加載應(yīng)用程序之前切換目錄渔期;

--graceful-timeout INT:默認(rèn)情況下运吓,這個值為30,在超時(從接收到重啟信號開始)之后仍然活著的工作將被強行殺死疯趟;一般使用默認(rèn)拘哨;

--keep-alive INT:在keep-alive連接上等待請求的秒數(shù),默認(rèn)情況下值為2信峻。一般設(shè)定在1~5秒之間倦青。

--reload:默認(rèn)為False。此設(shè)置用于開發(fā)盹舞,每當(dāng)應(yīng)用程序發(fā)生更改時产镐,都會導(dǎo)致工作重新啟動。

--spew:打印服務(wù)器執(zhí)行過的每一條語句踢步,默認(rèn)False癣亚。此選擇為原子性的,即要么全部打印获印,要么全部不打犹釉恪;

--check-config   :顯示現(xiàn)在的配置蓬豁,默認(rèn)值為False绰咽,即顯示。

-e ENV, --env ENV: 設(shè)置環(huán)境變量地粪;
  • 以配置文件的方式啟動
    gunicorn.conf
import multiprocessing

# 并行工作進程數(shù)(multiprocessing.cpu_count()線程數(shù),官方說可以有:核心數(shù)*2+1個)
workers = multiprocessing.cpu_count() * 2 + 1 
# 指定每個工作者的線程數(shù)
threads = 2
# 監(jiān)聽內(nèi)網(wǎng)端口5000
bind = '127.0.0.1:5000'
# 設(shè)置守護進程,推薦將進程交給supervisor管理(以守護進程形式來運行Gunicorn進程取募,true其實就是將這個服務(wù)放到后臺去運行,故此處設(shè)置false,交給supervisor開守護進程蟆技,因為supervisor不支持后臺進程)
daemon = 'false'
# 工作模式協(xié)程
worker_class = 'gevent'
# 設(shè)置最大并發(fā)量
worker_connections = 2000
# 設(shè)置進程文件目錄
pidfile = '/var/run/gunicorn.pid'
# 設(shè)置訪問日志和錯誤信息日志路徑
accesslog = '/var/log/gunicorn_acess.log'
errorlog = '/var/log/gunicorn_error.log'
# 日志級別玩敏,這個日志級別指的是錯誤日志的級別,而訪問日志的級別無法設(shè)置
loglevel = 'warning'

啟動unicorn

gunicorn -c gunicorn.conf main:app
  • 推薦用supervisor管理gunicorn

用于管理gunicorn质礼,將其當(dāng)作自己的子進程啟動旺聚;當(dāng)gunicorn由于異常等停止運行后,supervisor可以自動重啟gunicorn

supervisor為c/s架構(gòu)眶蕉,supervisord 是服務(wù)端砰粹,supervisorctl 是客戶端

supervisord啟動成功后,可以通過supervisorctl客戶端控制進程造挽,啟動碱璃、停止、重啟

supervisor_gunicorn.ini

[program:supervisor-gunicorn]  
user = root
directory = /root/gunicorn_demo/
command = /usr/local/python3/bin/gunicorn main:app -b 0.0.0.0:8899 -w 4 -k uvicorn.workers.UvicornWorker
autostart = true
startsecs = 10
redirect_stderr = true
stdout_logfile = /var/log/supervisor_gunicorn.log

更詳細參數(shù)部署可參考 Supervisord安裝和配置

參考文檔:
https://www.uvicorn.org/deployment/#gunicorn
https://www.cnblogs.com/mazhiyong/p/13384785.html
https://www.cnblogs.com/shijingjing07/p/9110619.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饭入,一起剝皮案震驚了整個濱河市嵌器,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谐丢,老刑警劉巖爽航,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乾忱,居然都是意外死亡讥珍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門饭耳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來串述,“玉大人,你說我怎么就攤上這事寞肖「傩铮” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵新蟆,是天一觀的道長觅赊。 經(jīng)常有香客問我,道長琼稻,這世上最難降的妖魔是什么吮螺? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上鸠补,老公的妹妹穿的比我還像新娘萝风。我一直安慰自己,他們只是感情好紫岩,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布规惰。 她就那樣靜靜地躺著,像睡著了一般泉蝌。 火紅的嫁衣襯著肌膚如雪歇万。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天勋陪,我揣著相機與錄音贪磺,去河邊找鬼。 笑死诅愚,一個胖子當(dāng)著我的面吹牛寒锚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻粹,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼壕曼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了等浊?” 一聲冷哼從身側(cè)響起腮郊,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筹燕,沒想到半個月后轧飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡撒踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年过咬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片制妄。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡掸绞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耕捞,到底是詐尸還是另有隱情衔掸,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布俺抽,位于F島的核電站敞映,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磷斧。R本人自食惡果不足惜振愿,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一捷犹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冕末,春花似錦萍歉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胳蛮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丛晌,已是汗流浹背仅炊。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澎蛛,地道東北人抚垄。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像谋逻,于是被迫代替她去往敵國和親呆馁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容