Nginx的反向代理及負載均衡

1.集羣的簡介

    簡單來說,集羣就是指一組相互獨立的計算機,利用高速通信網絡組成的一個較大的計算機服務系統,每個集羣節點都是運行各自服務的獨立服務器。這些服務器之間可以彼此通信,協同向用戶提供應用程序、系統資源和數據,並以單一系統的模式加以管理。當用戶客戶機請求集羣系統時,集羣給用戶的感覺就是一個單一的服務器,而實際上用戶請求的是一組集羣服務器。

    集羣主要包括幾大特點:高性能、價格有效性、可伸縮性、高可用性、透明性、可管理性和可編程性。

2.負載均衡集羣

    常見的負載均衡的架構包括有負載均衡集羣、高可用性集羣、高性能計算集羣等等。這裏着重介紹負載均衡集羣,其他的集羣方式不做介紹。

    負載均衡集羣爲企業提供了更爲實用、性價比更高的系統架構解決方案。負載集羣可以把很多客戶集中的訪問請求負載壓力儘可能平均分攤到計算機集羣中處理。客戶訪問請求負載均衡通常包含應用程序處理負載均衡和網絡流量負載。這樣的系統非常適合使用同一組應用程序爲大量用戶提供服務的模式,每個節點都可以承當一定的訪問請求負載壓力,並且可以實現訪問請求在各節點之間動態分配,以實現負載均衡。

    負載均衡集羣運行時,一般是通過一個或多個前端負載均衡器將客戶訪問請求分發到後端的一組服務器上,從而達到整個系統的高性能和高可用性。一般高可用性集羣和負載均衡集羣使用類似的技術,或同事具有高可用與負載均衡的特點。負載均衡的作用爲:分擔用戶訪問及數據流量、保持業務的連續性、應用於Web業務及數據庫從庫等服務器的業務。

3.Nginx負載均衡集羣介紹

    互聯網企業中常見的開源集羣軟件有:Nginx、LVS、Haproxy、Keepalived等,硬件有F5、Netscaler等。

    嚴格地說,Nginx僅僅是作爲Nginx Proxy反向代理使用的,因爲反向代理功能表現的效果是負載均衡集羣的效果,所以也叫做Nginx負載均衡。反向代理和負載均衡的區別在於負載均衡通常都是對請求的數據包的轉發(也有可能會改寫數據包)、傳遞,其中DR模式明顯的特徵就是從負載均衡下面的節點服務器來看,接收到的請求還是來自負載均衡器的客戶端的真實用戶。而反向代理,反向代理接收訪問用戶的請求後,會代理用戶重新發起請求代理下的節點服務器,最後把數據返回給客戶端用戶。在節點服務器來看,訪問節點服務器的客戶端用戶是反向代理服務器,而不是真實的網站訪問用戶。

    Nginx負載均衡的模塊主要有兩個,ngx_http_proxy_module,ngx_http_upstream_module。編譯的時候需要把這兩個模塊編譯進去。

4.Nginx負載均衡的配置

    本次實驗的圖解如下,很基礎的一個負載均衡實驗。負載均衡的高可用性以後再說。Nginx負載均衡器接收到請求後會把數據分發到後端的web01和web02服務器上,web01、web02上已經搭建了Nginx服務,並且搭建了兩個虛擬主機www和bbs。

image.png

    (1)配置Web01和Web02服務器,搭建虛擬主機

    Web01和Web02的配置如下,nginx.conf文件。可以參見之前的博客。

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	server_tokens off;    #這個是關閉nginx版本號
	client_max_body_size 8m;    #限制上傳文件的大小
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	                  '$status $body_bytes_sent "$http_referer" '
					  '"$http_user_agent" "$http_x_forwarded_for"';
					  
	include extra/www.conf;
	include extra/bbs.conf;

}

 

Web01,www.conf文件Web01,bbs.conf文件

server {

listen       80;

server_name  www.pcm.com pcm.com;

access_log logs/access.log main;

location / {

root   html/www;

index  index.html index.htm;

}

location ~ .*\.(php|php5)?$ {

root html/www;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

}

server {

listen       80;

server_name  bbs.pcm.com;

access_log logs/access.log main;

location / {

root   html/bbs;

index  index.html index.htm;

}

location ~ .*\.(php|php5)?$ {

root html/bbs;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

}

    Web02的文件參數也一樣,語法檢查沒有問題之後重新加載nginx的配置文件

 

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

    填充測試文件,以web01爲例,web02也同理

echo "這是www站點,IP地址爲:192.168.31.10" >/usr/local/nginx/html/www/index.html
echo "這是bbs站點,IP地址爲:192.168.31.10" >/usr/local/nginx/html/bbs/index.html

    修改hosts文件,最後在web01和web02本機上測試,得出的結果如下。

image.pngimage.png

    (2)在Nginx負載均衡服務器上安裝Nginx服務

./configure --prefix=/usr/local/nginx-1.12.2 --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
make
make install

    (3)修改nginx.conf配置文件如下,加入web、bbs地址池,然後啓用

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	upstream www_server_pools {
		server 192.168.31.10:80 weight=1;
		server 192.168.31.11:80 weight=1;
	}
	upstream bbs_server_pools {
		server 192.168.31.10:80 weight=1;
		server 192.168.31.11:80 weight=1;
   }
   server {
        listen       80;
        server_name  www.pcm.com;
        location / {
			proxy_pass http://www_server_pools;
        }
	}
    server {
        listen       80;
        server_name  bbs.pcm.com;
        location / {
			proxy_pass http://bbs_server_pools;
        }
	}
    
}

    (4)檢查語法沒有問題之後,重新加載nginx.conf文件。

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

    (5)修改hosts文件

image.png

    (6)檢驗效果,從結果上我們看到設置的負載均衡已經起效了,按照權重輪詢分發數據包。但是設置的bbs虛擬主機的負載均衡不起效,同樣給到了www虛擬主機去處理了。

image.png

    (7)增加proxy_set_header字段,實現虛擬主機的訪問。上面出錯的原因在於:雖然用戶訪問了帶www,bbs這些主機頭請求nginx反向代理服務器,但是反向代理服務器向下面的節點重新發出請求時,默認沒有在請求頭裏告訴節點服務器要找哪臺虛擬主機。所以,web節點服務器接收到信息後發現沒有主機頭信息,因此,就把節點服務器的第一個虛擬主機發給了反向代理了。解決這個問題的辦法就是當反向代理服務器重新發起請求時,要攜帶主機頭信息,以明確告訴節點服務器要找哪個主機。具體的配置很簡單,就在Nginx代理www和bbs服務虛擬主機配置裏面增加一行

proxy_set_header Host $host;

image.pngimage.png

    重新加載Nginx服務後,用curl檢查,發現成功了。

image.png

    (8)增加節點服務器記錄的IP字段。

    默認情況下,節點服務器只能記錄到反向代理服務器的IP地址,而記錄不到請求客戶端真實的IP地址。原因就是前面說到的反向代理和負載均衡的一個明顯的區別,要讓下面的節點服務器能記錄客戶端的IP,那就需要讓反向代理服務器發出請求的時候帶上客戶端的IP信息。配置也很簡單,只需要加上一個字段即可:

 proxy_set_header X-Forwarded-For $remote_addr;

image.pngimage.png

    檢查語法之後重新加載nginx服務,然後用瀏覽器訪問,到節點服務器上看到對應的日誌信息:

image.png

image.png

    PS:有這個日誌信息的前提是,節點服務器的nginx.conf配置的日誌信息和前面的一致。到這裏,基本就配置完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章