uWSGI
uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI伺服器進行交換。
要注意 WSGI / uwsgi / uWSGI 這三個概念的區分。
- WSGI是一種通訊協議,Flask,webpy,Django、CherryPy等等都自帶WSGI,不過效能都不好。
- uwsgi同WSGI一樣是一種通訊協議。
- 而uWSGI是實現了uwsgi和WSGI兩種協議的Web伺服器。
為什麼有了uWSGI為什麼還需要nginx?因為nginx具備優秀的靜態內容處理能力,然後將動態內容轉發給uWSGI伺服器,這樣可以達到很好的客戶端響應。
安裝
pip install uwsgi複製程式碼
編寫uwsgi.ini檔案
在專案目錄下touch一個ini檔案,名稱隨意,vim進去,複製以下程式碼
[uwsgi]
socket = 0.0.0.0:8000 # 設定0.0.0.0表示可以接收不同伺服器的nginx傳送過來的請求,127.0.0.1表示只接收同一伺服器傳送過來的請求, 8000為應用內的監聽埠# http = 0.0.0.0:8000 # http為直接作為web伺服器啟動
chdir = /knowledge # 指向專案目錄
wsgi-file = app.py # 程式啟動檔案
callable = app # 程式內應用變數名
processes = 2 # 處理器數量
threads = 4 # 執行緒數複製程式碼
啟動應用
uwsgi --ini uwsgi.ini # 啟動後直接進控制檯nohup uwsgi --ini uwsgi.ini & # 後臺啟動uwsgi伺服器kill -9 pid # 關閉服務,直接kill uwsgi的埠複製程式碼
nginx
什麼是nginx?
nginx是一款輕量級的Web 伺服器 、反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。主要有反向代理,負載均衡的功能。
什麼是反向代理?
正向代理是伺服器經過正向代理伺服器把資料給到客戶端,反向代理就是多個不同的客戶端發出請求到反向代理伺服器(nginx),反向代理伺服器按照一定規則把請求分發給伺服器A,伺服器B,伺服器C。
正向代理客戶端非常明確要訪問的伺服器地址,伺服器只清除請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端。反向代理客戶端不知道訪問的伺服器地址是哪個,只能由反向代理伺服器去分配請求給某個具體的伺服器。
什麼是負載均衡?
將伺服器接收到的請求按照規則分發的過程。
- weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器當機,nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重資料越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的。
- ip_hash: 每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器,這也在一定程度上解決了叢集部署環境下session共享的問題。
- fair: 智慧調整排程演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種排程演算法。但是需要注意的是nginx預設不支援fair演算法,如果要使用這種排程演算法,請安裝upstream_fair模組
- url_hash: 按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態伺服器的情況下提高快取效率。同樣要注意nginx預設不支援這種排程演算法,要使用的話需要安裝nginx的hash軟體包
安裝nginx
apt-get install nginx複製程式碼
nginx常用命令
service nginx start # 啟動
service nginx stop # 停止
service nginx reload # 重啟
service nginx status # 檢視nginx狀態
nginx -v # 檢視版本複製程式碼
配置檔案
cd 到安裝目錄,一般是/etc/nginx,裡面有個nginx.conf檔案
vim 進去,匹配順序是先ip > 埠 > location
http {
server {
listen 81; # nginx的監聽埠,瀏覽器訪問的埠,等同於0.0.0.0:81, 表示可以接收任何IP發的請求
server_name 0.0.0.0; # 可以直接寫域名如:www.flasktest.com,但是需要在hosts檔案設定IP和域名的對應關係
charset UTF-8;
access_log /etc/nginx/FlaskTest_access.log;
error_log /etc/nginx/FlaskTest_error.log;
client_max_body_size 75M; # 請求檔案的最大大小
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:82; # 上面的匹配成功後,會請求這個地址
uwsgi_read_timeout 2;
}
}
}複製程式碼