我遇到了一个奇怪的问题,在我看来像是一个错误。
我正在使用 apache 2.2 作为简单的正向代理。
相同的设置在另一台服务器上运行(相同的操作系统,相同的版本)。
我只需安装 apache2 并启用模块proxy
,proxy_http
并proxy_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
我阅读了一些错误报告,并在 Google 上搜索了错误,发现了一些在反向代理设置中的内容,并设置了一些环境变量来禁用保持活动,但这并不能解决问题。
奇怪的是,在另一台服务器上它似乎运行良好!
有人能指出我这个错误正确的方向吗?
编辑:
服务器运行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 升级其他一切正常的服务器,因为我怀疑可能是更新导致了此错误。但在升级和 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
答案1
哇,可能有很多问题。您有多确定您的 Apache2 代理是在 SSL 支持下编译的(不是说它需要,但它可能会有帮助)?您列出的编译选项没有显示这一点。另外,您能告诉我们您的目标 SSL 服务器是什么吗?它也是 Apache2 服务器吗?如果是,它是在所有接口上侦听还是仅在本地主机上侦听?
如果将 Apache 环境变量设置为“proxy-initial-not-pooled”,会发生什么情况?
答案2
很多时候,解决方案很简单,而原因却纯粹是愚蠢。
我定义了一个 ProxyMatch 规则,它会干扰配置。
无论如何,感谢您的帮助。