天天看點

Nginx實戰進階篇一 Nginx反向代理及負載均衡實作過程部署

Ningx作為負載均衡器的同時也是反向代理服器,配置文法相當簡單,可以按輪詢、IP_hash、url_hash、權重等多種方法對後端的伺服器作負載均衡,同時還支援後端伺服器的健康檢查。另外,它相對于LVS比較有優勢的一點,由于它是基于第七層的負載均衡,是根據報頭内的資訊來執行負載均衡任務,是以對網絡的依賴比較小,理論上隻要ping得通就能夠實作負載均衡;在國内,Nginx不僅作為一款性能優異的負載均衡器,它同時也是一款适用于高并發環境的WEB應用軟體,在新浪、金山、迅雷線上等大型網站都得到了應用,其作為負載均衡器的優點如下: 

1.配置檔案非常簡單:風格跟程式一樣通俗易懂。 

2.成本低廉:Nginx為開源軟體,可以免費使用。而購買F5 BIG-IP、NetScaler等硬體負載均衡交換機則需要十多萬至幾十萬人民币。 

3.支援Rewrite重寫規則:能夠根據域名、URL的不同,将 HTTP 請求分到不同的後端伺服器群組。 

4.内置的健康檢查功能:如果 Nginx Proxy 後端的某台 Web 伺服器當機了,不會影響前端通路。 

5.節省帶寬:支援 GZIP 壓縮,可以添加浏覽器本地緩存的 Header 頭。 

6.穩定性高:用于反向代理,當機的機率微乎其微。特别是通過跟蹤一些已上線的項目,發現在高并發的情況下,Nginx作為負器均衡器/反向代理當機的次數幾乎是零。

缺點就是目前僅僅隻支援http和mail的負載均衡,不過我們可以取長被短,主要用它的支援Rewrite重寫規則和穩定性高的特點,将其中間層的負載均衡.

以上引用撫琴煮酒語錄!

--------------------------------------------------------------

<a target="_blank" href="http://blog.51cto.com/attachment/201303/170119973.jpg"></a>

實驗目的:

1、通過Nginx反向代理伺服器實作背景web伺服器的快速通路。

2、通過Nginx反向代理伺服器實作背景web伺服器群的負載均衡及備援備份

<b>前期準備工作:</b><b></b>

<b></b>

1、 單獨在Apache上部署web(www1.rsyslog.org)伺服器,并實作通路(簡單介紹)

配置一個簡單的Apache虛拟主機:

[root@rhel6u3-4 ~]#sed -i 's/#NameVirtualHost/NameVirtualHost/' /etc/httpd/conf/httpd.conf //将#去掉,啟動虛拟主機功能 

[root@rhel6u3-4 ~]# cat &gt;&gt; /etc/httpd/conf/httpd.conf &lt;&lt;endf //添加一台虛拟主機 

&gt; &lt;VirtualHost *:80&gt; 

&gt;     DocumentRoot /var/local/www 

&gt;     ServerName www1.rsyslog.org 

&gt; &lt;/VirtualHost&gt; 

&gt; endf 

[root@rhel6u3-4 ~]# mkdir /var/local/www1 //建立虛拟主機目錄 

[root@rhel6u3-4 ~]# echo "This is www1.rsyslog.org website" &gt;/var/local/www1/index.html //建立虛拟主機測試頁 

[root@rhel6u3-4 ~]# cat /var/local/www1/index.html  

This is www1.rsyslog.org website 

[root@rhel6u3-4 ~]# /etc/rc.d/init.d/httpd restart //重新開機httpd服務 

Stopping httpd:                                            [  OK  ] 

Starting httpd:                                            [  OK  ] 

[root@rhel6u3-4 ~]# 

[root@rhel6u3-2 ~]# vim /var/named/view/zone/Others.rsyslog.org.zone //在DNS伺服器上添加A記錄 

www1            A       192.168.100.104 

[root@rhel6u3-2 ~]# /etc/rc.d/init.d/named restart //重新開機DNS伺服器,使記錄生效 

Stopping named: .                                          [  OK  ] 

Starting named:                                            [  OK  ] 

[root@rhel6u3-4 ~]# cat /etc/resolv.conf  //在web伺服器上添加DNS位址,進行測試 

nameserver 192.168.100.102 

