標籤:
一:前言
Nginx是一個支援反向 Proxy、負載平衡、頁面緩衝、URL重寫以及讀寫分離的高效能Web伺服器。
二:環境準備
1、作業系統
CentOS 6.4 X86_64
[[email protected] logs]# cat /proc/version Linux version 2.6.32-358.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013
2、軟體版本
Nginx 1. 2版本
[[email protected] conf]# /data1/app/services/nginx/sbin/nginx -Vnginx version: nginx/1.2.8built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) TLS SNI support enabledconfigure arguments: --user=www --group=www --prefix=/data1/app/services/nginx --with-poll_module --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module[[email protected] conf]#
3、Nginx安裝
備忘:這裡我是使用的公司rpm包一鍵打包成的,這裡地址不方便透露。Nginx官網 www.nginx.org官網下載直接安裝編譯即可。
4、實驗機器
172.17.0.43 web.proxy.com
172.17.17.17 web01.test.com
172.17.92.132 web02.test.com
5、時間同步
備忘:這裡需要把3台機器時間同步到一直。我是手動設定的。
yum install ntp -ynetdate 202.102.2.101
6、關閉防火牆&Selinux
備忘:三台機器都為同樣的操作。
[[email protected] conf]# /etc/init.d/iptables stop[[email protected] conf]# setenforce 0setenforce: SELinux is disabled
三:Nginx反向 Proxy
這裡我是一鍵rpm裝的,路徑是打包定義好的。安裝路徑為
/data1/app/services/nginx
在做反向 Proxy的時候我們需要準備2台web伺服器。
1、web01安裝httpd
yum install httpd -y
2、web02安裝httpd
yum install httpd -y
3、提供測試頁面,我這裡是php做的測試,一個為DZ論壇一個為PHP測試頁面。當然你們也可以用靜態,如下:
[[email protected]~] echo "<h1>web01.test.com</h1>" > /var/www/html/index.html[[email protected]~] echo "<h1>web02.test.com</h1>" > /var/www/html/index.html
4、啟動2台Apache測試機的httpd服務
[[email protected] ~]# service httpd start[[email protected] ~]# service httpd start
5、測試一下。
上面我說到了我的web01是DZ,web02是PHPinfo
訪問web01如下:
訪問web02如下:
這裡前提環境都沒有問題,簡單說下方向代理和正向 Proxy。
正向 Proxy:也就是傳說中的代理,他的工作原理就像一個跳板,簡單來說,我是一個User,我訪問不了某個網站,但是我可以訪問一個Proxy 伺服器,
這個Proxy 伺服器可以直接存取到我想要訪問的某個網站,於是我先串連到Proxy 伺服器,然後告訴Proxy 伺服器我要訪問的網站,Proxy 伺服器去給我把我想要的內容取過來,然後產生緩衝轉寄給我,從網站的角度來看,只是在Proxy 伺服器來取內容的時候又一次記錄,有時候並不知道是使用者的請求,也隱藏了使用者的資料。
結論就是,正向 Proxy 是一個位於用戶端和原始伺服器(origin server)之間的伺服器,
為了從原始伺服器取得內容,用戶端向代理髮送一個請求並指定目標(原始伺服器),
然後代理向原始伺服器轉交請求並將獲得的內容返回給用戶端。
用戶端必須要進行一些特別的設定才能使用正向 Proxy。
反向 Proxy:如,User想要訪問www.test.com/redmine,但是www.test.com上面並沒有redmine頁面,他是偷偷從另一台伺服器取回來的,然後作為自己的內容來返回USer,但是這裡的User並不知情,這裡的例子就是反向 Proxy。
結論就是,反向 Proxy正好相反,對於用戶端而言它就像是原始伺服器,並且用戶端不需要進行任何特別的設定。用戶端向反向 Proxy的命名空間(name-space)中的內容發送普通請求,接著反向 Proxy將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給用戶端,就像這些內容原本就是它自己的一樣
(3).兩者區別
從用途上來講:
正向 Proxy的典型用途是為在防火牆內的區域網路用戶端提供訪問Internet的途徑。正向 Proxy還可以使用緩衝特性減少網路使用率。反向 Proxy的典型用途是將防火牆後面的伺服器提供給Internet使用者訪問。反向 Proxy還可以為後端的多台伺服器提供Server Load Balancer,或為後端較慢的伺服器提供緩衝服務。另外,反向 Proxy還可以啟用進階URL策略和管理技術,從而使處於不同web伺服器系統的web頁面同時存在於同一個URL空間下
從安全性來講:
正向 Proxy允許用戶端通過它訪問任意網站並且隱藏用戶端自身,因此你必須採取安全措施以確保僅為經過授權的用戶端提供服務。反向 Proxy對外都是透明的,訪問者並不知道自己訪問的是一個代理。
6.nginx 代理模組
說明:代理模組的指令有很多我這裡只講解重要的proxy_pass,想瞭解更多代理指令請參考官方中文文檔。
這個模組可以轉寄請求到其他的伺服器。HTTP/1.0無法使用keepalive(後端伺服器將為每個請求建立並且刪除串連)。nginx為瀏覽器發送HTTP/1.1並為後端伺服器發送HTTP/1.0,這樣瀏覽器就可以為瀏覽器處理keepalive。
7、配置http反向 Proxy
cd /data1/app/services/nginx/confcp nginx.conf nginx.conf.bak20160708vim nginx.conflocation / { proxy_pass http://172.17.17.17:80; }
指令說明:proxy_pass
文法:proxy_pass URL
預設值:no
使用欄位:location, location中的if欄位
這個指令設定被Proxy 伺服器的地址和被映射的URI,地址可以使用主機名稱或IP加連接埠號碼的形式,
例如:proxy_pass http://localhost:8000/uri/;
8.重新載入一下設定檔
[[email protected] conf]# service nginx reload
9、測試一下,當我們訪問Proxy 伺服器IP的時候則跳轉到了172.17.17.17
五、Nginx負載平衡
注,大家可以看到,由於我們網站是發展初期,nginx只代理了後端一台伺服器,但由於我們網站名氣大漲訪問的人越來越多一台伺服器實在是頂不住,於是我們加了多台伺服器,
那麼多台伺服器又怎麼配置代理呢,我們這裡以兩台伺服器為案例,為大家做示範。
1.upstream 負載平衡模組說明
案例:
下面設定負載平衡的伺服器列表
unstream webserver {ip_hash;server 172.17.17.17:80;server 172.17.17.18:80 down;server 172.17.17.19:8009 max_fails=3 fail_timeout=30s;server 172.17.17:20:8080;}server { location / { proxy_pass http://webserver }}
upstream是Nginx的HTTP Upstream模組,這個模組通過一個簡單的調度演算法來實現用戶端IP到後端伺服器的負載平衡。在上面的設定中,通過upstream指令指定了一個負載平衡器的名稱test.net。這個名稱可以任意指定,在後面需要用到的地方直接調用即可
2.upstream 支援的負載平衡演算法
2.upstream 支援的負載平衡演算法
Nginx的負載平衡模組目前支援4種調度演算法,下面進行分別介紹,其中後兩項屬於第三方調度演算法。
輪詢(預設)。每個請求按時間順序逐一分配到不同的後端伺服器,如果後端某台伺服器宕機,故障系統被自動剔除,使使用者訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每個伺服器效能不均的情況下。
ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共用問題。
fair。這是比上面兩個更加智能的負載平衡演算法。此種演算法可以依據頁面大小和載入時間長短智能地進行負載平衡,也就是根據後端伺服器的回應時間來分配請求,回應時間短的優先分配。Nginx本身是不支援fair的,如果需要使用這種調度演算法,必須下載Nginx的upstream_fair模組。
url_hash。此方法按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端快取服務器的效率。Nginx本身是不支援url_hash的,如果需要使用這種調度演算法,必須安裝Nginx 的hash軟體包。
3.upstream 支援的狀態參數
在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和連接埠,同時還可以設定每個後端伺服器在負載平衡調度中的狀態。常用的狀態有:
down,表示當前的server暫時不參與負載平衡。
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這台機器的壓力最輕。
max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。
fail_timeout,在經曆了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。
注,當負載調度演算法為ip_hash時,後端伺服器在負載平衡調度中的狀態不能是weight和backup。
4、配置Nginx負載
[[email protected] conf]# pwd/data1/app/services/nginx/conf[[email protected] conf]# vim nginx.confupstream webserver { ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; # server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
5、重新載入一下設定檔。
/data1/appservices/nginx/sbin/nginx -s reload
6.測試
但大家想一下,如果不幸的是所有伺服器都不能提供服務了怎麼辦,使用者開啟頁面就會出現出錯頁面,那麼會帶來使用者體驗的降低,所以我們能不能像配置LVS是配置sorry_server呢,答案是可以的,但這裡不是配置sorry_server而是配置backup。
7、配置backup伺服器。
#gzip on;server { listen 8080; server_name localhost; root /data1/www/errorpage; index index.html; }upstream webserver { #ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
mkdir -pv /data1/www/errorpageecho "Sorry....." > /data1/www/errorpage/index.html
8、配置ip_hash負載平衡
server { listen 8080; server_name localhost; root /data1/www/errorpage; index index.html; }upstream webserver { ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; #server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
ip_hash,每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共用問題。(一般電子商務網站用的比較多)
- 注,當負載調度演算法為ip_hash時,後端伺服器在負載平衡調度中的狀態不能有backup。(有人可能會問,為什麼呢?大家想啊,如果負載平衡把你分配到backup伺服器上,你能訪問到頁面嗎?不能,所以了不能配置backup伺服器)
- 測試。
- 統計Web2的訪問串連數
[[email protected] logs]# netstat -antp | grep 80 | wc -l62[[email protected] logs]# netstat -antp | grep 80 | wc -l172
CentOS 6.4部署Nginx反向 Proxy、負載平衡