【问题标题】:Apache Proxy: No protocol handler was validApache 代理:没有有效的协议处理程序
【发布时间】:2014-07-18 21:05:42
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

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


【解决方案1】:

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

sudo a2enmod proxy_http

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

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

【讨论】:

  • 对于我的用例,我还必须执行 'sudo a2enmod proxy_wstunnel' 。
  • 对我来说是LoadModule ssl_module modules/mod_ssl.so。我还必须使用SSLProxyEngine on
  • 我还必须启用mod_slotmem_shm
  • 对于 WAMP 上的我来说,我通过菜单安装了上面的模块,并且不得不在 httpd.conf 中取消注释 LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
  • 我需要 sudo a2enmod proxy_connect ,即使用 CONNECT 来隧道 https
【解决方案2】:

为了让我的 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 代理。 :)
【解决方案3】:

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

a2enmod proxy proxy_http proxy_ajp 

【讨论】:

    【解决方案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 上的 cmets 中:

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

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

    【讨论】:

      【解决方案5】:

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

      例如,如果您使用 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。请参阅对已接受答案的第一条评论。
      【解决方案6】:

      我试图让uwsgi:// 工作,但不知何故,手册认为我很清楚我实际上需要mod_proxy_uwsgi。它不是。这是你的做法:How to compile mod_proxy_uwsgi or mod_uwsgi?

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 确实我也需要proxy_wstunnel
        【解决方案8】:

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

        LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
        

        【讨论】:

          【解决方案9】:

          就我而言,所有模块都已正确设置(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 的错误消息。

          问题在于 proxypass 指令“/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>
          

          跟踪/ 确实很棘手。

          【讨论】:

            猜你喜欢
            • 2021-05-26
            • 1970-01-01
            • 2018-06-29
            • 2014-12-01
            • 2019-07-15
            • 2022-10-13
            • 1970-01-01
            • 2014-09-03
            • 1970-01-01
            相关资源
            最近更新 更多