歡迎您光臨本站 註冊首頁

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

←手機掃碼閱讀     火星人 @ 2014-03-05 , reply:0

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

一、技術準備:

Tomcat是Sun和Apache合作開發的JSP Server,支持Servlet 和JSP,Tomcat本身可以作為Web Server,當處理靜態頁面時,Tomcat不如Apache迅速,不象Apache一樣可配置,強壯。Apache作為最流行的Web伺服器功能強大,高效,但並不支持JSP及Servlet,所以通常的做法是把它們整合起來,讓Apache處理靜態頁面,而把動態頁面的請求交給Tomcat處理,發揮各自的優勢. 通過在Apache中載入整合模塊和進行設置,Apache就能夠根據URL,把不屬於自己的請求轉給Tomcat。

要讓Apache和Tomcat聯合工作,還必須有一個連接器把它們聯繫起來,Connector對於性能、配置的方便性有很重要的影響,目前大致上有JK1.x,JK2,mod_webapp三種connector可以使用。JK使用比較廣泛,JK2是JK1.x的改進,比較新。這三種Connector的配置方法大相徑庭。



二、軟體準備:

1.伺服器1的功能:

       運行Apache前端,直接面向web Client(各種瀏覽器)。

2.伺服器1上的軟體環境:

操作系統:RedHat AdvanceEnterpriseServer3,該系統默認安裝了apache,但是好像功能不全。

IP地址:192.168.1.114

3.伺服器1上需要的軟體:

Apache(版本為2.0.52)源代碼:Apache httpd-2.0.52.tar.gz 可以從http://www.apache.org下載。

Jk2Connector(版本為2.2.0.4)源代碼:jakarta-tomcat-connectors-jk2-src-current.tar.gz 可以從http://www.apache.org/dist/jakarta/tomcat-connectors/jk2/下載。

4.伺服器2的功能:

運行tomcat,處理伺服器1轉發來的web Client的頁面請求,並且將回應頁面發送給伺服器1上的Apache,已使Apache將此回應轉發給web Client。

5.伺服器2上的軟體環境:

       操作系統:Micorsoft Windows2003 Server。

       IP地址:192.168.1.111

6.伺服器2上需要的軟體:

Tomcat(版本為4.1以上)的二進位安裝程序:可以從http://www.apache.org/dist/jakarta/tomcat-4/下載,我使用的是Tomcat4.1。

Java開發包(版本為1.4):可以從http://www.sun.com下載。我安裝的j2dk1.4。



三、安裝Tomcat:

       安裝Tomcat之前先要安裝j2dk,並且設置JAVA_HOME和將$JAVA_HOME\bin放入到Path中。

       由於java開發包和tomcat4.1的安裝在windows下進行,所以整個的安裝過程比較簡單,就不多言了。



四、配置Tomcat:

       根據網上的一些關於Apache和Tomcat整合的文章,和我自身的經驗,配置Tomcat主要需要以下兩個步驟:

1.  修改Tomcat\conf目錄下的jk2.properties文件,修改後的文件內容如下:

## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED

## WHEN YOU EDIT THE FILE.



## COMMENTS WILL BE _LOST_



## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.



# Set the desired handler list

# handler.list=apr,request,channelJni

handler.list = channelSocket,request

#

# Override the default port for the socketChannel

# channelSocket.port=8019

channelSocket.port=8009

# Default:

# channelUnix.file=${jkHome}/work/jk2.socket

# Just to check if the the config  is working

# shm.file=${jkHome}/work/jk2.shm



# In order to enable jni use any channelJni directive

# channelJni.disabled = 0

# And one of the following directives:



# apr.jniModeSo=/opt/apache2/modules/mod_jk2.so



# If set to inprocess the mod_jk2 will Register natives itself

# This will enable the starting of the Tomcat from mod_jk2

# apr.jniModeSo=inprocess

很明確目的就是定義Tomcat和Apache通訊的埠,我設置為8009。



2.  修改Tomcat\conf目錄下的server.xml文件,增加一個虛擬主機:

<Host name="192.168.1.111" debug="10" appBase="/webapps/Root/" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">;

