問題又來
公司的LAMP伺服器使用Apache的VirtualHost功能部署了多個擁有獨立域名的網站。httpd.conf配置檔案部分如下:
# 省略本文無關部分
Listen 80
# www.xxx.com
<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot "/var/www/xxx"
ServerName www.xxx.com
</VirtualHost>
# www.yyy.com
<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot "/var/www/yyy"
ServerName yyy.com
ServerAlias www.yyy.com
</VirtualHost>
# 省略其他網站配置
可見,Apache偵聽在80端口上,并依據域名來分發請求到不同的網站目錄。
今天,公司決定在這個伺服器上增加一個網站,該網站擁有獨立域名zzz.com,使用JavaEE開發,基于Tomcat運作。
由于已經有Apache偵聽80端口,是以獨立運作的Tomcat必然無法再偵聽這個端口。而客戶要求必須以http://www.zzz.com的形式通路網站,而不能是http://www.zzz.com:8080。是以必須把Tomcat內建到Apache下面。
解決思路
要把Tomcat網站內建到Apache中,主要方式有兩種。一是通過AJP協定,把Tomcat作為Apache的worker;二是使用mod_proxy和mod_proxy_http子產品轉發請求至Tomcat。
第一種方式,應該效率高,畢竟Tomcat也是Apache家的産品,內建起來相當穩定容易。
第二種方式,通用性強,不僅可以轉發到Tomcat,還可以轉發到任意的HTTP伺服器程式,如IIS,另外的Apache執行個體。
根據個人愛好,我選擇了第二種方式。
解決方案
首先讓Tomcat偵聽8080端口。
然後修改httpd.conf。
# 加載轉發子產品
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# 把對zzz.com的通路全部轉發給Tomcat
<VirtualHost *>
ServerAdmin [email protected]
ServerName zzz.com
ServerAlias www.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
這樣當使用者通路 http://www.zzz.com的時候,Apache就會代替使用者進而通路http://localhost:8080,并把取回的http資料再轉發給使用者。這也就是Apache的逆向代理功能,這個代理的過程對浏覽器客戶來說是不可感覺的,某種程度上也保護和隐藏了Tomcat服務(因為Apache是通過内網http://127.0.0.1:8080通路Tomcat服務的,http://www.zzz.com:8080對外部網際網路并不可見)。
與逆向代理(Reverse Proxy)相對應的是Apache的正向代理(Forward Proxy)功能,它需要浏覽器端設定代理伺服器。
将來擴充
這種方案其實具有很強的擴充性,對于缺少公網IP的Web伺服器來說非常有意義。比如将來某天還需要部署一個基于IIS的網站。該網站域名為 aaa.com,運作在一個内網Windows機器上,IP位址為172.16.35.220,IIS偵聽在80端口上。那麼就可以通過Apache的逆向代理功能來部署。
<VirtualHost *>
ServerAdmin [email protected]
ServerName aaa.com
ServerAlias www.aaa.com
ProxyPass / http://172.16.35.220/
ProxyPassReverse / http://172.16.35.220/
</VirtualHost>
這樣當使用者通路http://www.aaa.com的時候,Apache就會從http://172.16.35.220/上讀取資料并轉發結果給使用者。
---------------------
作者:smstong
來源:CSDN
原文:https://blog.csdn.net/smstong/article/details/48976333
版權聲明:本文為部落客原創文章,轉載請附上博文連結!