Domain-Name-System

隧道時 Apache / Tomcat AJP DNS 失敗

  • June 24, 2014

我有一種情況,我可以直接從主機或本地網路訪問私有 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]

引用自:https://serverfault.com/questions/607532