nginx的反向代理功能具體示例
現在我們要求nginx為後端的三臺服務器提供反向代理功能:
其中圖片服務器單獨定義為一個location作為調度,要求配置緩存功能,另外兩臺web服務器組成負載均衡模式,一主一備,並作健康狀態檢查,同時在web服務器上配置日誌功能,記錄真實的客戶端ip地址。
首先我們來準備實驗的基礎環境:
反向代理服務器兩臺網卡分別連接互聯網以及跟後端的upstream server通信
反向代理服務器端配置: yum install -y nginx //安裝nginx服務 systemctl start nginx systemctl enable nginx //設置開機自動啟動nginx服務 vim /etc/selinux/config SELINUX=disabled //關閉selinux功能 systemctl stop firewalld //關閉防火墻 打開反向代理服務器的路由轉發功能 編輯/etc/sysctl.conf文件 添加net.ipv4.ip_forward=1 sysctl -p重讀文件 後端upstream server服務器配置: yum install -y httpd //三臺服務器安裝httpd服務,其中一臺作為圖片服務器使用 vim /etc/selinux/config SELINUX=disabled //關閉selinux功能 systemctl stop firewalld //關閉防火墻
配置圖片服務器
編輯反向代理服務器的主配置文件,在location中定義
location ~* \.(jpg|png|gif)$ {
proxy_pass http://192.168.153.129; //所有圖片格式的資源請求發布發送的192.168.153.129這臺主機上面
}
配置緩存功能
在主配置文件的http字段中定義定義緩存功能,並在location中調度使用 proxy_cache_path /cache/nginx levels=1:1 keys_zone=mycache:32m location ~* \.(jpg|png|gif)$ { proxy_pass http://192.168.153.129; proxy_cache mycache; //調用緩存名稱 proxy_cache_valid 200 206 301 302 10d;//響應結果為200,206,301,302緩存10天 proxy_cache_valid any 1m; //其它響應結果全部緩存1分鐘 proxy_cache_use_stale error timeout; //結果返回錯誤或者請求響應超時則返回給客戶端陳舊的緩存信息 } 創建緩存目錄 mkdir /cache/nginx 更改文件屬主屬組 chown -R nginx:nginx /cache/nginx 重新啟動服務 systemctl restart nginx
在upstream server服務器中啟動httpd服務並設置開機自動啟動
在/var/www/html/目錄中上傳一張1.jpg格式的圖片
使用客戶端請求資源驗證結果
接下來我們查看/cache/nginx目錄下面是否有緩存信息生成
這裏我們要特別註意: 有時候配置了緩存功能,在客戶端請求之後反向代理服務器的緩存目錄之下沒有生成緩存文件有可能是因為http響應頭(http headers),如果出現兩個以上的http header,會導致緩存失敗,我們可以在location字段中使用 proxy_ignore_headers Set-Cookie Cache-Control; 來忽略響應報頭 還有一種可能就是沒有關閉selinux,導致nginx進程在調用緩存目錄時失敗。關閉selinux即可。
接下來我們配置兩臺web服務器,為了驗證upstream模塊的負載均衡共能,我們這裏將兩臺服務器的web測試界面設置為不同的內容。
首先編輯反向代理服務器的主配置文件
在配置文件中的http字段中定義upstream
upstream upservers {
server 192.168.153.130 ;
server 192.168.153.131 ;
}
在location中進行調度
location /forum { //這裏我們使用url重定向來定義
proxy_pass http://upservers/;
}
使用客戶端驗證一下
繼續配置web服務器主從,並對其做健康狀態檢查,同時在web服務器上配置日誌功能,記錄真實的客戶端ip地址。
upstream upservers {
server 192.168.153.130 max_fails=2 fail_timeout=1; //健康狀態檢查同下
server 192.168.153.131 backup max_fails=2 fail_timeout=1; //定義131這臺服務器為備用服務器,對其做健康狀態檢查單位周期為1的時間內,達到2次請求失敗則標記為節點不可用,並等待下一個周期的檢查,判斷其是否恢復正常。
}
我們手動關閉主服務器的http服務,觀察備用服務器是否正常工作,然後修改主服務器的測試頁面並啟動服務,模擬一個熱備升級的過程,location配置不變
登陸主服務器進行配置
systemctl stop httpd
使用客戶端請求發現無論怎樣刷新只能請求備用服務器的測試頁面
將主服務器測試頁面修改後重啟服務,使用客戶端請求
因為兩臺服務器為主備關系所以當主服務器正常運行後,備用服務器則處於待機狀態。
最後配置web服務的日誌收集功能
這裏要想在後端的upstream server中查看客戶端的真實ip,則需要在反向代理服務器的主配置文件的location字段中使用兩個參數
proxy_set_header Host $host; //獲取客戶端的主機名
proxy_set_header C-Real-IP $remote_addr; //獲取客戶端的ip地址
定義在location中
location /forum/ {
proxy_pass http://upservers/ ;
proxy_set_header Host $host;
proxy_set_header C-Real-IP $remote_addr;
}
編輯upstream server後端服務器日誌服務的配置文件
將反向代理服務器定義的C-Real-IP變量名填寫到LogFormat字段第一個%後面,重啟服務,另一臺服務器相同配置
使用客戶端請求然後查看一下日誌記錄文件
因為我這裏使用的vmware的nat網絡功能,所以這裏的客戶端地址顯示的vmware網關的地址
問題遺留:在實際生產環境中客戶端大部分使用的SNAT進行上網,可能一個公網IP後端有很多個客戶端共同使用。這時我們可以基於session會話綁定來實現客戶端的信息記錄,具體配置將在下一小節說明。
nginx的反向代理功能具體示例