Apache リバース プロキシのトラブルシューティング方法は?

Apache リバース プロキシのトラブルシューティング方法は?

お知らせです: この質問を Webmaster StackExchange と ServerFault でしましたが、どちらも閉じられました。ServerFault ではここにリダイレクトされました。

なぜこれが機能しないのかを解明しようと必死です。Apache と CentOS を扱うのは今回が初めてです。これは、自分のスキルを磨くための趣味の Web サイトです。

私がやろうとしていることは次のとおりです。サーバーに ASP.NET Core アプリケーションをセットアップしました。ファイルは にあります/var/www/myapp。そのためのサービス セットアップがあり、ポート 5000 で実行され、動作しています。これに cURL すると、適切な応答が得られます。

curl -H 'Content-Type: application/json' -X POST -d '<json>' http://127.0.0.1:5000/graphql

ここで、自分のドメインのリバース プロキシ経由でこのアプリケーションとやり取りできるようにしたいと考えています。これについては、Microsoft のドキュメントに従って開始しました。https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1

それはうまくいかなかったので、いろいろ調べ始めましたが、どうしたらよいかわかりません。何をしても 404 エラーが発生します。見つかりません。もううんざりです (笑)。今の状況は次のとおりです。構成ファイル名は次myapp.confのとおり/etc/apache2/conf.d:

<VirtualHost *:80>
    ServerName <domain>.com
    ServerAlias *.<domain>.com
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ErrorLog /etc/apache2/logs/myapp-error.log
    CustomLog /etc/apache2/logs/myapp-access.log common
</VirtualHost>

設定ファイルが参照されていることがわかります:

apachectl -S | grep myapp

*:80                   <domain>.com (/etc/apache2/conf.d/myapp.conf:1)

プロキシ モジュールが有効になっていることはわかっています。

httpd -M | grep proxy

 proxy_module (shared)
 proxy_fcgi_module (shared)
 proxy_http_module (shared)
 proxy_wstunnel_module (shared)

安全のために手動でロードしようとすると、Apache は既に有効になっていると表示し、スキップします。私の設定も問題ないことがわかります。

apachectl -t

Syntax OK

私は使用しています不眠症リバース プロキシをテストします。やり取りは次のようになります。

* Preparing request to http://<domain>.com/graphql
* Using libcurl/7.69.1 OpenSSL/1.1.1g zlib/1.2.11 brotli/1.0.7 libidn2/2.1.1 libssh2/1.9.0 nghttp2/1.40.0
* Current time is 2020-06-27T01:22:57.448Z
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 1 cookie
* Too old connection (488 seconds), disconnect it
* Connection 46 seems to be dead!
* Closing connection 46
*   Trying <ip_address>:80...
* Connected to <domain>.com (<ip_address>) port 80 (#47)

> POST /graphql HTTP/1.1
> Host: <domain>.com
> User-Agent: insomnia/2020.2.2
> Content-Type: application/json
> Accept: */*
> Content-Length: 343

| <json>

* upload completely sent off: 343 out of 343 bytes
* Mark bundle as not supporting multiuse

< HTTP/1.1 404 Not Found
< Date: Sat, 27 Jun 2020 01:22:57 GMT
< Server: Apache
< Content-Length: 315
< Content-Type: text/html; charset=iso-8859-1


* Received 315 B chunk
* Connection #47 to host <domain>.com left intact

私が読んだことすべてに基づくと、これらの 404 が表示される理由はありません。ところで、私は設定ファイル内の各ディレクティブを設定するために何十通りもの異なる方法を試しました。ご提案があれば、喜んでもう一度すべて試します。

私が調べようとしたが、うまくいかなかったことの 1 つは、Apache 設定に対してリクエストをテストし、Apache がリクエストをどのようにルーティングするかを確認する方法があるかどうかです。そのため、誰かが知っているとありがたいです。

答え1

試行錯誤を重ねた結果、問題は、仮想ホスト定義が httpd.conf のデフォルトの定義の後に処理されていたことにあると考えました。仮想ホスト定義を ではなくサーバーの IP アドレスで listen するように変更したところ*:80、動作しました。

<VirtualHost *:80>
  ...
</VirtualHost>

to

<VirtualHost <my-server-ip-address>:80>
  ...
</VirtualHost>

*:80 が機能しない理由を解明したいのですが、それはまた別の機会に。

関連情報