uwsgi + nginx 部署python項目(一)


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;
                }

        }

        }

 測試


免責聲明!

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



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