梁山專業(yè)網(wǎng)站建設(shè)網(wǎng)址檢測
文章目錄
- 通過runserver運行Django
- 通過Gunicorn運行Django
- 通過Nginx來做反向代理
- 通過Supervisor來托管gunicorn和nginx
同步發(fā)布在個人站點:https://panzhixiang.cn
通過runserver運行Django
相信用過Django做開發(fā)的人對于python manage.py runserver
這個命令一定不陌生,這個命令利用django自帶的一個web服務(wù)器,可以幫助我們在本地很簡單地就運行django,對于本地測試來說足夠了,但是不能用作生產(chǎn)環(huán)境中,甚至測試環(huán)境都不行,主要有如下幾點問題:
-
性能差
它是單進(jìn)程、單線程的,因此只能同時處理一個請求。隨著請求量的增加,服務(wù)器的 CPU 和內(nèi)存使用率會不斷上升,最終導(dǎo)致性能下降 -
功能有限
它僅支持基本的 HTTP 請求,不支持 HTTPS、負(fù)載均衡、靜態(tài)文件服務(wù)等功能。在生產(chǎn)環(huán)境中,這些功能是必不可少的。
通過Gunicorn運行Django
正式使用Gunicorn之前,先說一下它的優(yōu)點:
(以下內(nèi)容來自GPT4)
Gunicorn(Green Unicorn)是一個Python的WSGI HTTP服務(wù)器,許多大型網(wǎng)站和高性能應(yīng)用都選用它來托管 Python web 應(yīng)用。以下是 Gunicorn 的一些主要優(yōu)點:
簡單易用:Gunicorn 非常容易安裝和配置。你只需要通過 pip 安裝它,并用幾行命令就可以啟動一個 WSGI 應(yīng)用。這使得開發(fā)者可以更加專注于他們的應(yīng)用程序代碼,而不需要過多關(guān)心部署和運維問題。
兼容性強:Gunicorn 全面支持 WSGI 規(guī)范,因此理論上與所有遵循該規(guī)范的Python web框架兼容,包括但不限于Django、Flask和Pyramid等。
預(yù)分叉模型:Gunicorn 使用 Unix 的 fork 系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程(worker),每個 worker 可以獨立地處理請求。使用預(yù)分叉模型,父進(jìn)程可以在必要時殺死并重建子進(jìn)程,提供了對內(nèi)存泄漏的防護機制。
負(fù)載管理:Gunicorn 有多種類型的 worker 可供選擇,包括同步 worker 和異步 worker。同步 worker 適合 CPU 密集型任務(wù),而異步 worker 則適合 IO 密集型或網(wǎng)絡(luò)密集型的任務(wù)。這意味著你可以根據(jù)自己的應(yīng)用特性選擇最合適的 worker 類型。
錯誤隔離:由于每個請求都由各自的 worker 進(jìn)程處理,如果一個請求導(dǎo)致 crash 或者未捕獲的異常,那么只會影響到正在處理該請求的 worker,其他 worker 或請求將不受影響。
健壯性和可靠性:Gunicorn 能夠自動管理 worker 進(jìn)程,如果某個 worker 異常退出,Gunicorn 主進(jìn)程會自動重新啟動新的 worker 進(jìn)程來代替,從而保證服務(wù)的持續(xù)可用。
配置靈活:Gunicorn 提供了大量的配置選項,你可以控制日志級別、輸出位置、worker 數(shù)量、請求超時時間、SSL 設(shè)置等諸多方面。同時,Gunicorn 支持從 Python 文件、環(huán)境變量、命令行參數(shù)中讀取配置,滿足了不同場景下的需求。
熱重載:Gunicorn 支持無縫重啟,這意味著你可以在不中斷服務(wù)的情況下升級代碼或者配置。
社區(qū)支持和文檔:最后但同樣重要的是,Gunicorn 有一個活躍的開發(fā)者社區(qū)和詳細(xì)的官方文檔,能夠為使用 Gunicorn 的開發(fā)者提供大量的幫助和指導(dǎo)。
在使用 Gunicorn 運行 Django 之前,你需要確保已經(jīng)正確地安裝了 Django 和 Gunicorn。假設(shè)你的 Django 項目名為 myproject
,并且它位于 /path/to/myproject/
下。
-
安裝 Gunicorn
如果你還沒有安裝 Gunicorn,可以使用 pip 來安裝:pip install gunicorn
-
運行 Gunicorn
現(xiàn)在你應(yīng)該可以用 Gunicorn 來啟動你的 Django 應(yīng)用了。Gunicorn 的基本命令格式是gunicorn [OPTIONS] APP_MODULE
,其中APP_MODULE
是一個 Python 導(dǎo)入路徑,指向包含 WSGI application 對象的模塊。在標(biāo)準(zhǔn)的 Django 項目中,這個對象(通常被稱為
application
)定義在wsgi.py
文件里。所以如果你的項目名為myproject
,那么APP_MODULE
就是myproject.wsgi
。要讓 Gunicorn 啟動 Django 項目,可以執(zhí)行以下命令:
cd /path/to/myproject/ gunicorn myproject.wsgi
這將會在監(jiān)聽 localhost:8000 的 Gunicorn 服務(wù)器上啟動你的 Django 應(yīng)用。
注意:這個只是為了演示gunicorn的簡單運行方式,正式環(huán)境中不推薦這么使用
-
配置 Gunicorn
Gunicorn 提供了許多可配置的選項,可以根據(jù)自己的需求去調(diào)整其行為,比較常用的方式是創(chuàng)建一個 Gunicorn 配置文件可以讓你的配置更加結(jié)構(gòu)化和方便管理。Gunicorn 的配置文件通常是一個 Python 腳本,其中定義了一些全局變量。
假設(shè)我們在
/path/to/myproject/gunicorn_config.py
創(chuàng)建以下配置文件:# gunicorn_config.pyimport multiprocessing# 綁定ip和端口號bind = "0.0.0.0:8080"# 使用gevent模式,還可以使用sync 模式,默認(rèn)的是sync模式worker_class = 'gevent'# 開啟的進(jìn)程數(shù)workers = multiprocessing.cpu_count() * 2 + 1# 并發(fā)處理的請求數(shù)量threads = 2# 最大待處理連接數(shù)backlog = 2048# 工作模式協(xié)程worker_connections = 1000# 重載、修改配置后,自動重新加載程序reload = True# 訪問日志文件accesslog = "/var/log/gunicorn/access.log"# 錯誤日志文件errorlog = "/var/log/gunicorn/error.log"
上述配置中,我們設(shè)置了多個參數(shù),如綁定地址、工作模式、日志位置等等。這只是一個基礎(chǔ)的配置例子,你可以根據(jù)實際需求進(jìn)行修改或擴展。
然后,你可以通過
-c
或--config
命令行選項來指明配置文件的路徑,運行 Django 應(yīng)用,如下所示:cd /path/to/myproject/ gunicorn myproject.wsgi -c gunicorn_config.py
該命令告訴 Gunicorn 加載
gunicorn_config.py
文件,并應(yīng)用里面定義的配置。
通過Nginx來做反向代理
gunicorn比起django的runserver要好很多,但是實踐中,一般不會直接將gunicorn直接對外暴露,而是再加一層反向代理,最常用的就是Nginx。
使用Nginx作為反向代理,主要有以下優(yōu)勢:
靜態(tài)文件處理:Nginx 非常擅長處理靜態(tài)內(nèi)容(如 CSS、JavaScript 文件或圖片),而 Python WSGI 服務(wù)器通常并不適合直接服務(wù)靜態(tài)文件,這可能會引發(fā)性能問題。通過將靜態(tài)文件服務(wù)任務(wù)交給 Nginx,你可以釋放出 Gunicorn 的資源來處理動態(tài)內(nèi)容。
負(fù)載均衡:如果你有多個后端服務(wù)器或者多個 worker 進(jìn)程,Nginx 可以有效地分配傳入請求到各個后端服務(wù)器上,實現(xiàn)負(fù)載均衡。它還支持多種負(fù)載均衡策略和健康檢查。
緩沖請求:Nginx 可以為后端提供一層保護,因為它攔截并處理了所有客戶端連接。這意味著后端服務(wù)器只需要處理完整的請求,無需關(guān)心網(wǎng)絡(luò)問題或慢速連接。此外,如果后端應(yīng)用掛掉或重啟,在這段時間內(nèi) Nginx 仍然可以繼續(xù)為用戶提供服務(wù)(例如返回一個友好的錯誤頁面)。
SSL 終止:如果你的網(wǎng)站需要 SSL 加密,Nginx 可以處理所有的 HTTPS 握手過程,并與后端服務(wù)器進(jìn)行非加密通信,這樣就減輕了后端服務(wù)器的負(fù)擔(dān)。
HTTP/2 支持:Nginx 支持 HTTP/2 協(xié)議,而大部分 WSGI 服務(wù)器包括 Gunicorn 目前還沒有直接支持 HTTP/2 的計劃。通過在 Nginx 中開啟 HTTP/2,你的用戶可以享受到更快的加載速度和更低的延遲。
訪問控制和安全防護:Nginx 提供了一系列安全相關(guān)功能,比如 IP 白名單/黑名單、限速、防止 DDOS 攻擊等。
gzip 壓縮:Nginx 可以對響應(yīng)數(shù)據(jù)進(jìn)行 gzip 壓縮,從而減少網(wǎng)絡(luò)帶寬消耗和提高頁面的加載速度。
下面是使用 Nginx 作為 Gunicorn 的反向代理的詳細(xì)步驟
-
安裝 Nginx
在 Ubuntu/Debian 上,你可以通過 apt-get 來安裝 Nginx:
sudo apt-get install nginx
-
配置 Nginx
配置 Nginx 以使其能正確地將請求轉(zhuǎn)發(fā)到 Gunicorn。Nginx 的設(shè)置文件通常位于
/etc/nginx/sites-available/default
。下面是一個基本的配置示例:
server {listen 80;server_name yourdomain.com;location /static/ {alias /path/to/myproject/static/; # 這里是指向Django中的靜態(tài)文件目錄的}location / {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://localhost:8000; # 替換成 gunicorn 正在監(jiān)聽的地址和端口號} }
-
啟動 Nginx
完成配置后,你就可以啟動 Nginx 了:
sudo service nginx start
以上就是基本的流程。當(dāng)然,這只是最簡單的配置,如果你需要更高級的特性(比如 HTTPS、負(fù)載均衡或緩存),則需要進(jìn)行更多的配置。建議查閱 Nginx 官方文檔 獲取更詳細(xì)的信息。
通過Supervisor來托管gunicorn和nginx
我是在第二份工作中才接觸到supervisor的,了解之后就非常喜歡這個工具,最大好處就是托管某一個進(jìn)程,尤其是如果進(jìn)程出現(xiàn)問題死掉了,supervisor會自動嘗試重啟這個進(jìn)程,這個對于線上環(huán)境來說非常重要。
Supervisor
是一個用 Python 寫的進(jìn)程管理工具,可以很方便地用來在 UNIX-like 系統(tǒng)(不支持Windows)下啟動、重啟(自動)和關(guān)閉進(jìn)程。
以下是如何使用 Supervisor 托管 gunicorn 和 nginx 的步驟:
-
安裝 Supervisor
在 Ubuntu/Debian 上,你可以通過 apt-get 來安裝 Supervisor:
sudo apt-get install supervisor
-
創(chuàng)建 Supervisor 配置文件
你需要為每個要由 Supervisor 管理的程序創(chuàng)建一個配置文件。這些文件通常位于
/etc/supervisor/conf.d/
目錄下,并且以.conf
結(jié)尾。如上假設(shè),Django 項目路徑為
/path/to/myproject/
,Gunicorn 的配置文件名為gunicorn_config.py
,那么我們需要為 Gunicorn 創(chuàng)建一個名為myproject_gunicorn.conf
的文件:# /etc/supervisor/conf.d/myproject_gunicorn.conf[program:myproject_gunicorn] command=/usr/local/bin/gunicorn myproject.wsgi:application -c /path/to/myproject/gunicorn_config.py directory=/path/to/myproject/ user=yourusername autostart=true autorestart=true redirect_stderr=true
同樣,我們也需要為 Nginx 創(chuàng)建一個名為
nginx.conf
的文件:# /etc/supervisor/conf.d/nginx.conf[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true redirect_stderr=true
-
運行 Supervisor
安裝完 Supervisor 并創(chuàng)建了相關(guān)的配置文件后,你就可以讓 Supervisor 開始工作了。首先,你需要讀取所有新的或修改過的配置文件:
sudo supervisorctl reread
接著,你可以更新 Supervisor 服務(wù)的狀態(tài),使其開始運行新添加的程序:
sudo supervisorctl update
或者,如果你想單獨啟動某個程序,比如
myproject_gunicorn
(也就是上面的Django),你可以這樣做:sudo supervisorctl start myproject_gunicorn