<Context path="" docBase="" debug="10" reloadable="true" crossContext="true"/>;

<logger className="org.apache.catalina.logger.FileLogger" directory="logs"  prefix="localhost2_log." suffix=".txt" timestamp="true"/>;

</Host>;

理所應當,建立這個虛擬主機是必須的,否則Tomcat將無法/webapps/Root/中的頁面。



五、蒙難日到來了!-安裝Apache:

1.初次安裝jk2Connector:

       由於RedHat AdvanceEnterprise Server默認安裝了Apache,但是這個Apache中缺少,整合工作過程中所需要的重要部件-mod_jk2.so庫文件,而要得到這個庫文件就要編譯Jk2Connector源代碼。

       但是當我解開jakarta-tomcat-connectors-jk2-src-current.tar.gz,進入到jakarta-tomcat-connectors-jk2-2.0.4-src/jk/native2,執行./configure時發生了錯誤1:

       # cd native2/

# ls

aclocal.m4      BUILD.txt     common        INSTALL.txt  scripts

apr             build.xml     configure     jni          server

autom4te.cache  CHANGES.html  configure.in  Makefile.in  STATUS.txt

buildconf.sh    CHANGES.txt   include       README.txt   tomcat

# ./configure

checking build system type... i686-redhat-linux-gnu

checking host system type... i686-redhat-linux-gnu

checking target system type... i686-redhat-linux-gnu



checking for mkdir... /bin/mkdir

no apxs given

no apxs2 given

checking checking for apache13...... not provided

checking checking for apache20...... not provided

checking checking for iis...... not provided

checking checking for iPlanet...... not provided

checking for tomcat33 location... not provided

checking for tomcat40 location... not provided

checking for tomcat41 location... not provided

configure: error: Cannot find any WebServer

       配置被錯誤中斷了,原因好像是要求的apxs或者apxs2沒有提供。apxs或者apxs2是什麼?於是我help了一下:

       # ./configure --help

...

  --with-apxs=FILE      location of apxs for Apache 1.3

  --with-apxs2=FILE      location of apxs for Apache 2.0

...

       真的需要提供apxs文件的路徑,用locate命令查找一下:

# locate apsx

#

系統中不存在apsx這個文件。這可急壞了我。為什麼RedHat在發布企業版時不做完整!往往易用的事物都有隱藏的缺陷,這真是至理名言呀!沒辦法,只好自己安裝一個了。

2.安裝Apache2.0.52:

       按照linux下安裝程序的三部曲:./configure,make,make install。這個過程對於一般的linux愛好者來講,It』s easy。。JApache2.0.52被安裝在了/usr/local/Apache目錄下,並且那個apxs文件也被自動放在了/usr/local/apache2/bin/apxs。

3.再次編譯安裝jk2Connector:

       注意在configure時一定要指定apxs文件的路徑!不然就白安裝Apache2.0.52了。

       # ./configure --with-apxs2=/usr/local/apache2/bin/apxs

       …

# make



Make完成後,在/home/liudan/jakarta-tomcat-connectors-jk2-2.0.4-src/jk/build/jk2/apache2目錄下生成了許多的文件和一個usr目錄。但是我在make install時發生了錯誤,只好手動安裝了。L

       看看那個usr目錄下有些什麼:

       # ls usr/local/apache2/modules/

mod_jk2.a  mod_jk2.la  mod_jk2.so

       哦!我要找的mod_jk2.so就在這裡,將它拷貝到Apache的modules目錄中。

# cp usr/local/apache2/modules/* /usr/local/apache2/modules/

4.小結:

       這樣Apache2.0.52和jk2Connector就安裝好了。



六、撥雲見日-配置Apache:

       Apache的配置文件放在/usr/local/Apache/conf目錄中。Apache的整個配置由建立或者修改其中的兩個文件組成。

1.建立workers2.properties:

# only at beginnin. In production uncomment it out



level=DEBUG





file=/usr/local/apache/logs/shm.file

size=1048576



# Example socket channel, override port and host.



port=8009

host=192.168.1.111

       在/usr/local/Apache/conf目錄中建立這個文件的目的同在配置Tomcat時修改jk.properties文件一樣,是告訴Apache如何連接Tomcat。

