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

时间:2014-05-29 11:11:55

标签: apache httpd.conf apache-modules apache2.4

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

我该如何解决这个问题?

9 个答案:

答案 0 :(得分:335)

如果您没有启用mod_proxy_http

,就会发生这种情况

sudo a2enmod proxy_http

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

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

答案 1 :(得分:23)

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

答案 2 :(得分:9)

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

a2enmod proxy proxy_http proxy_ajp 

答案 3 :(得分:4)

为了明确将来的参考,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的评论中:

我认为你需要mod_ssl和SSLProxyEngine与ProxyPass - Deadooshka May 29&14; 14,15:35

@Deadooshka是的,这是有效的。如果您将此作为答案发布,我可以接受 - das_j 5月29日&14; 12:04

答案 4 :(得分:3)

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

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

以下是我的情况示例:

  

AH01144:没有协议处理程序对URL / sockjs-node / info有效   (计划'ws')。

在上面的案例中,发生的事情只是以下几点。 我已经启用mod代理来基于path / sockjs-node代理对nodejs的websocket请求。

问题是节点没有专门为websocket请求使用path / sockjs-node。它还使用此路径来托管提供有关websockets信息的REST入口点。

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

这导致了上述例外。

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

答案 5 :(得分:2)

这是在我的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 :(得分:1)

就我而言,所有模块均已正确设置(https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension是一个很好的入门者)&我已将重定向用于基本网址,假设/mysite/ 但是我得到了所有子级ULR的错误,例如/mysite/login/

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

问题是proxypass指令“ / mysite /”中的结尾/字符。子网址的有效配置为:

<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>

跟踪/确实很棘手。

答案 7 :(得分:0)

我试图让uwsgi://工作,但不知何故,手册认为我很清楚我确实需要mod_proxy_uwsgi。它不是。以下是您的操作方法:How to compile mod_proxy_uwsgi or mod_uwsgi?

答案 8 :(得分:0)

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

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so