通過(guò)Nginx反向代理實(shí)現(xiàn)多個(gè)域名站點(diǎn)復(fù)用一個(gè)公網(wǎng)IP
時(shí)間:2023-02-10 12:42:01 | 來(lái)源:建站知識(shí)
時(shí)間:2023-02-10 12:42:01 來(lái)源:建站知識(shí)
大家都知道現(xiàn)在全球IPv4地址是稀缺資源,如果您的公司或自己的互聯(lián)網(wǎng)相關(guān)應(yīng)用需要對(duì)外提供服務(wù),那么固定IP是必不可少的。申請(qǐng)一條帶固定公網(wǎng)IP的互聯(lián)網(wǎng)線路所提供的免費(fèi)IP是有限的,如果需要擴(kuò)充IP地址則需要增加月租費(fèi)用,如果您要發(fā)布的域名及站點(diǎn)比較多的話,每個(gè)域名對(duì)應(yīng)一個(gè)固定IP,那么就會(huì)增加您的成本,長(zhǎng)久下來(lái)也是一筆不小的費(fèi)用。
另外互聯(lián)網(wǎng)站點(diǎn)通常為了增加應(yīng)用的高可靠性以及橫向的擴(kuò)展性,通常會(huì)部署如F5、LVS、HAproxy或NGINX這類(lèi)的反向代理(負(fù)載均衡)的硬件或軟件在web服務(wù)器的前面,以實(shí)現(xiàn)四層、七層的負(fù)載均衡能力。
一、
對(duì)于有多個(gè)站點(diǎn)的情況,通常是通過(guò)二級(jí)域名來(lái)區(qū)分,比如說(shuō)你有2個(gè)站點(diǎn),你可以做2條DNS分別解析到2個(gè)不同的公網(wǎng)IP上。例如:
站點(diǎn)1:
http://news.aaa.com 192.168.50.123
站點(diǎn)2:
http://sports.aaa.com 192.168.50.124
這樣當(dāng)用戶(hù)請(qǐng)求
http://news.aaa.com及
http://sports.aaa.com時(shí),就會(huì)訪問(wèn)到對(duì)應(yīng)的頁(yè)面里,但這樣就會(huì)消耗掉2個(gè)公網(wǎng)IP,如果你有N個(gè)站點(diǎn),以此類(lèi)推,你就需要N個(gè)公網(wǎng)IP地址。
二、
有朋友會(huì)說(shuō),我可以通過(guò)IP+端口號(hào)的方式來(lái)區(qū)分我的站點(diǎn)啊,將2個(gè)不同的域名DNS解析為同一個(gè)公網(wǎng)IP,這樣我也是可以復(fù)用我這個(gè)公網(wǎng)IP的,比如將192.168.50.123:80(默認(rèn)端口)映射到
http://news.aaa.com,將192.168.50.123:8080映射到
http://sports.aaa.com這個(gè)站點(diǎn),用戶(hù)訪問(wèn)時(shí)則需要在瀏覽器輸入
http://sports.aaa.com:8080,這樣也可以實(shí)現(xiàn)復(fù)用1個(gè)公網(wǎng)IP達(dá)到訪問(wèn)2個(gè)不同域名站點(diǎn)的需求。但問(wèn)題是域名帶了端口號(hào)之后對(duì)于用戶(hù)體驗(yàn)就非常不友好了,對(duì)于小白用戶(hù)來(lái)說(shuō)8080端口號(hào)可能還容易敲錯(cuò)。對(duì)于內(nèi)部用戶(hù)還好,但是對(duì)于外部用戶(hù)如果網(wǎng)站多加個(gè)端口號(hào)來(lái)訪問(wèn)并不太現(xiàn)實(shí)。
以上復(fù)用公網(wǎng)IP,用端口號(hào)區(qū)分網(wǎng)站的做法,將2個(gè)域名做DNS解析到同一個(gè)公網(wǎng)IP。
站點(diǎn)1:
http://news.aaa.com 192.168.50.123
站點(diǎn)2:
http://sports.aaa.com 192.168.50.123
三、
那有沒(méi)有辦法多域名多站點(diǎn)的情況下,通過(guò)同一個(gè)IP+80端口來(lái)訪問(wèn)呢?是有辦法的,以下就以NGINX作為反向代理(負(fù)載均衡)為例介紹一下如何實(shí)現(xiàn),其他硬件或軟件也是同理的。主要是用到“虛擬主機(jī)”的這個(gè)功能,來(lái)實(shí)現(xiàn)公網(wǎng)IP的收斂。
首先NGINX作為反向代理需要使用七層代理模式(Nginx默認(rèn)即為七層代理),大家知道http的請(qǐng)求是有http報(bào)文頭的,在http報(bào)文頭里有個(gè)字段叫做host,當(dāng)我們用瀏覽器輸入一個(gè)域名訪問(wèn)一個(gè)站點(diǎn)時(shí),http request報(bào)文頭里面就會(huì)插入對(duì)應(yīng)的host域名,Nginx反向代理服務(wù)器則可以通過(guò)獲取這個(gè)http request的報(bào)文頭host字段,通過(guò)判斷這個(gè)域名根據(jù)設(shè)定的轉(zhuǎn)發(fā)規(guī)則,轉(zhuǎn)發(fā)到相應(yīng)的Web集群服務(wù)器里,并response對(duì)應(yīng)的頁(yè)面給到瀏覽器,這樣就能夠?qū)崿F(xiàn)根據(jù)不同域名解析到同一個(gè)公網(wǎng)IP及端口的復(fù)用的場(chǎng)景,節(jié)省了公網(wǎng)IP的使用了。
以下是Nginx里的具體配置及請(qǐng)求過(guò)程,其實(shí)配置是非常簡(jiǎn)單的,只要根據(jù)servername來(lái)proxy_pass給不同的upstream即可(因網(wǎng)上已有大量講解nginx反向代理及負(fù)載均衡的配置詳解,這里具體配置參數(shù)的含義就不再贅述了)。
編輯nginx配置文件,vim /etc/nginx/nginx.conf
1、分別創(chuàng)建2個(gè)upstream,也就是后臺(tái)真實(shí)服務(wù)器的pool,一個(gè)是news指向web服務(wù)器web服務(wù)器192.168.50.201,另外一個(gè)是sports,指向web服務(wù)器192.168.50.202;
2、分別創(chuàng)建2個(gè)server并監(jiān)聽(tīng)80端口,其中一個(gè)設(shè)定servername為
http://news.aaa.com,proxy_pass轉(zhuǎn)發(fā)到news這個(gè)upstream,另外一個(gè)設(shè)定為
http://sports.aaa.com,proxy_pass轉(zhuǎn)發(fā)到sports這個(gè)upstream;
3、Nginx反向代理對(duì)外發(fā)布的是192.168.50.123這個(gè)IP;
http {upstream news{ip_hash;server 192.168.50.201:80;}upstream sports{ip_hash;server 192.168.50.202:80;}server {listen 80;server_name news.aaa.com ;location / {proxy_pass http://news;proxy_set_header Host $http_host;}}server {listen 80;server_name sports.aaa.com;location / {proxy_pass http://sports;proxy_set_header Host $http_host;}}}
下面我們來(lái)測(cè)試一下,我自己的電腦模擬為客戶(hù)端,并修改系統(tǒng)的hosts文件模擬DNS解析
http://news.aaa.com及
http://sports.aaa.com解析到192.168.50.123這個(gè)IP地址,windows的hosts文件在這個(gè)目錄下C:/Windows/System32/drivers/etc
通過(guò)瀏覽器訪問(wèn)
http://news.aaa.com通過(guò)瀏覽器訪問(wèn)
http://sports.aaa.com以上,就實(shí)現(xiàn)了使用http報(bào)文頭的host來(lái)選擇轉(zhuǎn)發(fā)到相應(yīng)的節(jié)點(diǎn),實(shí)現(xiàn)虛擬主機(jī)的功能。當(dāng)然根據(jù)http報(bào)文頭還可以使用很多的規(guī)則進(jìn)行七層轉(zhuǎn)發(fā)的操作。。
關(guān)鍵詞:代理,實(shí)現(xiàn),通過(guò)