Nginx + uWSGI 部署Django 項目,並實現負載均衡


一.uWSGI服務器

uWSGI是一個 Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。
要注意 WSGI / uwsgi / uWSGI 這三個概念的區分。
  • WSGI是一種通信協議。
  • uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。
  • 而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。
uwsgi協議是一個uWSGI服務器自有的協議,它用於定義傳輸信息的類型(type of information),每一個uwsgi packet前4byte為傳輸信息類型描述,它與WSGI相比是兩樣東西。
 
Nginx: 和uWSGI一樣也是一個Web服務器, Nginx在處理靜態內容方面具有強大的能力(Nginx也可以實現負載均衡),uWSGI負責Python這樣的動態內容,二者配合共同提供Web服務以實現提高效率和負載均衡等目的, 請求和響應的流程如下:
  Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response
請求先交由Nginx,如果是靜態內容就自己處理了,如果是動態內容就交給uWSGI服務器,uWSGI服務器處理整個Django項目的Python代碼,響應請求,原路返回,Nginx、uWSGI和Django可以獨立部署,然后整合。
 

二.Django 項目代碼部署

一個django項目最基本的目錄結構如下 /root/blog/

blog
├── manage.py
├── blog
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── apps
├── static
└── templates

apps 目錄為應用目錄,如果需要將該目錄下的應用在配置文件中進行有效的注冊,以及在項目下的urls.py中路由到應用需要在settings.py中進行路徑的配置

使用django自帶的服務器進行項目的測試 ,進入manage.py文件所在目錄下:

python ./manage.py runserver 127.0.0.1:8080

如果項目的運行還需要啟動其他服務,也先將其進行啟動, 如celery, redis, mysql, kafka,rabbitmq等項目中使用到的各種服務器

然后請求項目中的某個API,測試部署是否成功

二. 部署uWSGI服務器

1.在虛擬環境下安裝uWSGI服務器

pip install uwsgi。 

2.創建保存uWSGI服務器配置文件的目錄和文件

/root/blog/uWSGI_setting_file/uwsgi.ini
在 uwsgi.ini 文件內 定義以下內容:
[uwsgi] 
#使用nginx調度度服務器連接該uwsgi服務器時使用以下項 socket=127.0.0.1:8000
#直接使用uwsgi服務器做web服務器時使用以下項,服務器的ip和端口 # http=127.0.0.1:8000
#項目目錄, 指定到項目的目錄名稱(一般就是manage.py文件所在目錄的目錄名) chdir=/root/blog/
#項目中wsgi.py文件的目錄,相對於項目目錄(相對目錄) wsgi-file = blog/wsgi.py
# 啟動4個uwsgi進程 processes=4
# uwsgi進程中的線程數 threads=2
# 進程設置,無需變動 master=True
# 啟動服務器之后會生成文件uwgi.pid,uwsgi在哪個目錄啟動,就會在哪個目錄生成uwsgi.piduswgi.log文件 pidfile=uwsgi.pid
# 服務器啟動之后在后台運行,會生成文件uwsgi.log daemonize=uwsgi.log
# 指定虛擬環境的目錄 進入虛擬環境后可以使用which python 查看到虛擬環境所在路徑 virtualenv=/home/python/.virtualenvs/django_env_python3

注意:

uwsgi.ini 這個文件是uwsgi服務器的配置文件

用uwsgi服務器,需要先在settings.py設置:

  DEBUG=FALSE

  ALLOWED_HOSTS=[‘*’]

3.啟動uwsgi

進入目錄: /root/blog/uWSGI_setting_file/

uwsgi在哪個目錄啟動,就會在哪個目錄生成uwsgi.piduswgi.log文件。

# 啟動:(先將django自帶的server服務器停止運行)
uwsgi --ini uwsgi.ini 

# 停止:
uwsgi --stop uwsgi.pid 

# 重啟:
uwsgi --reload uwsgi.pid 

