多域單個 Tomcat 7 - Apache Mod_proxy
我已經為此苦苦掙扎了一天多。因為我是伺服器設置的新手。一直在網上關注許多關於相同的教程和文件,很多都是命中註定的,但沒有運氣。
這是我到目前為止所做的。
- 我讓我的 vps 執行,它的 Apache 在埠 80 上執行。
- 我在 8080 埠安裝了 Tomcat 7.0.55,它已啟動並執行。
現在我們必須將流量從 Apache 路由到 Tomcat
- 下列的
修改 apache 的 000-default.conf 看起來像這樣。
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost> <VirtualHost *:*> ProxyPreserveHost On # Servers to proxy the connection, or; # List of application servers: # Usage: # ProxyPass / http://[IP Addr.]:[port]/ # ProxyPassReverse / http://[IP Addr.]:[port]/ # Example: ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ ServerName localhost </VirtualHost>
這成功地將我的每個請求重定向到 tomcat。
- 現在在瀏覽器中執行我註冊的域名。www.mytestdomain.com。我登陸預設的tomcat頁面。並在瀏覽器地址欄中寫入伺服器 ip 也將我登陸到同一個 tomcat 頁面。
5 現在我需要 www.mytestdomain.com 指向我在 $CATALINA_HOME/webapps/www.mytestdomain.com 中部署在 tomcat 中的應用程序
6 和其他 test.mytestdomain.com 指向我在 tomcat 中部署的應用程序 $CATALINA_HOME/webapps/test.mytestdomain.com
7 和 xx.xx.xx.xx 我的 ip 只登陸預設的 tomcat 頁面。
那是我想要實現而無法做到的。
8 現在關注
http://tomcat.apache.org/tomcat-7.0-doc/virtual-hosting-howto.html
我更新了我的 $CATALINA_HOME/conf/server.xml 以增加一台主機。更新我的 server.xml 文件後看起來
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.mytestdomain.com" appBase="webapps-new" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.mytestdomain.com_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
我創建了新的 appBase 目錄 mkdir $CATALINA_HOME/webapps-new
在 $CATALINA_HOME/webapps-new 文件夾中,我為我的 webapp 創建了符號連結。ln -s ../webapp/www.mytestdomain.com ROOT
cd $CATALINA_HOME/webapps-new/ROOT/WEB_INF/
在 META-INF 文件中創建了 context.xml,內容如下。
重新啟動 Apache 並重新啟動 Tomcat -
$$ ok $$ 14. 結果。–> 瀏覽器中的 www.mytestdomain.com 正確地訪問了我的 tomcat webapp。 15. 但是 test.mytestdomain.com 和 xx.xx.xx.xx 我在瀏覽器中的 ip 也訪問了與 www.mytestdomain.com 相同的 webapp。他們應該去了預設主機。
我嘗試了許多其他技巧,但沒有運氣。
任何幫助,將不勝感激。我知道這很有可能。
謝謝
這對我來說聽起來相當複雜,而不是我嘗試執行它的方式。
一般來說,我盡量將環境彼此分開,理想地在不同的伺服器上執行,但我知道這不是你可以用單個 VPS 做的事情。
您至少應該分離 tomcat 實例,這將減少混亂並使一切更加清晰。
我會
1)在不同的埠,prod:8080 和 test:8180 上啟動 2 個不同的 tomcat 實例(根據您執行的發行版以不同的方式實現)
- 在您的 Apache 配置中啟用 NameVirtualHost 並將正確的伺服器名稱代理到正確的 tomcat 實例
# Ensure that Apache listens on port 80 Listen 80 # Listen for virtual host requests on all IP addresses NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /www/example1 ServerName www.mytestdomain.com # Other directives here ProxyPreserveHost On ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ </VirtualHost> <VirtualHost *:80> DocumentRoot /www/example2 ServerName test.mytestdomain.com # Other directives here ProxyPreserveHost On ProxyPass / http://localhost:8180/ ProxyPassReverse / http://localhost:8180/ </VirtualHost>
這樣你的環境是完全獨立的,你可以在不影響 prod 的情況下應用更改來測試,不僅在你的程式碼內部,而且在 tomcat 配置級別和 apache 配置級別。