[root@rhel6u3-4 ~]# nslookup www1.rsyslog.org //通過nslookup先解析域名是否OK 

Server:     192.168.100.102 

Address:    192.168.100.102#53 

Name:   www1.rsyslog.org 

Address: 192.168.100.104 

[root@rhel6u3-4 ~]# links -dump http://www1.rsyslog.org //通過links指令測試網站是否能夠正常通路 

   This is www1.rsyslog.org website 

2、單獨在Nginx上部署web(www2.rsyslog.org)伺服器,并實作通路(簡單介紹)

//nginx搭建過程略 

[root@rhel6u3-5 ~]# vim /usr/local/nginx/conf/nginx.conf //在nginx.conf中添加一台虛拟主機 

http 

……… 

server { 

        listen       80; 

        server_name  www1.rsyslog.org  ; 

        location / { 

            root   www1; 

            index  index.html index.htm; 

        } 

……. 

[root@rhel6u3-5 ~]# mkdir /usr/local/nginx/www2 //建立虛拟主機目錄 

[root@rhel6u3-5 ~]# echo "This is www2.rsyslog.org website" &gt;/usr/local/nginx/www2/index.html //建立測試頁 

[root@rhel6u3-5 ~]# /etc/rc.d/init.d/nginx restart //重新開機nginx伺服器 

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok 

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 

Stopping nginx:                                            [  OK  ] 

Starting nginx:                                            [  OK  ] 

[root@rhel6u3-2 ~]# vim /var/named/view/zone/Others.rsyslog.org.zone //dns伺服器上添加A記錄 

www2    A       192.168.100.105 

[root@rhel6u3-4 ~]# nslookup www2.rsyslog.org //測試域名是否能夠正确解析 

Name:   www2.rsyslog.org 

Address: 192.168.100.105 

[root@rhel6u3-4 ~]# links -dump http://www2.rsyslog.org  //通過links指令測試網站是否能夠正常通路 

   This is www2.rsyslog.org website 

<b>1、 </b><b>部署</b><b>Nginx</b><b>反向代理伺服器,實作代理和負載均衡</b><b></b>

<b>Nginx</b><b>的</b><b>upstream</b><b>目前支援</b><b>5</b><b>種方式的配置設定</b><b></b>

1 輪詢(預設)

每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

2 weight

指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的情況。

例如:

upstream bakend { 

server 192.168.100.104 weight=10; 

server 192.168.100.105 weight=10; 

3 ip_hash

每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以

解決session的問題。

ip_hash; 

server 192.168.100.104:80; 

server 192.168.100.105:80; 

4 fair(第三方)

按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。

fair; 

5 url_hash(第三方)

按通路url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,後端服務

器為緩存時比較有效。

upstream backend { 

server 192.168.100.104:3128; 

server 192.168.100.105:3128; 

hash $request_uri; 

hash_method crc32; 

<b>每個裝置的狀态設定為</b><b>:</b>

1. down 表示單前的server暫時不參與負載

2. weight 預設為1.weight越大,負載的權重就越大,根據伺服器性能而定

3. max_fails :允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤

4. fail_timeout:max_fails次失敗後,暫停的時間。

5. backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。是以這台機器壓力會最輕。

Nginx支援同時設定多組的負載均衡,用來給不用的server來使用。

安裝nginx過程略 

[root@rhel6u3 ~]# vim /usr/local/nginx/conf/nginx.conf 

……… //内容略 

http { 

…….. //内容略 

        client_max_body_size 300m;  //允許用戶端請求的最大單個檔案位元組數,它出現在請求頭部的Content-Length字段。(可以更改此參數達到限制使用者上傳檔案大小的目的) 

        client_body_buffer_size 128k; \\緩沖區代理緩沖用戶端請求的最大位元組數,可以了解為先儲存到本地再傳給使用者。 這個指令可以指定連接配接請求使用的緩沖區大小,預設值:8k/16k 。如果用戶端請求一個檔案大于128k,則Nginx會嘗試在硬碟上建立臨時檔案。如果硬碟滿了,則會報錯。 

        client_body_temp_path /dev/shm/client_body_temp; \\這個指令指定連接配接請求試圖寫入緩存檔案的目錄路徑。 

        proxy_connect_timeout 600; \\跟後端伺服器連接配接的逾時時間,發起握手等候響應逾時時間 

        proxy_read_timeout 600; \\連接配接成功 _等候後端伺服器的響應時間_其實已經進入後端的排隊中等候處理。預設值: 

        proxy_send_timeout 600; \\後端伺服器回傳時間_就是在規定時間内後端伺服器必須傳完所有的資料。設定代理伺服器轉發請求的逾時時間,同樣指完成兩次握手後的時間,如果超過這個時間代理伺服器沒有資料轉發到後端伺服器,nginx将關閉連接配接。 

        proxy_buffer_size 16k; \\代理請求緩存區_這個緩存區間會儲存使用者的頭資訊來提供Nginx進行規則處理。一般隻要能儲存下頭資訊即可。預設值:proxy_buffer_size 4k/8k 。設定從後端伺服器讀取的第一部分應答的緩 

沖區大小,通常情況下這部分應答中包含一個小的應答頭。 

        proxy_buffers 4 32k; \\設定用于讀取應答(來自後端伺服器)的緩沖區數目和大小,告訴Nginx儲存單個用的幾個 

Buffer,最大用多大空間 

        proxy_busy_buffers_size 64k; \\如果系統很忙的時候可以申請更大的proxy_buffers,官方推薦*2 

        proxy_temp_file_write_size 64k; \\設定在寫入proxy_temp_path時緩存臨檔案資料的大小,在預防一個工作程序在傳遞檔案時阻塞太長。 

        proxy_temp_path /dev/shm/proxy_temp; \\類似于http核心子產品中的client_body_temp_path指令,指定一個目錄來緩沖比較大的被代理請求。 

upstream   rsyslog.org_pool { 

        server 192.168.100.104:80 weight=4 max_fails=2 fail_timeout=30s;  //為了做測試兩台伺服器預設性能都一樣,平均負載 

        server 192.168.100.105:80 weight=4 max_fails=2 fail_timeout=30s; 

        } \\HTTP負載均衡子產品。upstream這個字段設定一群伺服器,可以将這個字段放在proxy_pass和fastcgi_pass指令中作為一個單獨的實體,它們可以是監聽不同端口的伺服器,并且也可以是同時監聽TCP和Unix socket的伺服器。 伺服器可以指定不同的權重,預設為1。 

     server { 

        server_name  www.rsyslog.org;  //設定所有web伺服器負載的共同域名 

        index  index.html index.htm; 

        location /  { 

                    proxy_pass http://rsyslog.org_pool/; //确定需要代理的URL,端口或socket。 

                    proxy_set_header Host $host; 

                    proxy_redirect off; \\如果需要修改從後端伺服器傳來的應答頭中的"Location"和"Refresh"字段,可以用這個指令設定。 

                    proxy_set_header X-Real-IP $remote_addr; \\這個指令允許将發送到後端伺服器的請求頭重新定義或者增加一些字段。 這個值可以是一個文本,變量或者它們的組合。 

                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

                    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404; \\當後端伺服器遇到500、502、503、504、404錯誤與逾時,自動将請求轉發給rsyslog.org_pool組的另一台伺服器,達到故障轉移

                    }  

\\#确定在何種情況下請求将轉發到下一個伺服器: 

#error - 在連接配接到一個伺服器,發送一個請求,或者讀取應答時發生錯誤。 

#timeout - 在連接配接到伺服器,轉發請求或者讀取應答時發生逾時。 

#invalid_header - 伺服器傳回空的或者錯誤的應答。 

#http_500 - 伺服器傳回500代碼。 

#http_502 - 伺服器傳回502代碼。 

#http_503 - 伺服器傳回503代碼。 

#http_504 - 伺服器傳回504代碼。 

#http_404 - 伺服器傳回404代碼。 

#off - 禁止轉發請求到下一台伺服器。 

            } 

[root@rhel6u3-2 ~]# vim /var/named/view/zone/Others.rsyslog.org.zone 

www     A       192.168.100.106 

測試效果

<a target="_blank" href="http://blog.51cto.com/attachment/201303/170523302.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201303/170538729.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201303/170549230.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201303/170601931.png"></a>

本文轉自淩激冰51CTO部落格,原文連結:http://blog.51cto.com/dreamfire/1158301,如需轉載請自行聯系原作者

繼續閱讀