Apache-2.2

Apache2 轉發代理無法連接到 https 站點

  • December 27, 2011

我有一個奇怪的問題,在我看來就像一個錯誤。

我使用 apache 2.2 作為簡單的轉發代理。

相同的設置適用於另一台伺服器(相同的作業系統,相同的版本)。

我只需安裝 apache2 並啟用模組proxyproxy_httpproxy_connect設置正確的身份驗證方法。

正常的 http 請求工作正常,但 https 請求在瀏覽器(chrome)中顯示(等待一段時間後)以下錯誤;

Error 111 (net::ERR_TUNNEL_CONNECTION_FAILED): Unknown error.

apache 錯誤日誌顯示以下內容:

[Tue Dec 27 18:30:17 2011] [error] [client ***] (20014)Internal error: proxy: error reading status line from remote server ***.com
[Tue Dec 27 18:30:17 2011] [error] [client ***] proxy: Error reading from remote server returned by ***.com:443

我閱讀了一些錯誤報告並蒐索了錯誤並在反向代理設置中發現了一些東西並設置了一些環境變數以禁用保持活動,但它並沒有解決問題。

奇怪的是,在另一台伺服器上它似乎工作得很好!

有人能指出這個錯誤的正確方向嗎?

編輯:

伺服器執行,Ubuntu 10.04.3 LTS但我也在執行的測試伺服器上重現了問題Ubuntu 10.04 LTS

受影響的確切 apache 版本是:

root@dev:/home/pm-peer# apache2ctl -V
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Nov  3 2011 03:29:23
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.8, APR-Util 1.3.9
Compiled using: APR 1.3.8, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
 threaded:     no
   forked:     yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=""
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"

我的配置不同於預設配置如下:

ServerLimit 1024

ProxyRequests On
ProxyVia Block
ProxyStatus Off

# i tried the following to solve the problem
#SetEnv force-proxy-request-1.0 1
#SetEnv proxy-nokeepalive 1
#SSLProxyEngine on


DefineExternalAuth proxy_auth pipe /home/pm-peer/proxy_auth.php


<Proxy *>

       Allow from 127.0.0.1

       AuthType Basic
       AuthName "Password Required"
       AuthBasicProvider external
       AuthExternal proxy_auth
       Require valid-user

   # tried the following directives also inside the proxy container
   #SetEnv force-proxy-request-1.0 1
   #SetEnv proxy-nokeepalive 1

</Proxy>

我還嘗試升級其他所有使用 apt-get upgrade 工作的伺服器,因為我懷疑可能是更新導致了這個錯誤。但是在 ugprade 和 apache 重新啟動之後,一切仍然有效。

我想我必須(不知道)在另一台伺服器上做了一些使它工作的事情,但我不知道它可能是什麼。也許我安裝了一個失去的包或庫?

我從一個 ubuntu 最小版本開始,並沒有以下內容,差不多就是這樣:

apt-get install -y php5-cli libapache2-mod-php5 php5-curl libapache2-mod-authnz-external logrotate php5-mysql
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_connect
a2enmod rewrite
a2enmod headers
a2enmod authnz_external

哇,可能會有很多事情出錯。你有多確定你的 Apache2 代理是用 SSL 支持編譯的(不是說它需要,但它可能會有所幫助)?您列出的編譯選項未顯示此內容。另外,您能告訴我們您的目標 SSL 伺服器是什麼嗎?它也是Apache2伺服器嗎?如果是這樣,它是在所有介面上偵聽還是僅在本地主機上偵聽?

如果將 Apache 環境變數設置為 “proxy-initial-not-pooled” 會發生什麼?

通常,解決方案是微不足道的,原因是純粹的愚蠢。

我定義了一個乾擾配置的 ProxyMatch 規則。

感謝您的幫助。

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