環(huán)境
主機(jī) | ip | 用途 | 軟件 |
---|---|---|---|
web1 | 192.168.50.60 | Nginx-1 | httpd |
web2 | 192.168.50.61 | nginx-2 | httpd |
proxy | 192.168.50.62 | 負(fù)載均衡器 | nginx |
負(fù)載均衡策略
nginx的負(fù)載均衡用于upstream模板定義的后端服務(wù)器列表中選取一臺服務(wù)器接收用戶的請求。一個基本的upstream模塊如下:
upstream [服務(wù)器組名稱]{ server [IP地址]:[端口號]; server [IP地址]:[端口號]; .... }
在upstream模塊配置完成后,要讓指定的訪問反向代理到服務(wù)器列表,格式如下:
location ~ .*$ { index index.jsp index.html; proxy_pass http://[服務(wù)器組名稱]; }
這樣就完成了最基本的負(fù)載均衡,但是這并不能滿足實際需求。目前Nginx的upstream模塊支持6種方式的負(fù)載均衡策略(算法):
輪詢
最基本的配置方法,是upstream模塊默認(rèn)的負(fù)載均衡策略。每個請求會按時間順序平均分配到不同的后端服務(wù)器。有如下參數(shù):
fAIl_timeout與max_fails結(jié)合使用 max_fails在fail_timeout參數(shù)設(shè)置的時間內(nèi)最大失敗次數(shù)。如果在這個時間內(nèi),所有該服務(wù)器的請求都失敗了,那么認(rèn)為該服務(wù)器停機(jī) fail_time服務(wù)器被認(rèn)為停機(jī)的時長,默認(rèn)10s(被認(rèn)為停機(jī)的服務(wù)器嘗試間隔?) backup標(biāo)記該服務(wù)器為備用服務(wù)器。當(dāng)主服務(wù)器停止時,請求會被發(fā)送到它這里 down標(biāo)記服務(wù)器永久停機(jī)
注意:1.down標(biāo)記的服務(wù)器會自動剔除;2.缺省就是輪詢;3.此策略適合服務(wù)器配置無狀態(tài)且短平塊的服務(wù)使用
weight
權(quán)重方式,在輪詢策略的基礎(chǔ)上指定輪詢的幾率。也可以認(rèn)為是在輪詢的基礎(chǔ)上新增了一個weight的參數(shù),此參數(shù)指定輪詢的幾率,值為number。upstream模塊配置模板如下:
upstream [服務(wù)器組名稱]{ server [IP地址]:[端口號] weight=2; server [IP地址]:[端口號]; .... }
在該例子中,沒有weight參數(shù)的服務(wù)器默認(rèn)為1,weight的數(shù)值與訪問比例成正比,所有weight值的總和為一個循環(huán)單位,服務(wù)器自身的weight值為循環(huán)單位內(nèi)的輪詢次數(shù)。
注意:1.權(quán)重越高分配到的請求越多; 2.此策略可以和least_conn策略、iphash策略結(jié)合使用; 3.此策略比較適合服務(wù)器硬件配置差距較大的情況。
ip_hash
依據(jù)ip分配方式,指定負(fù)載均衡器按照基于客戶端IP的分配方式,這個方法確保了相同的客戶端請求一致發(fā)送到相同的服務(wù)器,以保證session會話。這樣每個訪客都固定訪問一個后端服務(wù)器,可以解決session不能跨服務(wù)器的問題。upstream模塊配置模板如下:
upstream [服務(wù)器組名稱]{ ip_hash; server [IP地址]:[端口號] weight=2; server [IP地址]:[端口號]; .... }
注意:1.nginx1.3.1之前的版本不能在ip_hash中使用權(quán)重(weight);2..ip_hash不能與backup同時使用;3.此策略適合有狀態(tài)服務(wù)的程序,比如session;4.當(dāng)有服務(wù)器需要剔除,必須手動down掉。
least_conn
最少連接方式,把請求發(fā)給鏈接數(shù)最少的后端服務(wù)器。輪詢是把請求平均分配給各個后端,使它們的負(fù)載大致相同。但是,有些請求占用的時間很長,會導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果。upstream模塊配置模板如下:
upstream [服務(wù)器組名稱]{ least_conn; server [IP地址]:[端口號] weight=2; server [IP地址]:[端口號]; .... }
注意:此策略適合請求處理時間長短不一造成的服務(wù)器過載情況。
fair
響應(yīng)時間方式,按照服務(wù)器端的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。upstream模塊配置模板如下:
upstream [服務(wù)器組名稱]{ server [IP地址]:[端口號] weight=2; server [IP地址]:[端口號]; .... fair; }
注意:需要安裝第三方插件。
url_hash
url分配方式,按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,要配合緩存命中來使用。同一個資源多次請求可能會到達(dá)不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達(dá)同一臺服務(wù)器,一旦緩存住了資源,再次收到請求,就可以在緩存中讀取。upstream模塊配置模板如下:
upstream [服務(wù)器組名稱]{ hash $request_uri; server [IP地址]:[端口號] weight=2; server [IP地址]:[端口號]; .... }
注意:1.需要安裝第三方插件;2.uri,是i,不是小寫的L。
安裝proxy
proxy 機(jī)器 編譯安裝nginx
工具包安裝
wget http://nginx.org/download/nginx-1.14.2.tar.gz yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
解壓安裝
tar xf nginx-1.14.1.tar.gz -C /usr/local/src/ cd /usr/local/src/nginx-1.14.1/ ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module make && make install echo $?
參數(shù)說明:
--with-http_dav_module,啟用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:創(chuàng)建集合,COPY和MOVE方法)默認(rèn)情況下為關(guān)閉,需編譯開啟; --with-http_stub_status_module,啟用ngx_http_stub_status_module支持(獲取nginx自上次啟動以來的工作狀態(tài)); --with-http_addition_module,啟用ngx_http_addition_module支持(作為一個輸出過濾器,支持不完全緩沖,分部分響應(yīng)請求); --with-http_sub_module,啟用ngx_http_sub_module支持(允許用一些其他文本替換nginx響應(yīng)中的一些文本); --with-http_flv_module,啟用ngx_http_flv_module支持(提供尋求內(nèi)存使用基于時間的偏移量文件); --with-http_mp4_module,啟用對mp4文件支持(提供尋求內(nèi)存使用基于時間的偏移量文件)。
生成nginx 用戶
useradd -M -s /sbin/nologin nginx
啟動和自啟
/usr/local/nginx/sbin/nginx echo /usr/local/nginx/sbin/nginx >> /etc/rc.local chmod +x /etc/rc.d/rc.local
如果防火墻是開啟的記得添加端口號firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
conf 文件修改
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak vim /usr/local/nginx/conf/nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type Application/octet-stream; sendfile on; keepalive_timeout 65; server_tokens off; upstream htmlservers { server 192.168.50.60:80 weight=1; server 192.168.50.61:80 weight=1; } upstream phpservers{ server 192.168.50.60:80 weight=1; server 192.168.50.61:80 weight=1; } upstream picservers { server 192.168.50.60:80 weight=1; server 192.168.50.61:80 weight=1; } include vhosts/*.conf; }
vim /usr/local/nginx/conf/vhosts/upstream.conf
server { listen 80; server_name localhost; location / { if ($request_uri ~* .html$){ proxy_pass http://htmlservers; } if ($request_uri ~* .php$){ proxy_pass http://phpservers; } proxy_pass http://picservers; } }
web服務(wù)器安裝
安裝
yum install httpd -y
設(shè)置主頁文件并啟動
echo web1 > /var/www/html/index.htmlecho web2 > /var/www/html/index.html echo php1 > /var/www/html/index.phpecho php2 > /var/www/html/index.phpecho jsp1 > /var/www/html/index.jspecho jsp2 > /var/www/html/index.jspsystemctl start httpd
如果防火墻是開啟的,記得添加端口號firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload