轉(zhuǎn)載請(qǐng)注明原作者,如果覺(jué)得有用,不用請(qǐng)我喝咖啡:D
最近數(shù)次遇到這種情況:硬件資源有限,但有些開(kāi)發(fā)配置要求比較嚴(yán)苛(如在微信公眾號(hào)進(jìn)行接口配置或安全域名配置),要求80端口甚至頂級(jí)域名。但服務(wù)器的80端口早就被之前的已經(jīng)上線的應(yīng)用占掉了。
因此做了一些嘗試,最終解決了訪問(wèn)問(wèn)題。
需求
- 只有一臺(tái)服務(wù)器,一個(gè)IP;
- 服務(wù)器上有多個(gè)應(yīng)用運(yùn)行在不同的端口。例如:
- 127.0.0.1:4000 運(yùn)行著一個(gè)node.js寫(xiě)的博客應(yīng)用
- 127.0.0.1:3009 運(yùn)行著一個(gè)微信公眾號(hào)機(jī)器人的后臺(tái)
- 希望不同的域名,都解析到該IP的80端口,但是轉(zhuǎn)發(fā)到不同的端口去:
- www.me.com 能訪問(wèn)到127.0.0.1:4000的應(yīng)用
- 新增一個(gè)mysite.mydomain.com 能訪問(wèn)到127.0.0.1:3009的微信后臺(tái)(微信要求綁定服務(wù)器時(shí)綁定的是80端口)
思路
域名都解析到該服務(wù)器的IP下,通過(guò)Nginx區(qū)分主機(jī)頭,從而決定請(qǐng)求訪問(wèn)到哪個(gè)應(yīng)用。
相當(dāng)于門(mén)衛(wèi)將不同的來(lái)者領(lǐng)到不同的房間。
最終通過(guò)對(duì)Nginx的配置實(shí)現(xiàn)了需求。
目前用著沒(méi)啥問(wèn)題,但優(yōu)劣還待考證。
Part 1: 服務(wù)器端操作
1. 在Nginx的conf中添加upstream
指向第二個(gè)應(yīng)用的本機(jī)地址。
upstream mysvr {
server 127.0.0.1:3009;
}
附上原有的第一個(gè)應(yīng)用的upstream。
upstream hodorsvr {
server 127.0.0.1:4000;
}
2. 在Nginx的conf中添加二級(jí)域名主機(jī)頭80端口的偵聽(tīng)
注意本例中,要新添加的解析二級(jí)域mysite.mydomain.com
- 端口號(hào)為80
- server_name 精確匹配到二級(jí)域名(本例中為mysite.mydomain.com。其他規(guī)則或www也可以,只要與域名商處解析行為一致即可)
再給conf添加如下1個(gè)server:
server {
listen 80;
server_name mysite.mydomain.com;
location / {
proxy_pass http://mysvr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
添加后,有2個(gè)server,一個(gè)用來(lái)匹配www.me.com,一個(gè)用來(lái)匹配mysite.mydomain.com。
附上原有的另一個(gè)server:
server {
listen 80;
server_name me.com www.me.com;
location / {
proxy_pass http://hodorsvr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream和server都在conf中加好后,使用如下命令測(cè)試一下配置文件是否可用。以我自己的為例:
/usr/local/webserver/nginx/sbin/nginx -t
通過(guò)后,再重啟nginx。
/usr/local/webserver/nginx/sbin/nginx -s reload
先檢查一下原有的域名訪問(wèn)是否一如既往。
注意測(cè)試前可清除一下DNS緩存。
如果是Mac系統(tǒng),使用如下命令:
sudo dscacheutil -flushcache
Part 2: 域名商操作
在域名商(域名在哪家買(mǎi)的就去哪家)處,增加新域名(二級(jí)域名)的A記錄解析到該IP。
Part 3: 空間商操作
一般的服務(wù)器,解析后即可生效,不需要在空間商處做額外的動(dòng)作。
但如果域名商為西部數(shù)據(jù)且空間是國(guó)內(nèi)要備案的那種空間,則需要:
- 為你的IP添加白名單,填寫(xiě)時(shí)要求填寫(xiě)頂級(jí)域名。即,你只是想為mysite.mydomain.com解析,但添加時(shí)要填寫(xiě)mydomain.com;
- 去域名商那里,在你的域名mydomain.com下,不用動(dòng)www和@的A記錄,直接增加一條mysite(你的二級(jí)域名)的CNAME解析到白名單返回給你的那一串值上。
Part 4: 最后確認(rèn)
清除一下DNS緩存。
如果是Mac系統(tǒng),使用如下命令:
sudo dscacheutil -flushcache
然后使用nslookup看一下你的兩個(gè)域名是否已經(jīng)指向了你這臺(tái)服務(wù)器的IP。
之后就通過(guò)不同域名訪問(wèn),看看是否導(dǎo)向了不同的應(yīng)用即可。
~ END ~
參考
受益于如下這些文章:
Nginx實(shí)現(xiàn)多個(gè)站點(diǎn)使用一個(gè)端口(配置Nginx的虛擬主機(jī))