2.修改httpd.conf文件,添加LoadModule和增加一個虛擬主機。



LoadModule jk2_module "/usr/local/apache2/modules/mod_jk2.so"



NameVirtualHost *:80

<VirtualHost 192.168.1.114:80>;

     ServerAdmin [email protected]

     ServerName 192.168.1.114

     DirectoryIndex index.jsp index.html

        <Location "/">;

         JkUriSet worker ajp13:192.168.1.111:8009

     </Location>;



</VirtualHost>;

       LoadModule描述了jk2模塊的路徑,而虛擬主機則建立了一個使用192.168.1.114的80埠的web服務,此服務通過jk2Connector連接Tomcat(地址為192.168.1.111)的8009埠的方式與Tomcat進行通訊。

3.啟動Apache服務:

       執行/usr/local/Apache/bin目錄中的apachectl命令:

# ./apachectl start

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

no listening sockets available, shutting down

Unable to open logs

說明啟動了系統默認安裝的httpd,只要kill掉httpd后再次運行./apachectl start即可。

如果遇到以下錯誤,請檢查httpd.conf中的LoadModule行是否些正確了!

# ./apachectl start

Syntax error on line 1053 of /usr/local/apache2/conf/httpd.conf:

Invalid command 'JkUriSet', perhaps mis-spelled or defined by a module not included in the server configuration

七.大結局-訪問Apache!

       如果在訪問Apache時瀏覽器出現以下錯誤的話,請檢查Apache和Tomcat的服務是否啟動正常,Apache和Tomcat的配置文件是否正確。

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.



Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.



More information about this error may be available in the server error log.





--------------------------------------------------------------------------------



Apache/2.0.52 (Unix) mod_jk2/2.0.4 Server at 192.168.1.114 Port 80



當然也可以看一下日誌,尋找錯誤原因:

# vi /usr/local/apache2/logs/error_log

uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009

uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009

uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009

uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009

uriEnv.init() map to invalid worker / ajp13:192.168.1.111:8009

Apache/2.0.52 (Unix) mod_jk2/2.0.4 configured -- resuming normal operations

mod_jk2.handle() No worker for /index.jsp

mod_jk2.handle() No worker for /favicon.ico

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /favicon.ico

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /

mod_jk2.handle() No worker for /favicon.ico

~



花了兩天,終於完成了。不幹子享,於大家共同分享。
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

自己寫的嗎?再整理整理吧……
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

不明白的地方,歡迎交流。
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

居然還有人用tomcat,太爛了。稍微有點壓力,就直接死屁了。

建議用resin、jboss(隆重推薦),都非常不錯。

如果有錢,websphere、weblogic、dynamo更好!
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

頂。難道我的勞動成果大家不認可? 唉
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

鼓勵一下

呵呵...
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

不太明白?請問分散式體現在哪?
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

沒看太明白 不過鼓勵一下樓主
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

就是 外網伺服器1(apache) + 內網伺服器2(Tomcat)
實現(apache+Tomcat整合),從而達到負載均衡。
《解決方案》

分散式部署Apache與Tomcat, 整合經歷 (完全成功)

原帖由 "hellboys" 發表:
就是 外網伺服器1(apache) + 內網伺服器2(Tomcat)
實現(apache+Tomcat整合),從而達到負載均衡。

老大,不應該什麼理解吧。
伏在均衡一般只同一服務(應用處理)分佈在多個機器上。如果你的網站都是jsp寫的,你的jsp請求的服務,apache相當於一個中轉,tomcat一點壓力都沒有減輕啊。

如果你有一個成型的網站,jsp寫的,一直在網上。你可以監控和測試一下,apache幾乎都沒有對機器造成負載。所有壓力都是來自java的進程。你這樣做,給我感覺是浪費一個機器。

如果你是做虛擬主機的服務,有html、php、jsp等多個網站,這個可能有必要。

[火星人 ] 分散式部署Apache與Tomcat, 整合經歷 (完全成功)已經有810次圍觀

http://coctec.com/docs/service/show-post-45371.html