web-dev-qa-db-ja.com

Apache Proxy:有効なプロトコルハンドラがありません

サブディレクトリを別のサーバーにプロキシしようとしています。私の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を受け取ります。

どうすればこれを修正できますか?

155
das_j

mod_proxy_httpが有効になっていない場合、これが起こる可能性があります。

Sudo a2enmod proxy_http

Httpsベースのロードバランサーを機能させるためには、次の機能を有効にする必要がありました。

Sudo a2enmod ssl
Sudo a2enmod proxy
Sudo a2enmod proxy_balancer
Sudo a2enmod proxy_http
336
Brad Parks

私の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>
23
right

私の場合はproxy_ajpモジュールが必要でした。

a2enmod proxy proxy_http proxy_ajp 
10
kujiy

別の理由で同じエラーメッセージが表示されたため、ここに回答を投稿しています。

このエラーメッセージは、たとえば、プロトコルAの送信元からプロトコルBの送信先へのリクエストをプロキシするためにApache httpdを使用している場合に発生する可能性があります。

これが私の状況の例です。

AH01144:URL/sockjs-node/info(方式 'ws')に有効なプロトコル・ハンドラーがありません。

上記のケースでは、起こっていたことは単に以下の通りでした。私はpath/sockjs-nodeに基づいてnodejsへのプロキシのWebSocketリクエストに対してmod proxyを有効にしました。

問題は、ノードがWebソケット要求にpath/sockjs-nodeを排他的に使用しないことです。 Webソケットに関する情報を提供するRESTエントリポイントをホストするためにもこのパスを使用します。

このようにして、アプリケーションが http:// localhost:7001/sockjs-node/info を開こうとすると、Apache httpdは残りの呼び出しをHTTPプロトコルから次のHTTPプロトコルにルーティングしようとします。 Webscoketエンドポイントの呼び出しに。ノードはこれを受け入れませんでした。

これにより上記の例外が発生します。

正しいモジュールを有効にしても、間違った転送を行おうとすると、Apache httpdがターゲットサーバーで使用しようとしたプロトコルが無効であることを通知することになります。

4
99Sono

将来の参考のために明確にするために、上記のいくつかの回答で示唆されているように、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 5月29日'14 12:04

4
em_bo

これは私の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も必要でした。それが可能になったら、すべてが良かったです。

3
Michael Rush

私はuwsgi://を動かそうとしましたが、どういうわけかマニュアルは私が実際にmod_proxy_uwsgiを必要としていることは私にとって明らかであると考えました。そうではありませんでした。これをどうやって行うのですか? mod_proxy_uwsgiまたはmod_uwsgiをコンパイルするにはどうすればいいですか?

0
Chris