Nginx的反向代理及負載均衡

1.集羣的簡介
php

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

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

2.負載均衡集羣nginx

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

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

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

3.Nginx負載均衡集羣介紹後端

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

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

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

4.Nginx負載均衡的配置

    本次實驗的圖解以下,很基礎的一個負載均衡實驗。負載均衡的高可用性之後再說。Nginx負載均衡器接收到請求後會把數據分發到後端的web01和web02服務器上,web0一、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配置的日誌信息和前面的一致。到這裏,基本就配置完成了。

相關文章
相關標籤/搜索