當在業(yè)務增長圈匆,生產環(huán)境里有很大的流量產生和比較高的并發(fā)量產生時扑毡,一般單機模式的服務已經不再適合業(yè)務的需求探遵。所以多機的負載均衡技術來做負載優(yōu)化就很有必要了柳沙。Nginx不光可以實現(xiàn)web Server岩灭,還可以作為HTTP反向代理服務器分發(fā)客戶端請求和流量給后端RS,以此提高服務的性能和降低服務器的壓力赂鲤。Nginx的負載均衡依賴于ngx-http-upstream-module模塊噪径,所支持的代理模式有proxy-pass、fastcgi-pass数初、memcache-pass找爱。Nginx的反向代理效果充當了負載均衡的流量分發(fā)效果,類似的負載均衡效果的軟件有LVS集群泡孩、haproxy车摄。為了高可用集群,LVS+Keepalived和Nginx+Keepalived仑鸥、haproxy+Keepalived集群保證高可用容災負載均衡集群吮播。下面介紹Nginx負載均衡。
1. Nginx常用負載均衡算法:
- 輪詢(默認算法):簡稱RR---每個請求會依次分配給后端RS不同應用程序服務器眼俊,后端RS實際的壓力會忽略不計意狠。
- 加權輪詢:權重越大的服務器,被Nginx分配的請求次數(shù)會越多疮胖,適合用于后端RS中性能不一致的情況摄职,這種算法可以充分利用不同后端RS的配置性能。
- IP HASH:當同IP進行重復訪問時會被指定到上次訪問的服務器获列,如果后端超載谷市,請求分發(fā)到別的服務器』骱ⅲ可以解決session動態(tài)網站共享問題迫悠。
2. Nginx配置文件常用配置參數(shù):
- server 192.168.74.1:80 負載均衡后端RealServer的IP或者域名,端口默認為80,巩梢;在高并發(fā)請求下寫域名创泄,再通過DNS進行負載均衡艺玲。
- weight:權重,默認為1鞠抑,在配置文件里面饭聚,權重越大的服務器接收的請求越多。
- max_fails:失敗嘗試的失敗次數(shù)搁拙,默認是1,禁止失敗嘗試是0秒梳。
- fail_timeout:失敗超時時間,默認是10秒箕速,通常3秒比較好酪碘。
- backup:熱備配置,master負載均衡器出現(xiàn)問題后會自動接收Master的所有資源和VIP(Virtual IP address)盐茎;backup服務器兴垦。
- down:標志服務器不可用,這個參數(shù)通常配合IP_hash使用字柠。
3. Ngxin負載均衡設置:
- 默認負載均衡設置:
http{#upstream模塊包含在http模塊下
upstream kiwis{#定義upstream名字探越,下面會引用
server 192.168.74.133;#后端負責處理真正請求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 當用戶訪問www.kiwis.com時窑业,Nginx會把請求分發(fā)給后端的三個RS扶关。
- 加權負載均衡設置。
http{#upstream模塊包含在http模塊下
upstream kiwis{#定義upstream名字数冬,下面會引用
server 192.168.74.133 weight=3;#后端負責處理真正請求的RS的ip地址;權重為3
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80节槐;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 加權負載均衡中,每5個請求分配給192.168.74.133拐纱,然后第4铜异、5個請求依次分配給后兩個服務器,如此循環(huán)操作秸架。
- IP HASH負載均衡:
http{#upstream模塊包含在http模塊下
upstream kiwis{#定義upstream名字揍庄,下面會引用
ip_hash;#采用IP HASH算法
server 192.168.74.133;#后端負責處理真正請求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 如果需要將同一個客戶端請求綁定到相同得到后端服務器上东抹,可以使用ip_hash負載均衡蚂子,除非該服務器不可用。
- Nginx高可用實現(xiàn)缭黔,利用backup標簽食茎,可以實現(xiàn)高可用;Master服務器故障馏谨;backup服務器可以自動接管服務别渔;期間接管服務的時間是1秒甚至更短,可以保證服務不中斷;對于客戶端來說是透明的哎媚。當Matser服務器修復喇伯,backup會自動放棄服務。
http{#upstream模塊包含在http模塊下
upstream kiwis{#定義upstream名字拨与,下面會引用
server 192.168.74.133;#后端負責處理真正請求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130 backup;
}
server {
listen 80稻据;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
3. Nginx的http_proxy_module模塊常用參數(shù)。
- Nginx的upstream模塊相當于是建立一個函數(shù)庫买喧,把后端的服務器地址放在一個池子里面捻悯,而proxy模塊則是從這個池子里調用了這些服務器,http_proxy_module模塊常用參數(shù):
- proxy_set_header:讓后端服務器能獲取到前端用戶真實IP岗喉,而不只是代理服務器的IP。
- proxy_set_header Host $host:當后端服務器配置了多個應用時炸庞,該選項可以讓服務器識別出具體要訪問的是哪個應用钱床,而不會將第一個站點作為默認應用傳遞給用戶。
- proxy_set_header X-Forward-For $remote_addr:如果后端服務器需要獲取用戶的真實IP埠居,需要該選項查牌。
- client_body_buffer_size:客戶端請求主體緩沖區(qū)大小。
- proxy_connect_timeout:代理服務器和后端服務端握手鏈接時間滥壕。
- proxy_send_timeout:后端服務器回傳數(shù)據(jù)給Nginx的時間纸颜,需要在設置的時間內發(fā)送完所有的數(shù)據(jù);如果沒有發(fā)送完數(shù)據(jù)绎橘,Nginx將斷開數(shù)據(jù)鏈接胁孙。
- proxy_read_timeout:代理服務器和后端服務器連接成功后,等待后端服務器響應的時間称鳞。
+Nginx作反向代理涮较,獲取客戶端的真實IP地址,轉發(fā)動態(tài)頁面給Tomcat進行處理冈止。
location ~\.( jsp | jspx )?${
proxy_set_header Host $host;
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy-add_x_forward_for;
proxy_pass http://tomcat.server
}
4. Nginx的配置文件說明:
- 在此記錄Nginx服務器nginx.conf的配置文件說明:
#定義運行用戶和用戶組狂票,此用戶必須在系統(tǒng)存在;可以是nologin
user nginx nginx熙暴;
#啟動進程闺属,通常設置為何cpu數(shù)量相等
worker_process 8;
#全局錯誤日志及pid文件
error_log /var/log/nginx/error.log;#錯誤日志定義等級 [debug|info|notice|warn|error|crit]
pid /var/run/nginx.pid;#指定進程id的存儲文件位置
worker_rilimit_nofile 65535;#一個nginx進程最多打開的文件描述符數(shù)目,理論值是最大打開文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進程數(shù)相除周霉;nginx請求分配不均掂器,網上有些博客建議與ulimit -n數(shù)目相等
#工作模式及連接上限
events{
use epoll; #epoll是多路復用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內核俱箱,可以大大提高nginx的性能唉匾;除此之外還有select、poll、kqueue巍膘、rtsig和/dev/poll模式
worker_connetctions 1024;#單個后臺worker process進程的最大并發(fā)連接數(shù)
#multi_accept on;
}
#設置http服務器厂财,利用它反向代理功能提供負載均衡實現(xiàn)
http{
#設定mime類型,類型有mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定日志格式
access_log /var/nginx/access.log;
#sendfile指令指定nginx是否調用sendfile函數(shù)(zero copy)來輸出文件峡懈,對于普通的應用璃饱。
#必須設置為on,如果用來進行下載等應用磁盤IO負載應用肪康,可設置為off荚恶,以平衡磁盤與網絡I/O處理速度,降低系統(tǒng)的uptime磷支。
sendfile on;
# tcp_nopush on;
# 連接超時時間
#Keepalive_timeout 0;
Keepalive_timeout 65;
tcp_nodelay on;
#開啟gzip壓縮
gzip on谒撼;
gzip_disable "MSIE[1-6]\.(?!.*SV1)";
#設定請求緩沖
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# 設定負載均衡的服務器列表
upstream myServer{
#weight參數(shù)表示權值,權值越高被分配到的幾率就越大
#本機上開啟80端口
server 192.168.74.2:80 weight=5雾狈;
server 192.168.74.3:80 weight=1廓潜;
server 192.168.74.4:80 weight=8;
}
server{
#偵聽81端口
listen 81善榛;
#定義使用www.kiwis.com訪問
server_name www.kiwis.com;
#設定本虛擬機訪問的日志
access_log logs/www.kiwis.com.access.log main;
#默認請求
location / {
root /root/www; #定義服務器的默認網站根目錄位置
index index.php index.html index.htm;# 定義首頁索引文件的名稱
fastcgi_pass www.kiwis.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
#定義錯誤提示頁面
error_page 500 502 503 504 /50.x.html;
location =/50x.html{
root /root/www;
}
#靜態(tài)文件辩蛋,nginx自己處理
location ~ ^/(images|javascript|js|css|flash|media|static)/{
root /var/www/virtual/htdocs/public;
#過期20天,靜態(tài)文件更新頻率低移盆,過期可以根據(jù)需要設置
expires 20d;
}
#PHP腳本請求全部轉發(fā)到FASTCGI處理悼院,使用FastCGI默認設置
location ~ \.php$ {
root /root/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#設定查看Nginx狀態(tài)的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpassword;
}
#禁止訪問 .js文件
location ~ /\.js {
deny all;
}
}
}
nginx的基本配置參數(shù)大概如上所示,安裝Nginx實現(xiàn)負載均衡參見另外一篇文章咒循。