Nginx/Httpd反代tomcat配置

来源:https://www.cnblogs.com/qiuhom-1874/archive/2020/07/18/13334180.html
-Advertisement-
Play Games

通常tomcat作為應用伺服器,我們不建議也不應該讓tomcat直接面向客戶端提供服務;因此進入tomcat的訪問就只有其他反代伺服器的請求了;如果說tomcat使用其他反代伺服器對外提供服務,那麼對於https的訪問就應該由代理伺服器端來實現,從代理伺服器到tomcat的訪問,我們應該還是使用h... ...


  在上一篇博客中,我們瞭解了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在訪問上沒有什麼不同;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、管理員登錄 頁面效果 實現步驟: public ActionResult AdminLogin(AdminLoginModel model) { if (FormsAuthentication.Authenticate(model.UserName, model.Password)) { For ...
  • --切換資料庫use mastergo --判斷資料庫是否存在,如果存在則刪除if exists(select * from sys.databases where name='OnlineExamDB')drop database OnlineExamDBgo --創建OnlineExamDB數據 ...
  • 《帶你遨游USB世界》中,我們已經初步介紹了USB的整體架構,本文將從以下幾個方面繼續介紹USB的內容。 USB3.0有什麼新特性? TYPEC介紹 otg識別流程 一、USB3.0 USB是史上定義出的最成功的PC外圍互連技術,並且已經迅猛地被引入到CE和Mobile領域。僅僅在2006年,就有超 ...
  • 日常執行腳本的時候,時間久了不知道腳本的作用和實行了哪些功能,需要重新看腳本源碼。因此,需要對腳本做一下輸出幫助。 ...
  • 最近在編譯安裝第三方內核模塊時,可能是因為沒有正確簽名的原因;一直安裝不了;出現Operation not permitted錯誤; 錯誤類似於這種情況:sudo 許可權也已經開了; modprobe: ERROR: could not insert 'wireguard': Operation no ...
  • 引入 首先來看一個程式,分別列印4和-4的取反運算結果,代碼: public static void main(String[] args) { System.out.println(~4); System.out.println(~(-4));} 不妨思考一下結果,如果結果是-4和4的話,那請繼續 ...
  • 1、什麼是USB USB的全稱是Universal Serial Bus,通用串列匯流排。它的出現主要是為了簡化個人電腦與外圍設備的連接,增加易用性。USB支持熱插拔,並且是即插即用的,另外,它還具有很強的可擴展性,傳輸速度也很快,這些特性使支持USB介面的電子設備更易用、更大眾化。 本文將從USB ...
  • 一 動靜分離概述 1.1 動靜分離介紹 為了提高網站的響應速度,減輕程式伺服器(Tomcat,Jboss等)的負載,對於靜態資源,如圖片、js、css等文件,可以在反向代理伺服器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理伺服器就可以直接處理,而不用將請求轉發給後端伺服器。對於用戶請求的動態文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...