CrystalSnowman.com

あなたの時間節約につながる情報を提供します

nginx リバースプロキシ設定時の502 Bad Gatewayエラーを解消する方法

nginx_logo

nginxでリバースプロキシを実現しました。しかし当初は「502 Bad Gatewayエラー」が発生しました。原因は今回もCentOS 7のSELinux設定でした。SELinuxの設定を変更してエラーを解消できたので、その方法を紹介します。

502 Bad Gatewayエラーの発生

リバースプロキシについて

このサイトはWebサーバにnginxを採用しています。パフォーマンス向上のためnginxでリバースプロキシ設定を行いました。
リバースプロキシは一度発生したリクエストの結果をリバースプロキシ上にキャッシュします。もう一度同じリクエストが発生した場合、リバースプロキシにキャッシュされた結果を返します。サーバにリクエストを送信し結果を再取得するのではなく、キャッシュ上の結果を再利用するためパフォーマンス向上が期待できます。

サーバの構成

OSはCentOS 7です。nginxでリバースプロキシとWebサーバを実現しています。
最初はnginxをリバースプロキシに設定し、WebサーバはApacheの構成にしようと考えていました。しかしサーバのメモリーが1GBと少ないのでnginxのみでリバースプロキシとWebサーバの両方をカバーするようにしました。
メモリーに余裕があればnginxとapacheの構成のほうがパフォーマンスはよいと思います。

エラーログの確認

nginxのconfファイルを設定しnginxの設定をリロードします。ブラウザーでサイトにアクセスすると502 Bad Gatewayエラーが発生しました。
confファイルの設定を見直しましたが問題はありません。
そこでnginxのerror.logを見てみました。ファイルは/var/log/nginxにあると思います。

2015/02/03 02:29:07 [crit] 10721#0: *8446 connect() to 160.16.98.174:8080 failed (13: Permission denied) while connecting to upstream, client: 1xx.xxx.xxx.xxx, server: crystalsnowman.com, request: “GET /favicon.ico HTTP/1.1”, upstream:
“http://160.16.98.174:8080/favicon.ico”, host: “www.crystalsnowman.com”

クライアントからこのサイトにアクセスした際に、favicon.icoをGETしようとして160.16.98.174:8080に接続したが失敗したようです。
8080はバックエンドに指定したサーバのポートです。フロントエンドのリバースプロキシからバックエンドのWebサーバに接続する際に接続拒否されているようです。

監査ログを調べます。

このログにより、「httpd_t」のコンテキストが設定された(scontext)プロセス「nginx」(comm)から、「http_cache_port_t」のコンテキスト(tcontext)への、クラス「tcp_socket」(tclass)の操作「{ name_connect }」が拒否(denied)されたことが分かります。

SELinuxの設定

sesearchによるアクセス権の確認

拒否されたのが分かったのでSELinuxでどのようなアクセス許可のポリシーが設定されているかを確認します。
「httpd_t」のコンテキストから「http_cache_port_t」のコンテキストへクラス「tcp_socket」での設定を確認します。

5行目の「http_cache_port_t」の「name_connect」は、SELinuxの設定「httpd_can_network_relay」により、拒否「DT」されていることが分かります。

なおSELinuxのブールパラメータは
「getsebool -a | grep httpd_can_network_relay」コマンドで確認できます。
または「getsebool httpd_can_network_relay」です。

SELinuxのブールパラメータの設定

今回もSELinux自体を無効にするのではなく、ブールパラメータの設定のみを変更します。
次のコマンドで「httpd_can_network_relay」を有効にします。

「-P」を付けるとサーバ再起動後も同じ設定になります。

キャッシュ有効化の確認

設定後サイトにアクセスすると問題なくアクセスできました。502のエラーも出ません。
Chromeの開発ツールでも確認します。何度かページをリロードして開発ツールのNetworkタブを確認します。

リバースプロキシ

cssファイルのSize項目が(from cache)となっているので、cacheから取得していることが分かります。リバースプロキシは有効になったようです。

今回の記事の参考資料

参考にさせていただいたサイト

CentOS7 64bit SELinuxによるアクセス制御 | kakiro-web カキローウェブ

CentOSでのトラブルがSELinuxの設定であることを最初に気づかせてくれたサイトです。おかげでサイトからのメール送信とリバースプロキシが実現できました。

参考図書

WordPressプロフェッショナル養成読本
WordPressプロフェッショナル養成読本

nginxの設定を行う際に参考になった本です。掲載されているコードをそのまま使えるほどの情報量は載っていませんが、サーバ構築で何を設定するべきかのガイドとなりました。リバースプロキシからキャッシュ、セキュリティまで広く浅くカバーされています。
またサイトの運用方針やSEO対策まで網羅されています。
まずざっくりWordPressサイトで何をやるべきかを知るには最適な本だと思います。そしてこの本からさらに詳しい本へと移行すればよいと思います。

まとめ

CentOSでWordPressを構築した環境では、nginxでリバースプロキシを実現するためにはSELinuxの設定を見直す必要がありました。今回もSELinuxを無効にするのではなく、SELinuxのブールパラメータで必要な操作のみを利用可能にしました。
今回は解決に多くの時間を使ってしまいました。SELinux自体を無効にしたくなる気持ちも分かりました。


Top