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

das*_*s_j 172 apache httpd.conf apache-modules apache2.4

我试图将一个子目录代理到另一个服务器.我的httpd.conf:

RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]
Run Code Online (Sandbox Code Playgroud)

问题是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/
Run Code Online (Sandbox Code Playgroud)

所以在搜索互联网后,我已经激活了这些模块:

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
Run Code Online (Sandbox Code Playgroud)

(我知道我不需要所有这些,但我只是激活它们以确保我没有遗漏一个)

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

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

Bra*_*rks 377

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

sudo a2enmod proxy_http

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

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
Run Code Online (Sandbox Code Playgroud)

  • 我不得不为我的用例做一个'sudo a2enmod proxy_wstunnel'. (17认同)
  • 对我来说,它是`LoadModule ssl_module modules/mod_ssl.so`.我还必须使用[`SSLProxyEngine on`](https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslproxyengine). (8认同)
  • 我还必须启用`mod_slotmem_shm` (2认同)
  • 对于 WAMP 上的我,我通过菜单安装了上面的模块,并且不得不在 httpd.conf 中取消注释 `LoadModule slotmem_shm_module modules/mod_slotmem_shm.so` (2认同)

小智 22

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

sudo a2enmod proxy
sudo a2enmod proxy_fcgi
Run Code Online (Sandbox Code Playgroud)

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

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)


kuj*_*jiy 10

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

a2enmod proxy proxy_http proxy_ajp 
Run Code Online (Sandbox Code Playgroud)


Mic*_*ush 9

这发生在我的 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.
Run Code Online (Sandbox Code Playgroud)

与此相关的配置是:

  ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
  ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/
Run Code Online (Sandbox Code Playgroud)

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

我已经proxy_http加载了,但还需要proxy_wstunnel. 一旦启用,一切都很好。


em_*_*_bo 7

为了澄清以供将来参考,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