我在 Apache 中進行以下工作時遇到了一些困難:
我們有一個 apache/tomcat 實例位於 AWS ELB 後面。 ELB 正在執行 SSL 終止,因此我們在伺服器上有一個重定向來處理此問題。
我需要/health
透過 http 進行存取才能使 ELB 運作狀況檢查正常運作。
我需要將所有不是tomcat/
或tomcat 的內容發送到.theme
/foo
localhost:8080/foo
我已經使用 mod_proxy 和/或 mod_rewrite 嘗試了以下配置的一些變體,但我似乎無法使其正常工作,因此將不勝感激。
<Location /health>
ProxyPass http://localhost:8080/health ttl=1
ProxyPassReverse http://localhost:8080/health
</Location>
<Location ~ "^/(.+)">
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteCond %{REQUEST_URI} !^/(health|theme)/
RewriteRule . http://localhost:8080/$1 [P]
ProxyPassReverse http://localhost:8080/$1
</Location>
<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/health
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</Location>
Tomcat 正在使用純 http 偵聽連接埠 8080。
答案1
我讓Tomcat 在連接埠8009 上偵聽ajp。虛擬主機主機定義。然後,反向代理規則決定將哪些請求轉送到各種其他主機(遠端或其他本機虛擬主機)、從 DocumentRoot 提供內容或透過 ajp 轉送到 Tomcat。當 mod_proxy_ajp 將請求轉送到 Tomcat 時,預設情況下它們會保留其主機名,這允許 Tomcat 將它們定向到具有我在 server.xml 中定義的匹配虛擬主機名的不同 Web 應用程式。
以下範例並未完全按照您所描述的方式進行操作,但我希望它們能夠展示虛擬主機在兩種伺服器配置中可用的靈活性,並允許您提出滿足您的需求的配置。
/etc/apache2/extra/vhosts.conf
<VirtualHost *:80>
ServerName my.local.website.com
<Proxy *>
Require all granted
</Proxy>
# proxy specific paths to other virtual hosts
ProxyPass /articles http://a.local.website.com/articles
ProxyPassReverse /articles http://a.local.website.com/articles
ProxyPass /entertainment http://b.local.website.com/entertainment
ProxyPassReverse /entertainment http://b.local.website.com/entertainment
# send everything else to tomcat via ajp on port 8009
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
$CATALINA_HOME/server.xml
<Host name="my.local.website.com" appBase="temp" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="website_access." suffix=".log" pattern="common"/>
</Host>