正向代理是一個位於內網客戶端和外網原始服務器之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標,然後由代理服務器向原始服務器轉交請求並將獲得的內容返回給客戶端。正向代理一般用在爲防火牆內的局域網客戶端提供Internet訪問。透明代理還允許客戶端通過它訪問任意網站並且隱藏自身的代理服務器身份。
反向代理則是提供外部網絡訪問內部服務器資源的一種手段,對於外部網絡客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間中的內容發送普通請求,反向代理將判斷向何處轉交請求,在下面這個例子中就是nginx向後方的lamp轉交,並將獲得的內容返回給客戶端。反向代理一般用在將防火牆後面的服務器資源提供給Internet用戶訪問。而且反向代理對外都是透明的,訪問者並不知道其訪問的是一個代理。
由於apache具有良好的穩定性,但不能提供大量的連接併發請求;而nginx能夠提供強大的連接併發請求而沒有很好的穩定性,結合這兩種截然不同的特徵,可以在內網的前端使用nginx作爲反向代理服務器,後方的apache作爲原始服務器,這樣既滿足大量的連接併發請求,也具有良好的穩定性,當然,前端應該使用多臺nginx反向代理,由於是實驗環境,這裏就使用一臺作爲演示,具體的拓撲示意圖如下:
一、nginx反向代理
nginx作爲一個代理服務器,至少需要兩塊網卡來同時連接外網和內網
網卡設置好之後就要安裝nginx了,具體的安裝步驟參考《linux下實現lnmp環境》中的第二步“安裝nginx”,這裏不再列出詳細的安裝過程了。安裝完成之後修改/etc/nginx/nginx.conf文件
前端nginx代理的工作完成之後就要搭建後方的lamp環境了,搭建lamp環境不是這篇文章的重點,所以過程我這也不再列出來了,參考《lamp環境搭建--源碼安裝 》。lamp環境完成之後在Server1上新建一個默認頁面。
然後用外網的一臺主機訪問代理服務器測試一下:
雖然實現了反向代理的功能,但不能滿足大量的連接併發請求,因爲在nginx接受到客戶端的詢問後依然是從後方的服務器中請求數據,其滿足的併發連接請求量依然受apache的制約,甚至說多了一個向後查詢的過程,其效率還不如沒有這個代理,可以把apache裝起來,用其自帶的壓力測試工具ab測試一下:
[root@server1 ~]# ab -c 100 -n 10000 http://172.16.10.100/test.jpg
直接向後方請求數據時可以滿足的請求爲每秒2241.49個
[root@server1 ~]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg
而通過前端nginx反向代理服務器之後能滿足的請求不增反減,這就需要nginx有本地緩存的支持了
二、反向代理+負載均衡+健康探測+緩存
由於設置緩存也是修改nginx的配置文件,所以接下來將負載均衡、健康探測和緩存放在一起做
1、反向代理+負載均衡+健康探測
由於nginx的源碼包安裝並不支持健康探測,所以需要給nginx的源碼打上補丁之後重新配置、編譯並安裝
[root@server1 nginx-1.0.11]#vim /etc/nginx/nginx.conf
upstream backend /////定義後方的服務器羣組
Server 172.16.10.100 weight=1 /////指明後方的一臺服務器地址,權重設置爲1
Server 172.16.10.101 weight=1 /////指明後方的另一臺服務器地址,權重設置爲1
healthcheck_enable /////開啓健康探測功能
healthcheck_delay 1000 /////設置健康檢測的時延
healthcheck_timeout 1000 /////設置健康檢測的超時時間
healthcheck_failcount 1 /////後方某臺服務器有一次檢測不到即視爲宕掉
healthcheck_send "GET /.health HTTP/1.0" /////使用GET方法訪問後方服務器站點下的.health來進行探測
proxy_pass http://backend /////與upstream backend相對應,在訪問202.196.10.123或www.abc.com時將流量轉發到backend組
location /stats /////定義一個站點,用來查看後方服務器的健康狀況
將nginx重啓
在後方的兩臺服務器上新建兩個健康探測頁面".health",內容是什麼都行,只要前端nginx能夠成功訪問這個探測頁面即可
這是Server1
這是Server2
再次在外網的主機上訪問202.196.10.123
可以通過訪問根目錄下的stats來查看後方服務器的狀態
上面顯示後方兩臺服務器都正常
關閉Server1的httpd服務
再次查看後方服務器的狀態
顯示後方的172.16.10.100即Server1不能正常連接
這樣就實現了負載均衡和健康探測,但依然不能滿足高併發量,再次用ab進行測試:
[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://172.16.10.100/test.jpg
[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg
通過nginx代理可以滿足的最大連接請求依然沒有直接訪問大
[root@server1 nginx-1.0.11]#vim /etc/nginx/nginx.conf 修改nginx的配置文件
proxy_cache_path /////設置緩存的路徑和其他參數。緩存數據是保存在文件中的,緩存的鍵和文件名都是在代理URL上執行MD5的結果。 levels參數定義了緩存的層次結構。
proxy_set_header /////允許重新定義或者添加發往後端服務器的請求頭。
proxy_cache /////指定用於頁面緩存的共享內存。
proxy_cache_valid /////爲不同的響應狀態碼設置不同的緩存時間。
proxy_cache_use_stale /////指定後端服務器出現狀況時,nginx可以使用的過期緩存
將nginx重啓
再次進行壓力測試
[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg
可以看到最大連接請求已經達到了5000多,這樣負載均衡+健康探測+緩存已經完成
接下來一個問題就是在啓用緩存之後的訪問問題,試着重新訪問一下該站點
可以看到再怎麼刷新頁面內容依然是“I am server-1”,這就證明現在訪問到的是nginx緩存在本地的結果,看看緩存目錄中有沒有內容
Over !