Apache HTTP Server 與 Tomcat 的三種連接方式介紹

本文轉載自IBM developer

首先我們先介紹一下為什么要讓 Apache 與 Tomcat 之間進行連接。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務默認的端口是 8080,裝好 tomcat 后通過 8080 端口可以直接使用 Tomcat 所運行的應用程序,你也可以將該端口改為 80。

既然 Tomcat 本身已經可以提供這樣的服務,我們為什么還要引入 Apache 或者其他的一些專門的 HTTP 服務器呢?原因有下面幾個:

1. 提升對靜態文件的處理性能

2. 利用 Web 服務器來做負載均衡以及容錯

3. 無縫的升級應用程序

這三點對一個 web 網站來說是非常之重要的,我們希望我們的網站不僅是速度快,而且要穩定,不能因為某個 Tomcat 宕機或者是升級程序導致用戶訪問不了,而能完成這幾個功能的、最好的 HTTP 服務器也就只有 apache 的 http server 了,它跟 tomcat 的結合是最緊密和可靠的。

接下來我們介紹三種方法將 apache 和 tomcat 整合在一起。

JK

這是最常見的方式,你可以在網上找到很多關于配置JK的網頁,當然最全的還是其官方所提供的文檔。JK 本身有兩個版本分別是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已經廢棄了,以后不再有新版本的推出了,所以建議你采用版本 1。

JK 是通過 AJP 協議與 Tomcat 服務器進行通訊的,Tomcat 默認的 AJP Connector 的端口是 8009。JK 本身提供了一個監控以及管理的頁面 jkstatus,通過 jkstatus 可以監控 JK 目前的工作狀態以及對到 tomcat 的連接進行設置,如下圖所示:

圖 1:監控以及管理的頁面 jkstatus

圖 1:監控以及管理的頁面 jkstatus

在這個圖中我們可以看到當前JK配了兩個連接分別到 8109 和 8209 端口上,目前 s2 這個連接是停止狀態,而 s1 這個連接自上次重啟后已經處理了 47 萬多個請求,流量達到 6.2 個 G,最大的并發數有 13 等等。我們也可以利用 jkstatus 的管理功能來切換 JK 到不同的 Tomcat 上,例如將 s2 啟用,并停用 s1,這個在更新應用程序的時候非常有用,而且整個切換過程對用戶來說是透明的,也就達到了無縫升級的目的。關于 JK 的配置文章網上已經非常多了,這里我們不再詳細的介紹整個配置過程,但我要講一下配置的思路,只要明白了配置的思路,JK 就是一個非常靈活的組件。

JK 的配置最關鍵的有三個文件,分別是

httpd.conf?
Apache 服務器的配置文件,用來加載 JK 模塊以及指定 JK 配置文件信息

workers.properties
到 Tomcat 服務器的連接定義文件

uriworkermap.properties
URI 映射文件,用來指定哪些 URL 由 Tomcat 處理,你也可以直接在 httpd.conf 中配置這些 URI,但是獨立這些配置的好處是 JK 模塊會定期更新該文件的內容,使得我們修改配置的時候無需重新啟動 Apache 服務器。

其中第二、三個配置文件名都可以自定義。下面是一個典型的 httpd.conf 對 JK 的配置

1
2
3
4
5
6
7
8
9
10
11
12
# (httpd.conf)
# 加載 mod_jk 模塊
LoadModule jk_module modules/mod_jk.so
#
# Configure mod_jk
#
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn

接下來我們在 Apache 的 conf 目錄下新建兩個文件分別是 workers.properties、uriworkermap.properties。這兩個文件的內容大概如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#
# workers.properties
#
# list the workers by name
worker.list=DLOG4J, status
# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13
# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1
worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1
worker.status.type=status

以上的 workers.properties 配置就是我們前面那個屏幕抓圖的頁面所用的配置。首先我們配置了兩個類型為 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺服務器上運行在兩個不同端口 8109 和 8209 的 Tomcat 上。接下來我們配置了一個類型為 lb(也就是負載均衡的意思)的 worker,它的名字是 DLOG4J,這是一個邏輯的 worker,它用來管理前面配置的兩個物理連接 s1 和 s2。最后還配置了一個類型為 status 的 worker,這是用來監控 JK 本身的模塊。有了這三個 worker 還不夠,我們還需要告訴 JK,哪些 worker 是可用的,所以就有?worker.list = DLOG4J, status?這行配置。

接下來便是 URI 的映射配置了,我們需要指定哪些鏈接是由 Tomcat 處理的,哪些是由 Apache 直接處理的,看看下面這個文件你就能明白其中配置的意義

