1. 程式人生 > >如何用Apache分發同一個伺服器上的多個應用[本人親自實踐]

如何用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