Apache代理:没有有效的协议处理程序

我正在尝试将一个子目录代理到另一台服务器。我的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。

我该如何解决这个问题?

285967 次浏览

如果你没有启用mod_proxy_http,就会发生这种情况

sudo a2enmod proxy_http

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

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

为了让我的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>

在我的情况下,我需要proxy_ajp模块。

a2enmod proxy proxy_http proxy_ajp

为了澄清以便将来参考,a2enmod,正如上面几个答案所建议的,是针对Debian/Ubuntu的。Red Hat并没有使用它来启用Apache模块——相反,它使用httpd.conf中的LoadModule语句。

< p >更多: https://serverfault.com/questions/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat < / p >

解决方案/正确答案在OP的评论中:

我认为你需要mod_ssl和SSLProxyEngine与ProxyPass - Deadooshka 5月29日'14在11:35

@Deadooshka是的,这很有效。如果你把这篇文章作为一个答案,我可以接受

我在这里发布了一个答案,因为我因为不同的原因收到了相同的错误消息。

例如,如果您正在使用apache httpd将请求从协议a上的源代理到协议B上的目标,则可能发生此错误消息。

下面是我的例子:

AH01144: URL /sockjs-node/info没有有效的协议处理程序 (计划“ws”)。< / p >

在上面的例子中,发生的事情很简单。 我已经启用了mod代理,根据路径/sockjs-node将websocket请求代理到nodejs

问题是该节点没有使用路径/sockjs-node专门websocket请求。它还使用此路径托管REST入口点,这些入口点传递关于websocket的信息。

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

这导致了上面的异常。

所以要注意,即使您启用了正确的模块,如果您试图进行错误的转发,apache httpd将会通知您尝试在目标服务器上使用的协议无效。

我试图让一个uwsgi://工作,但不知为何手册认为我很清楚,我实际上需要mod_proxy_uwsgi。但事实并非如此。你可以这样做:如何编译mod_proxy_uwsgi或mod_uwsgi?

这发生在我的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。一旦启动,一切都好了。

对我来说,所有上述答案都是在xampp上启用的,但仍然不工作。启用以下模块使虚拟主机重新工作

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

在我的情况下,所有模块都被正确设置(https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension是一个很好的开始)&我有重定向工作的基础url,让我们说/mysite/ 但是我得到了任何子ULR的错误,让我们说/mysite/login/

http://reverse-proxy.dns.com/mysite/被正确地重定向到远程服务器,而http://reverse-proxy.dns.com/mysite/login/在Apache2反向代理中失败,带有OP的错误消息。

问题是代理传递指令"/mysite/"中的结尾/字符。子URL的工作配置是:

<Proxy balancer://mysite_cluster>
BalancerMember http://192.x.x.10:8080/mysite
BalancerMember http://192.x.x.11:8080/mysite
</Proxy>
<VirtualHost *:80>
[...]
ProxyRequests Off
ProxyPreserveHost On
ProxyPass "/mysite" "balancer://mysite_cluster"
ProxyPassReverse "/mysite" "balancer://mysite_cluster"
</VirtualHost>

跟踪/确实很棘手。