Nginx の http ヘッダーに基づくリバース プロキシが 502 Bad Gateway を返す

Nginx の http ヘッダーに基づくリバース プロキシが 502 Bad Gateway を返す

sub1.dom1.com静的 IP (架空の IP) を持つDDNS サブドメインがあります99.88.77.66.55

私は、同じ IP (これも架空の IP) を指すDNS dom2.comCNAME エントリを持つオフサイトでホストされているドメインを持っています。sub2.dom2.comsub3.dom2.com99.88.77.66.55

には99.88.77.66.55、ファイアウォールの背後に LAN があります。この LAN には、3 台のサーバーがあります。

  1. ローカルFQDNwww.local.lan192.168.1.3:80
  2. ローカルFDQNapp.local.lan192.168.1.4:8069
  3. ローカルFQDNfs.local.lan192.168.1.5:2430

詳しくは下の図を参照してください。3 つのサーバーはすべて、同じ freeBSD (freeNAS) システム上の jail 内で仮想サーバーとして実行されています。

ネットワーク図

私が達成したいこと

上の図のとおり、上記のシステムの jail 内で実行するリバース プロキシ サーバーを追加したいと考えています。WAN からの要求は、HTTP ヘッダーで提供されるホスト名に基づいて適切なサーバーに送信する必要があります。

考慮事項

  1. 標準ポート転送:現在、私は LAN ルーターの単純なポート転送を通じてこれらのサーバーにアクセスしています。これは通常許容できる解決策ですが、リモートでネットワークに問題が発生した場合、WAN と LAN のポート関係を正しく維持することが困難になります。また、これらのサーバーにアクセスする必要がある私以外のユーザーにとっても、ポート番号を覚える必要がない方が簡単です。
  2. DD-WRT アプリケーション:私のルーターは 4 GiB USB ドライブがマウントされた DD-WRT ファームウェアを実行しているため、Pound または類似のものを使用して、ルーターにリバース プロキシ サーバーをインストールして実行することを検討しました。この方法を見つけるために、Web で徹底的に検索しました。私が遭遇した問題は、ほとんどのガイドやチュートリアルが古く、必要なリソースへのリンクが壊れていることです。
  3. Apache/Nginx:これら 2 つはどちらも実行可能なソリューションのように思えます。ただし、私が調査した DD-WRT ソリューションと同様に、ガイドの多くは、必要なリソースへのリンクが壊れているか、まったくリンクされていません。Apache または Nginx オプションのどちらを使用する場合でも、ガイドやチュートリアルのほとんどが、Apache または Nginx について知っておくべきことをすべてすでに知っていることを前提としていることが問題です。私はどちらのプラットフォームもまったく経験がありませんが、学習して実験して、うまく機能するようにしたいと思っています。ガイドやチュートリアルでは、server必要なコードのセクションのみが示されていることがほとんどです。また、必要な依存関係とその実装方法をすでに知っていることを前提としています。

すでに実行した手順

nginx: いいえ 私の nginx.conf ファイルからのサンプルです。これはほんの一部です。server他のサーバーには、関連する詳細が変更された他のセクションがあります。

#nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    server_name sub1.dom1.com #I've also tried www.lan.lan, here.
    access_log off;
    error_log off;
    location / {
      proxy_pass http://192.168.1.3:80/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_ready_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    }
  }
}

ただし、接続しようとすると 502 - Bad Gateway エラーが返されます。

アパッチ: 重要なのは、私はこれを Apache22 で試していたということです。私の最新の httpd.conf ファイルは次のようになります。

LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so

<VirtualHost *:80>
  ServerName sub1.dom1.com
  ServerAlias sub1.dom.com
  ProxyPass / http://192.168.1.3:80/
  ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>

<VirtualHost *:80>
  ServerName sub2.dom2.com
  ServerAlias sub2.dom2.com
  ProxyPass / http://192.168.1.4:8069/
  ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>

<VirtualHost *:80>
  ServerName sub3.dom2.com
  ServerAlias sub3.dom2.com
  ProxyPass / http://192.168.1.5:2430/
  ProxyPass / http://192.168.1.5:2430
</VirtualHost

次を使用して Apache22 を起動しようとすると、

service apache22 start

次のような結果が出ます:

Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration

mod_proxyいろいろ調べた結果、必要なモジュールのうち 1 つ、つまり モジュールしかロードしていないことが原因である可能性が高いことがわかりましたmod_proxy_html。 理由は、徹底的に検索した結果、この特定のモジュールの有効なリンクしか見つけられなかったからです。

ポンド: DD-WRT に ipkg をインストールしようとしたときに問題が発生しました。これは、特定のルーターの atheos アーキテクチャが原因である可能性があります。また、前述のように、多くの壊れたリンクに遭遇しました。


さて、長々とした説明はここまでにして、私がコミュニティに期待していることを述べたいと思います。

Nginx を使用して最も近づいたことを考えると、nginx.conf私がしようとしていることを実行するには、ファイルを適切に設定するにはどうすればよいでしょうか? 502 エラーの原因は何ですか? また、これを修正するにはどうすればよいでしょうか?

答え1

nginx ソリューションの場合:

server_name常に要求されたホスト名(http ヘッダー内)である必要があります。

  • ここにを配置する*と、コンテンツを任意のドメイン/ホストで利用できるようにすることができます。

proxy_pass特に必要な場合を除き、で終わらないようにしてください/

最もよく見られるのは、502 Bad gatewaynginx がアップストリーム ( proxy_pass) に接続できない場合です。

  • DMZ->LAN のファイアウォール ポリシーを確認しましたか?
  • error.logヒントを確認しましたか?

関連情報