負載均衡在服務端開發(fā)中算是一個比較重要的特性。因為Nginx除了作為常規(guī)的Web服務器外,還會被大規(guī)模的用于反向代理后端,Nginx的異步框架可以處理很大的并發(fā)請求,把這些并發(fā)請求hold住之后就可以分發(fā)給后臺服務端(backend servers, 后面簡稱backend)來做復雜的計算、處理和響應,并且在業(yè)務量增加的時候可以方便地擴容后臺服務器。
說白了就是,隨著業(yè)務和用戶規(guī)模的增長,僅僅一臺服務器無法肩負起高并發(fā)的響應,所以需要兩臺以上的服務器共同分擔壓力,而分擔壓力的媒介就是萬能的Nginx。
首先,利用wsgi在不同的端口上起兩個Django服務,比如8000和8001(不用啟動nginx服務)
然后修改nginx網站配置,將原uwsgi_pass注釋,改成變量綁定
server { listen 8000; server_name localhost; access_log /root/myweb_access.log; error_log /root/myweb_error.log; client_max_body_size 75M; location / { include uwsgi_params; uwsgi_pass mytest; #uwsgi_pass 127.0.0.1:8001; uwsgi_param UWSGI_SCRIPT video_back.wsgi; uwsgi_param UWSGI_CHDIR /root/video_back; } location /static { alias /root/video_back/static; } location /upload { alias /root/video_back/upload; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } server { listen 80; server_name localhost; access_log /root/video_vue_access.log; error_log /root/video_vue_error.log; client_max_body_size 75M; location / { #include uwsgi_params; # uwsgi_pass 127.0.0.1:8000; #uwsgi_pass mytest; root /root/video_vue; index index.html; try_files $uri $uri/ /index.html; } location /static { alias /root/video_vue/static; } error_log /root/video_vue/error.log error; }
然后修改主配置文件 vim /etc/nginx/nginx.conf,在http配置內添加負載均衡配置
user root; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; upstream mytest { server 39.106.172.65:8000 weight=3; #負載均衡服務器群 server 39.97.117.229:8001 weight=7; } }
然后重啟服務即可:
systemctl restart nginx.service
值得注意的是常用的負載均衡策略有以下幾種: 1、輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。 upstream backserver { server 192.168.0.14; server 192.168.0.15; } 2、權重 weight 指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。 upstream backserver { server 192.168.0.14 weight=3; server 192.168.0.15 weight=7; } 3、ip_hash( IP綁定) 上述方式存在一個問題就是說,在負載均衡系統(tǒng)中,假如用戶在某臺服務器上登錄了,那么該用戶第二次請求的時候,因為我們是負載均衡系統(tǒng),每次請求都會重新定位到服務器集群中的某一個,那么已經登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。 我們可以采用ip_hash指令解決這個問題,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。 upstream backserver { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 4、fair(第三方插件) 按后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配。 upstream backserver { server server1; server server2; fair; } 5、url_hash(第三方插件) 按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。 upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }