1. 程式人生 > >多份HTTP服務80埠複用問題

多份HTTP服務80埠複用問題

常識

我們知道:1臺主機有65536個埠(0~65535),每個程序會佔用1個埠,HTTP協議的預設埠是80。

問題

現有多份HTTP服務(設作HTTPD,IIS,Tomcat)要執行時,若都想用預設埠去訪問,就出現80埠稀缺的問題。

常規方案

通常的做法是設一個Web代理伺服器(如Nginx),根據HTTP請求頭Host來轉發到相應的服務。

本文思路

好在可以通過埠轉發來解決這個問題。埠轉發,其原理跟Web代理服務的Host分發類似。它通過監聽指定IP和埠,將收到的輸入轉發到另一地址。

大致解決思路是:讓各服務程序都不要直接佔用80埠,而通過系統自帶的埠轉發功能,監聽指定IP指定埠收到的請求,並轉發到各服務程序的埠,並新增一個域名-IP對映規則,來實現HTTP分發。

如此,可以通過預設埠來訪問各HTTP服務,且80埠還未被佔用。

服務僅供本機用

第1步 在本機hosts檔案中加入

127.0.0.2   httpd.example.com
127.0.0.3   iis.example.com
127.0.0.4   tomcat.example.com

:(有關hosts檔案,Windows的在%SystemRoot%\System32\drivers\etc\hosts,Linux的在/etc/hosts)

一臺主機的迴環IPv4從127.0.0.1~127.255.255.254,共256*256*254個,遠超出其埠數65536個,絕對夠用,隨你怎麼玩。

第2步 在本機設定埠轉發規則

127.0.0.2   80  127.0.0.1   801
127.0.0.3   80  127.0.0.1   802
127.0.0.4   80  127.0.0.1   8080

Windows使用者用netsh命令,以第一條規則為例

REM 新增
netsh interface portproxy add v4tov4 listenport=80 connectaddress=127.0.0.1 connectport=801 listenaddress=127.0.0.2 protocol=tcp
REM 刪除
netsh interface portproxy delete v4tov4 listenport=80
listenaddress=127.0.0.2 protocol=tcp

Linux使用者用iptables命令,以設定第一條規則為例

# 新增
iptables -t nat -A PREROUTING -p tcp --src 127.0.0.2 --dport 80 -j REDIRECT --dst 127.0.0.1 --to-port 801
# 刪除
iptables -t nat -D PREROUTING -p tcp --src 127.0.0.2 --dport 80 -j REDIRECT --dst 127.0.0.1 --to-port 801

服務供區域網內其他主機用

設當前主機有一個內建的WiFi無線網絡卡,此個網絡卡可獲得2個區域網IP

IPv4 Address: 192.168.1.172
IPv6 Address: fe80::d538:81db:8707:6ef2%11

區域網IP不像迴環IP那麼充裕,為獲得更多的IP數,你需要安裝更多的網絡卡。
當再用網線連線到路由時,本機又獲得2個區域網IP

IPv4 Address: 192.168.1.177
IPv6 Address: fe80::dcf5:6cb9:6ad2:c38e%14

如果還不夠,你可以再加USB WiFi無線網絡卡或USB RJ45乙太網介面卡

在進行下列操作之前,你的路由器須支援hosts設定和埠轉發。
:HiWiFi極路由使用者可通過安裝應用”Hosts”和”埠轉發”

第1步 在路由器hosts檔案中加入

192.168.1.172   httpd.example.com
fe80::d538:81db:8707:6ef2%11    iis.example.com
192.168.1.177   tomcat.example.com

第2步 在路由器設定埠轉發規則

192.168.1.172   80  192.168.1.172   801
fe80::d538:81db:8707:6ef2%11    80  192.168.1.172   802
192.168.1.177   80  192.168.1.172   8080

如此,若不出意外,區域網內的其他主機通過瀏覽器訪問以下三個域
httpd.example.com, iis.example.com, tomcat.example.com
即可分別訪問到本機的HTTPD,IIS和Tomcat服務。
此外,80埠還可留作他用,比如開一個Nginx服務,用127.0.0.1來訪問。

以上內容,在Linux上未經實驗,菜鳥慎試,風險自擔。