# 強制停止:
killall -9 uwsgi 

這里我們啟動uwsgi服務,可以通過 ps -ef | grep uwsgi 看到已經有四個uwsgi服務啟動。

訪問項目中的某個API,測試服務器是否運行成功

三. 安裝和配置Nginx

1. Ubuntu系統下安裝:

sudo apt-get install nginx

在服務器上創建目錄結構:/root/var/blog 

修改目錄權限:sudo chmod 777 /root/var/blog 

進入目錄: /root/var/blog/, 然后創建static目錄: mkdir static 

在配置文件setttings.py中進行配置

# 如果DEBUG=True   -> 使用項目目錄下static內的靜態文件 也就是STATIC_URL 所指向的路徑
# 如果DEBUG=False  -> 使用STATIC_ROOT指定目錄下的靜態文件
STATIC_URL = '/static/'
STATIC_ROOT = '/root/var/blog/static/'

# 設置靜態文件查找目錄,在終端使用命令收集到項目的靜態文件后,再去配置nginx服務器尋找靜態文件的路徑
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
# 如果是home路徑下則需要先設置目錄權限
# 在模板中使用 fileObj.fileFieldName.url 代表網絡可訪問的資源路徑
MEDIA_URL = '/media/' # 代表訪問media的url路徑,例如 127.0.0.1/media/1.png
# 無論是否debug,都會訪問此路徑下的media資源(包括上傳和訪問)
MEDIA_ROOT = '/var/www/NickBlog/media/'

在manage.py文件所在目錄下,輸入以下命令收集靜態文件.

python manage.py collectstatic

 2.配置

進入目錄/etc/nginx/sites-enabled/中可以看到一個default文件,修改default文件為如下內容

 
# site_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # 設置本地服務的端口
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
    # the port your site will be served on
    # 監聽主機的端口
    listen      80;
    # the domain name it will serve for
    # server_name .liqian.ink; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # 設置媒體文件目錄
    # Django media
    location /media  {
        alias /root/var/blog/media;  # your Django project's media files - amend as required
    }
    # 設置靜態文件目錄
    location /static {
        alias /root/var/blog/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     uwsgi_params; # the uwsgi_params file you installed
    }
}

3.啟動服務

啟動服務:nginx 
查看版本:nginx -v 
重啟服務:nginx -s reload 
停止服務:nginx -s stop

后續

發現一個問題,在另外一台機器上部署的時候無法成功進入django進程。 
/etc/nginx/nginx.conf內容設置為如下內容后,重啟成功

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#   # auth_http localhost/auth.php;
#   # pop3_capabilities "TOP" "USER";
#   # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#   server {
#       listen     localhost:110;
#       protocol   pop3;
#       proxy      on;
#   }
# 
#   server {
#       listen     localhost:143;
#       protocol   imap;
#       proxy      on;
#   }
#}

4.使用nginx實現負載均衡

在關於高並發負載均衡一文中已經提到,企業在解決高並發問題時,一般有兩個方向的處理策略,軟件、硬件,硬件上添加負載均衡器分發大量請求,軟件上可在高並發瓶頸處:數據庫+web服務器兩處添加解決方案,其中web服務器前面一層最常用的的添加負載方案就是使用nginx實現負載均衡。

 一、負載均衡的作用

1、轉發功能

按照一定的算法【權重、輪詢】,將客戶端請求轉發到不同應用服務器上,減輕單個服務器壓力,提高系統並發量。

2、故障移除

通過心跳檢測的方式,判斷應用服務器當前是否可以正常工作,如果服務器期宕掉,自動將請求發送到其他應用服務器。

3、恢復添加

如檢測到發生故障的應用服務器恢復工作,自動將其添加到處理用戶請求隊伍中。

二、Nginx實現負載均衡
同樣使用兩個tomcat模擬兩台應用服務器,端口號分別為8080 和8081

