公司有一個公網IP,有兩台apache伺服器,需求是想讓apache伺服器映射到公網上去,讓公網使用者可以通路到,然而如果在路由器上做映射的話就不是很好,因為路由器上的IP映射都是“私網IP:端口”<>“公網IP:對應端口”,兩台私網的apache伺服器的内容都不一樣,但都是80端口,做映射沒法做的。如果要做的話隻能這樣192.168.10.38:80 210.22.3.91:80
192.168.10.40:80 210.22.3.91:81
這樣的話,你就隻能讓客戶加端口通路了,這個不太友好,這就想到了做nginx反向代理了
nginx的編譯安裝這裡就略了,主要反向代理代碼如下
編輯反向代理伺服器配置檔案:
vim /usr/local/nginx/conf/reverse-proxy.conf
server
{
listen 80;
server_name www.aaa.com;
location / {
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_pass http://192.168.10.38:80;
}
access_log logs/www.aaa.com_access.log;
}
server_name www.ccc.com;
proxy_pass http://192.168.10.40:80;
access_log logs/www.ccc.com_access.log;
然後重新加載nginx配置檔案,使之修改生效,再把www.aaa.com和www.ccc.com域名指向公司靜态IP,即申請DNS的時候直接申請兩個域名再加上公司的公網IP,例如這樣:210.22.3.91 www.aaa.com www.ccc.com, 這樣就成功的做到了在浏覽器中輸入www.aaa.com的時候通路的内網伺服器192.168.10.38的80端口,輸入www.ccc.com通路192.168.10.40的80端口的作用。這裡有一個問題,我在内網伺服器中其實是有三個80端口的,兩個apache一個nginx都是80端口,這三個伺服器對外的時候都是一個整體,都是80端口,那麼在我從公網也就是外網去通路www.aaa.com或者去通路www.ccc.com,怎麼能保證一定通路的就是nginx代理伺服器呢?其中nginx代理伺服器的内網IP是192.168.10.37,外網IP是210.22.3.91。
<a href="http://s4.51cto.com/wyfs02/M01/8C/08/wKiom1hfelzx1wGrAAAwcRWO834711.png-wh_500x0-wm_3-wmp_4-s_4110980461.png" target="_blank"></a>
那麼先抛開這些問題不說,首先說一說原理,nginx反向代理時,用戶端即外網是完全不知道内網伺服器的存在的,也就是說他隻是按照DNS伺服器的解析,去通路www.aaa.com時,直接就去找210.22.3.91這個IP,nginx看請求是www.aaa.com,在代理配置中去找,其實是對應着内網192.168.10.38:80,于是nginx就去将這個頁面的内容拿過來作為自己的東西給通路者,好像這些内容本身就是他自己的一樣。對通路者而言,nginx代理伺服器就是“他要的那個伺服器”
根據原理我個人認為需要在其餘兩台apache伺服器建立防火牆,即隻允許nginx伺服器對其80端口進行通路,而其餘主機對80端口的通路一律拒絕。這樣就可以解決外網主機去通路www.aaa.com或者www.ccc.com,會直接轉到nginx代理伺服器上。進而讓nginx代理伺服器發揮作用。
本文轉自飛奔的小GUI部落格51CTO部落格,原文連結http://blog.51cto.com/9237101/1885952如需轉載請自行聯系原作者
ziwenzhou