Apache Proxy:没有协议处理程序有效


190

我正在尝试将子目录代理到另一台服务器。我的httpd.conf:

RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]

问题在于Apache始终在记录以下内容:

AH01144: No protocol handler was valid for the URL /subdir/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost/

因此,在搜索互联网后,我激活了以下模块:

LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so

(我知道我不需要所有这些,但我只是激活了它们以确保我不会丢失任何一个)

但是此错误仍然出现,并且客户端获得HTTP 500。

我怎样才能解决这个问题?


似乎需要一些HTTPS处理程序来处理代理请求。改用HTTP ...
Deadooshka,2014年

9
我认为您需要mod_sslSSLProxyEngineProxyPass
Deadooshka 2014年

@Deadooshka是的,这正在工作。如果您将其发布为答案,我可以接受
das_j 2014年

Answers:


418

如果您未mod_proxy_http启用,则可能会发生这种情况

sudo a2enmod proxy_http

为了使我的基于https的负载均衡器正常工作,我必须启用以下功能:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http

23
对于我的用例,我还必须做一个'sudo a2enmod proxy_wstunnel'。
JimJty 2015年

8
对我来说是LoadModule ssl_module modules/mod_ssl.so。我也不得不使用SSLProxyEngine on
Chloe

1
我还必须启用mod_slotmem_shm
SiggyF

2
对于我的WAMP,我通过菜单上方安装模块,不得不取消注释LoadModule slotmem_shm_module modules/mod_slotmem_shm.so在httpd.conf
Flion

1
我需要的sudo a2enmod proxy_connect是使用CONNECT传输https隧道
Raul Nohea Goodness

22

为了使我的Apache2.4 + php5-fpm安装开始工作,我需要激活以下Apache模块:

sudo a2enmod proxy
sudo a2enmod proxy_fcgi

不需要proxy_http,这就是将所有.php文件直接发送到php5-fpm的原因:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>

是的,对于fcgi,这是真的,但是我有一个HTTP代理。:)
das_j 2015年

10

就我而言,我需要proxy_ajp模块。

a2enmod proxy proxy_http proxy_ajp 

8

这是在我的Apache / 2.4.18(Ubuntu)设置中发生的。就我而言,我看到的错误是:

... AH01144: No protocol handler was valid for the URL /~socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

与此相关的配置是:

  ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
  ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/

No protocol handler was valid for the URL /~socket.io/”表示Apache无法处理发送到“ ws://127.0.0.1:8090/~socket.io/” 的请求。

我已经proxy_http装了,但也需要proxy_wstunnel。一旦启用,一切都会很好。


6

为了澄清以供将来参考,如上面几个答案中所建议的,a2enmod是针对Debian / Ubuntu的。Red Hat不使用它来启用Apache模块-而是在httpd.conf中使用LoadModule语句。

此处更多信息:https : //serverfault.com/questions/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

解决方案/正确答案在OP的注释中:

我认为您需要使用ProxyPass的mod_ssl和SSLProxyEngine – Deadooshka,2014年5月29日,11:35

@Deadooshka是的,这正在工作。如果您将其发布为答案,我可以接受– das_j 2014年5月29日,12:04


4

我在这里发布答案,因为由于不同的原因我有相同的错误消息。

例如,如果您使用apache httpd代理协议A上的源请求到协议B上的目标,则可能会出现此错误消息。

这是我的情况的示例:

AH01144:对于URL / sockjs-node / info(方案'ws'),没有任何协议处理程序有效。

在上述情况下,发生的只是以下内容。我已经启用了mod proxy来基于路径/ sockjs-node将websocket请求代理到nodejs。

问题是节点不将路径/ sockjs-node仅用于Websocket请求。它还使用此路径来托管REST入口点,这些入口点提供有关websocket的信息。

以这种方式,当应用程序尝试打开http:// localhost:7001 / sockjs-node / info时,Apache httpd将尝试将其余调用从HTTP协议路由到Webscoket端点调用。节点不接受此。

这导致上述异常。

请注意,即使启用正确的模块,如果尝试执行错误的转发,也会以apache httpd结尾,通知您您尝试在目标服务器上使用的协议无效。


可能是proxy_wstunnel。请参阅已接受答案的第一条评论。
Lerk


0

对我来说,所有上述答案均已在xampp上启用,但仍无法正常工作。启用以下模块可使虚拟主机再次工作

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.