如何用Apache分發同一個伺服器上的多個應用[本人親自實踐]
最近在專案中碰到一個問題,我們團隊為了節約專案成本,從朋友那邊借了一臺伺服器來跑我們的應用,但之前在這臺伺服器上面已經跑了一個tomcat的應用,佔用了80埠,那麼我們的應用就只能佔用80以外的埠了,比如8080,這就導致了請求非常不友好,必須用類似http://www.bbb.com:8080來訪問我們的應用。後來在Apache的功能支援下,實現了一臺伺服器上用同一個埠(80)分發到不同的應用,具體過程如下:
第一步:準備工作下載相關軟體
第二步:安裝Apache(httpd-2.2.17-win32-x86-openssl-0.9.8o.msi)
安裝目錄:d:/Apache2.2/
1、此處注意,如果你本機已經裝了iis並且佔用80埠,務必先在服務中將iis停止或禁用。軟體預設安裝即可。安裝過程中設定Network Domain和Server Name為localhost,
設定你的email地址,下方會讓你選擇only for the current user或for all users。預設選擇for all users。這樣Apache就會佔用80埠,並且做為一個系統服務開機自運
行。
2、安裝完後,在系統"拖盤"處看見Apache的羽毛圖示,如果機子本身已安裝IIS,此時圖示上為紅色的圓點,是因為IIS和Apache在埠80上的重複,修改IIS埠為其它埠.或修
改apache/conf下的httped.conf檔案,修改"Listen 80" 中的80為其它.(本配修改了IIS埠,使得Apache的埠為80)
3、解決不自動顯示中文:編輯D:/Apache2.2/conf目錄下配置檔案httpd.conf。用記事本開啟它並查詢"AddDefaultCharset ISO-8859-1",註釋
掉"AddDefaultCharset ISO-8859-1",即在"AddDefaultCharset ISO-8859-1"前加個"#"字元。然後在"#AddDefaultCharset ISO-8859-1"下面新增如下三行:
AddDefaultCharset GB2312
DefaultLanguage GB2312
AddLanguage zh-cn .cn
安裝完成之後,你在瀏覽器中輸入http://localhost,將會看到Apache的成功頁面.Apache的主目錄是d:/Apache/Apache2,此時Apache,已經執行,你可以在視窗的托盤看到他的
圖示,雙擊圖示,在彈開的視窗選擇"Open Apache Monitor",點Stop,停止Apaceh服務,因為下面要安裝Tomcat和JK.
第三步:整合apache+tomcat安裝
把mmod_jk-1.2.31-httpd-2.2.3.so拷貝到D:/Apache2.2/modules/下
在D:/apache2.2/conf/httpd.conf檔案最後加入
#設定Apache與Tomcat之間的連線,讓Apache遇到jsp檔案時,在後臺將其交由Tomcat去處理
#載入 mod_jk 模組
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
#指定tomcat監聽配置檔案地址
JkWorkersFile conf/workers.properties
#指定日誌存放位置
JkLogFile logs/mod_jk.log
#指定日誌級別
JkLogLevel debug
# 指定 mod_jk 模組的日誌格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]
第四步:在conf目錄下建立workers.properties檔案,內容如下:
worker.list=tomcatA,tomcatB
# localhost tomcatA
worker.tomcatA.type = ajp13
worker.tomcatA.host = localhost
worker.tomcatA.port = 9009
worker.tomcatA.lbfactor = 50
worker.tomcatA.cachesize = 10
worker.tomcatA.cache_timeout = 600
worker.tomcatA.socket_keepalive = 1
worker.tomcatA.recycle_timeout = 300
# localhost tomcatB
worker.tomcatB.type = ajp13
worker.tomcatB.host = localhost
worker.tomcatB.port = 9019
worker.tomcatB.lbfactor = 50
worker.tomcatB.cachesize = 10
worker.tomcatB.cache_timeout = 600
worker.tomcatB.socket_keepalive = 1
worker.tomcatB.recycle_timeout = 300
#指定apache通過什麼埠提交給哪個tomcat
第五步:修改tomcat下的server.xml
多個Tomcat的埠修改為了避免佔用情況
關閉埠:<Server port="XXXX" shutdown="SHUTDOWN">
ajp11的埠: <Connector port="XXXX" protocol="AJP/1.3" redirectPort="8443" />
修改 http 的埠:<Connector port="XXXX" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" />
Engine 主要是配置 jvmRoute 屬性
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB">
第六步:在httpd.conf檔案中增加虛擬主機配置
#不可缺少,否則只有一個tomcat能執行
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.aaa.com
ServerAlias www.aaa.com
ErrorLog logs/aaa-error_log.txt
CustomLog logs/aaa-access_log.txt common
JkMount /* tomcatA
</VirtualHost>
<VirtualHost *:80>
ServerName www.bbb.com
ServerAlias www.bbb.com
ErrorLog logs/bbb-error_log.txt
CustomLog logs/bbb-access_log.txt common
JkMount /* tomcatB
</VirtualHost>
注意一:NameVirtualHost 指定虛擬主機所使用的IP地址或域名,但是最好是IP地址。使用基於域名的虛擬主機時,NameVirtualHost是必要的指令。NameVirtualHost可以定義多個。
注意二:所有符合NameVirtualHost或<VirtualHost>標籤定義的請求,都會被作為虛擬主機處理,而主伺服器將不理會。NameVirtualHost定義了而<VirtualHost>標籤沒有定義的的請求,伺服器會找不到相應的虛擬主機而將無法處理。所以每個NameVirtualHost定義的引數至少要有一個<VirtualHost>相匹配。
注意三:如果設定NameVirtualHost 或<VirtualHost>為*:80的話,所有針對80埠的請求,都會被虛擬主機處理,請求會根據域名指向某個虛擬主機。如果有來自 80埠的請求,而所請求的域名沒有被配置為虛擬主機,那將指向第一個虛擬主機。這樣主伺服器將無法收到來自80埠的任何請求。為此也要為主伺服器配置一個虛擬主機。
注意四:JkMount /* jboss的意思是將該虛擬主機下的請求都轉發給jboss這個worker(上面workers.properties中配置的)對應的應用
6. 啟動Apache