1、Nginx的負載分發策略

      Nginx 的 upstream目前支持的分配算法: 
1)、輪詢 ——1:1 輪流處理請求(默認)

      每個請求按時間順序逐一分配到不同的應用服務器,如果應用服務器down掉,自動剔除,剩下的繼續輪詢。 
2)、權重 ——you can you up
      通過配置權重,指定輪詢幾率,權重和訪問比率成正比,用於應用服務器性能不均的情況。 
3)、ip_哈希算法
      每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個應用服務器,可以解決session共享的問題。 

2、配置Nginx的負載均衡與分發策略

      通過在upstream參數中添加的應用服務器IP后添加指定參數即可實現,如:

  /etc/nginx/nginx.conf

   
upstream tomcatserver1 {  # tomcatserver1 這參數需要和 proxy_pass 定義的變量保持一致
    server 192.168.72.49:8080 weight=3;  權重3
    server 192.168.72.49:8081;  
    }   
  
 server {  
        listen       80;  
        server_name  8080.max.com;  
        #charset koi8-r;  
        #access_log  logs/host.access.log  main;  
        location / {  
            proxy_pass   http://tomcatserver1;  
            index  index.html index.htm;  訪問主頁時請求的靜態文件
        }  
     } 
復制代碼

      通過以上配置,便可以實現,在訪問8080.max.com這個網站時,由於配置了proxy_pass地址,所有請求都會先通過nginx反向代理服務器,在服務器將請求轉發給目的主機時,讀取upstream為 tomcatsever1的地址,讀取分發策略,配置tomcat1權重為3,所以nginx會將大部分請求發送給49服務器上的tomcat1,也就是8080端口;較少部分給tomcat2來實現有條件的負載均衡,當然這個條件就是服務器1、2的硬件指數處理請求能力。 

3、nginx其他配置

upstream myServer {    
  
    server 192.168.72.49:9090 down;   
    server 192.168.72.49:8080 weight=2;   
    server 192.168.72.49:6060;   
    server 192.168.72.49:7070 backup;   
}  

1)down

    表示單前的server暫時不參與負載

2)Weight

    默認為1.weight越大,負載的權重就越大。

3)max_fails

    允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤

4)fail_timeout

    max_fails 次失敗后,暫停的時間。

5)Backup

    其它所有的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。

三、使用Nginx的高可用 

      除了要實現網站的高可用,也就是提供n多台服務器用於發布相同的服務,添加負載均衡服務器分發請求以保證在高並發下各台服務器能相對飽和的處理請求。同樣,負載均衡服務器也需要高可用,以防如果負載均衡服務器掛掉了,后面的應用服務器也紊亂無法工作。

     實現高可用的方案:添加冗余。添加n台nginx服務器以避免發生上述單點故障。具體方案詳見下文:keepalive+nginx實現負載均衡高可用

四、總結

    總結一點,負載均衡不論是各種軟件或硬件上的解決方案,主要還是將大量的並發請求按照一定的規律分發給不同的服務器處理,從而減少某台服務器的瞬時壓力,提高網站的抗並發能力。nginx在負載均衡的應用之所以廣泛,筆者認為這歸功於它的靈活配置,一個nginx.conf文件解決大部分問題,不論是nignx創建虛擬服務器、nginx的反向代理服務器,還是本文介紹的nginx的負載均衡,幾乎都在這個配置文件中進行。服務器上只負責把nginx搭好,跑起來即可。而且它本身輕量級,不需要占用服務器太多資源就可以達到較好的效果

 

注意:

  1. 每次修改了Django項目中的模板/視圖/URL/配置文件,都需要重啟uwsgi服務。
  2. 修改Nginx配置文件,都需要重啟Nginx服務。

 

原文地址:  https://www.cnblogs.com/qlqwjy/p/8536779.html   https://blog.csdn.net/weixin_39198406/article/details/79277580

 
 
 
 
 
 
 
 


免責聲明!

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



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