Nginx/Httpd反代tomcat配置
在上一篇部落格中,我們瞭解了tomcat的server.xml中各元件的用法和作用;其中對於tomcat聯結器來說,它分三類,一類是http聯結器,一類是https聯結器,一類是ajp聯結器;通常tomcat作為應用伺服器,我們不建議也不應該讓tomcat直接面向客戶端提供服務;因此進入tomcat的訪問就只有其他反代伺服器的請求了;如果說tomcat使用其他反代伺服器對外提供服務,那麼對於https的訪問就應該由代理伺服器端來實現,從代理伺服器到tomcat的訪問,我們應該還是使用http或者ajp協議,綜上所述常用的聯結器也就http和ajp;http是一個文字格式協議,對於瀏覽器來說是支援的;ajp協議是二進位制格式協議,對於瀏覽器是不支援的;所以對於反代伺服器來講,面向客戶端它提供http協議訪問,面向服務端它提供ajp協議去訪問;這樣去反代tomcat,相對要安全一點,至少客戶端不能繞過代理直接訪問tomcat;
常見的的反代伺服器有haproxy、nginx、httpd,這三款軟體中haproxy和nginx 可基於http協議來代理tomcat;httpd可基於http協議反代tomcat,也支援ajp協議反代tomcat,如果是ajp協議反代tomcat,在httpd上要啟用一個proxy_ajp_module;
1、nginx反代tomcat
nginx基於http協議反代tomcat和反代其他web伺服器的配置沒有本質的不同,我們定義一個location,然後通過proxy_pass 把對應URL反代到後端tomcat伺服器上就好;
示例:nginx反代tomcat中的www.test1.com 和localhost主機
提示:以上配置表示訪問路徑匹配根,就把請求代理到192.168.0.22:8080上,其實這個請求到tomcat上個以後,它會去找對應host是否有,如果有就從匹配到的host上響應,如果沒有就從預設的host上響應,很明顯192.168.0.22不能匹配tomcat的host,所以他會從預設host localhost這個虛擬主機響應;相當於把訪問/的請求反代給localhost這個虛擬主機上;對於匹配以.jsp或者.do結尾的資源就走第二個location,把請求反代到www.test1.com這臺虛擬主機上;
驗證:訪問192.168.0.22看看是否訪問到tomcat的localhost虛擬主機上提供的頁面?
提示:可以看到我們訪問192.168.0.22時,瀏覽器返回了tomcat中localhost提供的主頁;
驗證:訪問192..168.0.22/index.jsp 看看是否訪問到tomcat上的www.test1.com 所提供的主頁?
提示:可以看到訪問192.168.0.22/index.jsp時,瀏覽器中響應了tomcat中www.test1.com這臺虛擬主機提供的主頁;
2、httpd反代tomcat
示例:httpd基於http協議反代tomcat
提示:以上配置表示訪問www.test1.com 把請求反代到http://127.0.0.1:8080上;這裡需要注意proxypreservehost off表示不把客戶端傳來的host首部傳到tomcat上去,這意味著我們訪問www.test1.com ,是不能夠訪問到tomcat中www.test1.com這臺虛擬主機的,因為客戶端訪問httpd,host首部是www.test1.com,到了httpd後,httpd封裝報文,它不會把客戶端host首部原封不動的傳給後面tomcat,而是重新封裝host首部為127.0.0.1,因為封裝後的報文host首部的值為127.0.0.1,到達tomcat後,它匹配不到127.0.0.1的虛擬主機,所以會從預設虛擬主機localhost返回,所以客戶端訪問www.teste1.com,會響應tomcat中localhost虛擬主機的頁面;
驗證:用瀏覽器訪問www.test1.com 看看是否響應tomcat 中localhost的頁面給我們?
提示:可以看到我們訪問www.test1.com ,響應的並不是tomcat中www.test1.com這個虛擬主機提供的頁面,而是localhost虛擬主機提供的頁面;這其中的原因就是proxypreservehost off;它並沒有把客戶端的host首部傳遞到tomcat;
修改proxypreservehost off 為on ,然後重啟httpd,再訪問www.test1.com 看看是否還是給我們返回localhost虛擬主機的頁面呢?
提示:以上修改proxypreservehost on 表示把客戶端host首部的值傳遞到後端tomcat;這樣一來tomcat就可以根據客戶端傳遞的host首部來分別響應不同虛擬主機上的頁面了;
驗證:重啟httpd服務,訪問www.test1.com 看看是否會把tomcat中www.test1.com 虛擬主機的頁面響應給我們?
提示:可以看到現在我們訪問www.test1.com 就不再給我們響應localhost虛擬主機的頁面了,而是www.test1.com虛擬主機的頁面,說明httpd把客戶端hosts首部的值傳遞到後端tomcat上了;
測試:訪問192.168.0.22 看看是否訪問到預設localhost虛擬主機頁面呢?
提示:可以看到我們訪問192.168.0.22時,響應給我們的是tomcat中localhost虛擬主機頁面;原因是httpd把客戶端host首部的值192.168.0.22傳遞給後端tomcat後,在tomcat上並沒有找到192.168.0.22這個虛擬主機,所以在tomcat上就以預設虛擬主機localhost響應給httpd,然後在響應給瀏覽器;所以我們看到的就是tomcat中localhost虛擬主機的頁面;
3、httpd基於ajp協議反代tomcat
以上面的例子,httpd通過http協議反代tomcat和通過ajp協議反代tomcat,從httpd的配置上,沒有本質的不同;不外乎就是把http協議修改成ajp協議,把後端tomcat8080埠改成8009埠;其他的都一樣;如下所示
提示:這裡需要注意一點,httpd使用ajp協議反代tomcat ,需要請用proxy_ajp_module模組,否則httpd是不支援ajp協議的;
驗證:分別在瀏覽器上訪問www.test1.com 和192.168.0.22 看看是否能訪問到tomcat中對應虛擬主機的頁面?
提示:可以看到我們使用基於ajp協議反代tomcat和基於http反代tomcat在訪問上沒有什麼不同;