1
2
3
4
5
6
7
8
9
10
/*=DLOG4J
/jkstatus=status
!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

相信你已經明白了一大半了:所有的請求都由 DLOG4J 這個 worker 進行處理,但是有幾個例外,/jkstatus 請求由 status 這個 worker 處理。另外這個配置中每一行數據前面的感嘆號是什么意思呢?感嘆號表示接下來的 URI 不要由 JK 進行處理,也就是 Apache 直接處理所有的圖片、css 文件、js 文件以及靜態 html 文本文件。

通過對 workers.properties 和 uriworkermap.properties 的配置,可以有各種各樣的組合來滿足我們前面提出對一個 web 網站的要求。您不妨動手試試!

http_proxy

這是利用 Apache 自帶的 mod_proxy 模塊使用代理技術來連接 Tomcat。在配置之前請確保是否使用的是 2.2.x 版本的 Apache 服務器。因為 2.2.x 版本對這個模塊進行了重寫,大大的增強了其功能和穩定性。

http_proxy 模式是基于 HTTP 協議的代理,因此它要求 Tomcat 必須提供 HTTP 服務,也就是說必須啟用 Tomcat 的 HTTP Connector。一個最簡單的配置如下

1
2
3
4
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

在這個配置中,我們把所有 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是 Tomcat 的訪問地址,除了 images、css、js 幾個目錄除外。我們同樣可以利用 mod_proxy 來做負載均衡,再看看下面這個配置

1
2
3
4
5
6
7
8
9
10
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
</Proxy>

配置比 JK 簡單多了,而且它也可以通過一個頁面來監控集群運行的狀態,并做一些簡單的維護設置。

圖 2:監控集群運行狀態

圖 2:監控集群運行狀態

ajp_proxy

ajp_proxy 連接方式其實跟 http_proxy 方式一樣,都是由 mod_proxy 所提供的功能。配置也是一樣,只需要把 http:// 換成 ajp:// ,同時連接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改為:

1
2
3
4
5
6
7
8
9
10
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
</Proxy>

采用 proxy 的連接方式,需要在 Apache 上加載所需的模塊,mod_proxy 相關的模塊有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式則需要加載 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 則需要加載 mod_proxy.so 和 mod_proxy_ajp.so這兩個模塊。

三者比較

相對于 JK 的連接方式,后兩種在配置上是比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言就不像 JK 這樣久經考驗,畢竟 Apache 2.2.3 推出的時間并不長,采用這種連接方式的網站還不多,因此,如果是應用于關鍵的互聯網網站,還是建議采用 JK 的連接方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280568.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280568.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280568.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

印象筆記和有道云筆記程序員_記錄,存儲和共享筆記的最佳應用程序和云服務...

印象筆記和有道云筆記程序員Is your desk and computer covered with sticky notes? Do you have miscellaneous pieces of paper with bits of information buried in drawers, your laptop case, backpack, purse, etc.? Get rid of all the chaos and get organized with …

java B2B2C 仿淘寶電子商城系統-Spring Cloud Eureka參數配置項詳解

Eureka涉及到的參數配置項數量眾多&#xff0c;它的很多功能都是通過參數配置來實現的&#xff0c;了解這些參數的含義有助于我們更好的應用Eureka的各種功能&#xff0c;下面對Eureka的配置項做具體介紹&#xff0c;供大家參考。 需要JAVA Spring Cloud大型企業分布式微服務云…

django15:中間件

中間件 開發django項目是&#xff0c;涉及全局相關功能&#xff0c;都可以使用中間件實現。 1.請求時&#xff0c;需要經過中間件&#xff0c;才能到達真正的django后端。 2.響應走的時候&#xff0c;也要經過中間件&#xff0c;才能出去。 依次經過里面的中間件進出&#x…

互聯網算法和產品優化的幾個反直覺現象

本文不涉及任何具體的業務和形態&#xff0c;沒有公開任何數據和需要保護的技術。互聯網產品和算法的優化&#xff0c;是廣大程序員和產品經理的主要工作。但想準確衡量線上實驗效果&#xff0c;從來都不簡單。筆者將這些反直覺現象&#xff0c;總結成三個典型案例予以討論。然…

SD 胡策 Round 1 T3 彩尾巴猹的二進制數

發現一個區間[L,R]代表的2進制數是3的倍數&#xff0c;當且僅當從L開始的后綴二進制值 - 從R1開始的后綴二進制值 是 3 的倍數 (具體證明因為太簡單而被屏蔽)。 于是我們就可以在每個點維護從它開始的后綴二進制數的值&#xff0c;因為在%3同余系下只有3個數&#xff0c;所以我…

求解10的75次方問題

對于求一個數的高次方&#xff0c;最簡單的方法&#xff0c;恐怕就是循環一定的次數&#xff0c;累乘。但是這樣的效率太低。下面我提供一個高效的算法。來自左程云《程序員代碼面試指南》。 就拿10的75次方舉例&#xff1a; 1.75的二進制數形式是1001011。 2.10的75次方10的64…

又是新的一周

自己的決定還記得嗎轉載于:https://www.cnblogs.com/zhangxiangning/p/10300093.html

django16: csrf跨站請求偽造/CSRF相關裝飾器

CSRF 即跨站請求攻擊 跨站請求偽造csrf釣魚網站本質搭建一個跟正常網站一模一樣的頁面用戶在該頁面上完成轉賬功能轉賬的請求確實是朝著正常網站的服務端提交唯一不同的在于收款賬戶人不同給用戶書寫form表單 對方賬戶的input沒有name屬性你自己悄悄提前寫好了一個具有默認的…

dropbox_Google的新存儲定價與Microsoft,Apple和Dropbox相比如何

dropboxGoogle’s subscription storage service has a new name: Google One. Some prices are dropping and customers will also get customer support from an actual human for the first time. Google的訂閱存儲服務有一個新名稱&#xff1a;Google One。 一些價格正在下…

WPF效果第二百零六篇之快速黑白灰效果

一大早就看到群友討論怎么快速讓界面黑白灰效果,這不突然想起來N年前咱簡單通過ShaderEffects調節過飽和度、對比度、亮度;今天再次玩耍一下;來看看最終實現的效果:1、核心代碼&#xff1a;sampler2D implicitInput : register(s0); float factor : register(c0); float4 main(…

極大似然估計與貝葉斯定理

文章轉載自&#xff1a;https://blog.csdn.net/zengxiantao1994/article/details/72787849 極大似然估計-形象解釋看這篇文章&#xff1a;https://www.zhihu.com/question/24124998 貝葉斯定理-形象解釋看這篇文章&#xff1a;https://www.zhihu.com/question/19725590/answer/…

艾媒:第三方應用商店形成BAT3爭霸格局

iiMedia Research(艾媒咨詢)近日發布的《2016Q2中國移動應用商店市場監測報告》&#xff0c;報告顯示&#xff0c;2016年第二季度&#xff0c;第三方移動應用商店用戶增長放緩&#xff0c;用戶規模逐漸飽和。同時&#xff0c;隨著豌豆莢宣布并入阿里移動事業群&#xff0c;中國…

編譯安裝內核

編譯安裝內核 升級內核到 linux-4.20.3.tar.xz 查看當前內核版本&#xff1a; [rootcentos7 data]#uname -r 3.10.0-862.el7.x86_64獲取內核源代碼包&#xff1a;www.kernel.org linux-4.20.3.tar.xz 實施步驟 1. 安裝編譯所需的工具 gcc ncurses-devel make&#xff08;開發工…

layui 啟用禁用_在不啟用Apple Pay的情況下禁用煩人的Apple Pay通知

layui 啟用禁用iPhone/iPad: Not interested in Apple Pay, and tired of seeing notifications about it? You can disable them, but the option is hidden. iPhone / iPad&#xff1a;對Apple Pay不感興趣&#xff0c;又厭倦了看到有關它的通知&#xff1f; 您可以禁用它們…

數字孿生項目實戰,WPF與Unity結合開發之路(一)

數字孿生項目實戰&#xff0c;WPF與Unity結合開發之路&#xff08;一&#xff09;數字孿生項目實戰&#xff0c;WPF與Unity結合開發之路&#xff08;一&#xff09;作 者&#xff1a;水娃嗨大家好&#xff0c;我是一名骨灰級的WPF開發者&#xff0c;我叫水娃。這次主要是向大…

django17:importlib應用中間件代碼思想

轉載&#xff1a;https://www.cnblogs.com/alice-bj/articles/9276880.html 背景 仿django的中間件的編程思想 用戶可通過配置&#xff0c;選擇是否啟用某個組件/某個功能&#xff0c;只需要配置 eg:報警系統&#xff0c;發郵件&#xff0c;發微信 。。。 ( 根據字符串導入…

Python 全棧開發基礎

python面向對象 python異常處理 python網絡編程 python并發編程 臨時目錄 轉載于:https://www.cnblogs.com/fixdq/p/8883304.html

IBM連續兩年大數據市場占有率全球第一

ZDNet至頂網服務器頻道 04月22日 新聞消息:IBM 近日宣布&#xff0c;根據市場調研機構Wikibon最新研究報告《大數據供應商收益與市場預測》&#xff0c;IBM連續兩年實現大數據市場占有率第一&#xff0c;領跑報告中的70多家大數據供應商。同期&#xff0c;IBM年度報告也顯示&am…

idou老師教你學Istio06: 如何用istio實現流量遷移

流量遷移是流量管理的一個重要功能。istio提供的流量管理功能將流量從基礎設施擴展中解耦&#xff0c;支持動態請求路由&#xff0c;故障注入、超時重試、熔斷和流量遷移等。流量遷移的主要目的是將流量從微服務的某一版本的逐步遷移至另一個版本&#xff0c;如在新舊版本之間進…

用最少的代碼,寫一個完整MES項目(.NET6+WPF)

工業4.0時代&#xff0c;智能智造MES系統大行其道&#xff0c;然而基于.NET跨平臺的罕見&#xff01;這里有一套《.NET6WPF企業級MES實戰》教程&#xff0c;基于.NET6跨平臺開發&#xff0c;實現了MES多核心功能&#xff0c;尤其是開發框架完整&#xff0c;非常適合復用。這里分…