web-dev-qa-db-ja.com

Apache 2.4 ProxyPassディレクティブがRHEL7.5で機能しない

RHEL7.5でApache 2.4.6を使用したリバースプロキシの設定に問題があります。

3つのバックエンドにリクエストを送信する次の仮想ホストがあります。

<VirtualHost *:80>
    ServerName www.example.com

    RewriteEngine On

    ProxyPreserveHost On

    <Proxy balancer://backend8093>
        BalancerMember http://backend01:8093 route=1
        BalancerMember http://backend02:8093 route=2
        BalancerMember http://backend03:8093 route=3
        ProxySet lbmethod=bybusyness
        Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
        ProxySet stickysession=ROUTEID
    </Proxy>

    # v1, works
    #RewriteRule ^/scheduler/(.*) proxy:balancer://backend8093/scheduler/$1 [L]

    # v2, doesn't work
    ProxyPass "/scheduler" "balancer://backend8093/scheduler"
    ProxyPassReverse "/scheduler" "balancer://backend8093/scheduler"

    RewriteRule .* http://failure [R,L]

</VirtualHost>

しかし、カールを試すと、最後のルールに達しました。

# curl -vvv -H "Host: www.example.com" localhost/scheduler/xxx
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /scheduler/xxx HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: www.example.com
>
< HTTP/1.1 302 Found
< Date: Thu, 07 Jun 2018 16:04:46 GMT
< Server: Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.2k-fips
< Location: http://failure
< Content-Length: 198
< Content-Type: text/html; charset=iso-8859-1

これは、ProxyPassディレクティブがリクエストと一致しないことを意味します。また、ProxyPass*ディレクティブ内で<Location>ディレクティブをラップしようとしましたが、それも機能しませんでした。

RewriteRuleを使用して同等のルール(v1)を試行すると、期待どおりに機能し、3つのサーバー間でリクエストのバランスをとります。

# curl -vvv -H "Host: www.example.com" localhost/scheduler/xxx
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /scheduler/xxx HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: www.example.com
>
< HTTP/1.1 200 OK
< Date: Thu, 07 Jun 2018 16:06:34 GMT
< Server: Apache/2.4.6 (Red Hat Enterprise Linux) OpenSSL/1.0.2k-fips
< Last-Modified: Thu, 07 Jun 2018 13:20:51 GMT
< ETag: "11-56e0d26f87639"
< Accept-Ranges: bytes
< Content-Length: 17
< Set-Cookie: ROUTEID=.1; path=/
<
backend01 hello

リダイレクトが表示されているため、リクエストが適切なVirtualHostと一致していることがわかりますが、ProxyPassが無視されているように見える理由を理解できません。

私が確認したところ、Apacheがモジュールをロードしています(server-infoハンドラーでも確認済み):

# httpd -M | grep proxy
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)

RHEL7.4でApache v2.4.6を実行し、RHEL6.5でApache 2.2.15を実行する同様のセットアップを持つ他のサーバーがあります。 RHEL7サーバー間でロードされたモジュールに違いはありませんが、1つは機能し、もう1つは機能しません。

おそらく構成にいくつかの違いがあります。設定はほとんどがデフォルトで、/etc/httpd/conf.d内のファイルのみが変更されます(上記の仮想ホストは独自のファイルに含まれています)。

ここで何が失敗していますか? ProxyPassディレクティブが機能しないのはなぜですか?

3

RewriteRuleは、ProxyPassの前に実行時に処理されます。キャッチオールRewriteRuleはすべてに一致します。そのルールを削除して、代わりにErrorPageディレクティブを使用してください。

1
Jonah Benton