反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給Internet上請求連接配接的用戶端,此時代理伺服器對外就表現為一個伺服器。
什麼是反向代理
反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給Internet上請求連接配接的用戶端,此時代理伺服器對外就表現為一個伺服器。
有反向代理,當然也存在正向代理的概念咯。正向代理指的是,一個位于用戶端和原始伺服器之間的伺服器,為了從原始伺服器取得内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。
我們通過一個簡單例子,我們就很好的了解兩者之間的差別了。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM1cDO0UzMxQzY5EWOyY2YxYzX5QjMwADMxAzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
為什麼使用反向代理
- 可以起到保護網站安全的作用,因為任何來自Internet的請求都必須先經過代理伺服器。
- 通過緩存靜态資源,加速Web請求。
- 實作負載均衡。順便說下,目前市面上,主流的負載均衡方案,硬體裝置有F5,軟體方案有四層負載均衡的LVS,七層負載均衡的Nginx、Haproxy等。
Nginx反向代理的實戰
在生産環境,Tomcat伺服器一般不單獨使用在項目中,我們一般通過nginx用于反向代理的伺服器,并将請求轉發給後端多台Tomcat伺服器,進而達到負載均衡的目的。
Nginx的叢集配置
在http節點下,添加upstream節點,添加tomcat叢集。
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
配置location為tomcat叢集
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://tomcats;
}
upstream還可以為每個裝置設定狀态值,這些狀态值的含義分别如下:
- down:表示單前的server暫時不參與負載.
- weight:預設為1.weight越大,負載的權重就越大。
- max_fails:允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤.
- fail_timeout : max_fails次失敗後,暫停的時間。
- backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。是以這台機器壓力會最輕。
upstream tomcats{
server 127.0.0.1:9001 down;
server 127.0.0.1:9002 backup;
server 127.0.0.1:9003 weight=2;
server 127.0.0.1:9004 max_fails=2 fail_timeout=60s;
}
配置設定政策
none(輪詢)
upstream按照輪詢(預設)方式進行負載,每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。雖然這種方式簡便、成本低廉。但缺點是:可靠性低和負載配置設定不均衡。
weight(權重)
server 192.168.61.22 weight = 6; # 60% 請求
server 192.168.61.23 weight = 4; # 40% 請求
ip_hash(通路ip)
每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
配置隻需要在upstream中加入ip_hash;即可。
upstream tomcats {
ip_hash;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
fair(第三方)
按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。與weight配置設定政策類似。
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
fair;
}
url_hash(第三方)
和IP哈希類似,隻不過針對請求的url進行hash(基于緩存的server,頁面靜态化)。
一個模闆
upstream tomcats {
server ip:8080;
}
server {
listen 80;
server_name www.lianggzone.com;
location / {
proxy_pass http://tomcats;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
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;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
反向代理實戰
現在,我們開始一個完整的配置,配置如下
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
server {
listen 80;
server_name www.lianggzone.com;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://tomcats;
}
}
這個時候,我們請求www.lianggzone.com/ 就會跳轉到響應的頁面了。