隧道時 Apache / Tomcat AJP DNS 失敗
我有一種情況,我可以直接從主機或本地網路訪問私有 NAT-ed apache2.4 / tomcat7.0 railo4.2 伺服器,但是當通過 SSH 遠端埠轉發隧道時,應用程序會因錯誤而中斷:
The proxy server received an invalid response from an upstream server. The proxy server could not handle the request GET /. Reason: DNS lookup failure for: server-dev:5555
顯而易見的答案是 server-dev 是一個不可解析的主機名,但這裡不應該是這種情況,因為
lynx server-dev:80
在伺服器本地或子網上的 LAN 機器上工作(名稱通過客戶端和伺服器上的 /etc/hosts 解析)。apache 提供的靜態頁面也可以工作,錯誤似乎出現在 Tomcat 端或 AJP 連接器中。我自己從 2.4.9 原始碼和 1.5.1 年編譯了 apache。唯一似乎在埠轉發時出現。Apache 錯誤日誌顯示:
[Tue Jun 24 22:37:06.911541 2014] [proxy:error] [pid 16858] [client 10.10.10.15:63398] AH00898: DNS lookup failure for: server-dev:5555 returned by /
沒有什麼值得注意的
catalina.out
或我能看到的任何其他日誌。相關的apache配置是:
<VirtualHost *:80> ServerName server-dev UseCanonicalName On RewriteCond %{REQUEST_FILENAME} /[^/:]+\.cfml*($|/) RewriteRule (.*) ajp://%{HTTP_HOST}:8009$1 [P,L] </VirtualHost>
SSH 隧道是從第三個“中間人”系統 (10.10.10.15) 使用 PuTTY 創建的,設置如下:
Remote: 5555 Local: 10.10.10.101:80
伺服器上的相關 /etc/hosts 條目(它沒有綁定/dnsmasq):
10.10.10.101 server-dev # servers private ip
似乎是主機文件被忽略並且正在嘗試 DNS 解析,或者 5555 埠號以某種方式混淆了它(就像它認為它是主機名的一部分),儘管我想不出任何一個好的理由即將發生。
我發現了問題。
%{HTTP_HOST}
在埠不是 80 的情況下,它看起來也包含埠號,因此規則被評估為RewriteRule (.*) ajp://server-dev:5555:8009$1 [P,L]
.簡單的解決方案:看起來
%{SERVER_NAME}
變數不包含埠。所以有效的規則是
RewriteRule (.*) ajp://%{SERVER_NAME}:8009$1 [P,L]
**警告:**我忘記了 HTTP_HOST 和 SERVER_NAME 根據客戶端瀏覽器發送的域而有所不同。我實際上需要 HTTP_HOST 但不是埠,所以實際的解決方案是https://stackoverflow.com/questions/11553939/rewriterule-using-http-host-and-a-different-port
RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$ RewriteRule ^ http://%1:12345/ [R,L]