はじめに
nginx, Rails連携させている環境において、SELinuxが原因でアクセス時に「502 Bad Gateway」となる場合があるので解決方法をメモしておきます。
環境
CentOS 7.3.1611
Rails 5.1.2
nginx 1.10.2
事前準備
Rails : 3000ポートでサーバ起動しておく
nginx : アクセスを3000ポートへ転送する
問題点
ブラウザでアクセスした際に502 Bad Gateway
が表示される
調査
nginxのエラーログを確認すると「connect() to 127.0.0.1:3000 failed」と出力されている
$ sudo tail /var/log/nginx/hello-app_error.log
2017/07/30 04:04:02 [crit] 2239#0: *152 connect() to 127.0.0.1:3000 failed (13: Permission denied) while co
nnecting to upstream, client: xxx.xxx.xxx.xxx, server: hello-app, request: "GET /favicon.ico HTTP/1.1", ups
tream: "http://127.0.0.1:3000/favicon.ico", host: "xxx.xxx.xxx.xxx", referrer: "http://xxx.xxx.xxx.xxx/"
原因
nginxからRailsへの通信が遮断されている
暫定対処
SELinuxを無効にする
# SELinuxの無効化
$ sudo setenforce 0
# SELinuxの状態確認
$ sudo getenforce
Permissive
解決方法
SELinuxにモジュールを追加して、nginxからRailsへの通信を許可させる
準備
モジュールの作成に必要なaudit2allow
をインストールする
(audit2allowはpolicycoreutils-python
に含まれている)
# audit2allowインストール
$ sudo yum install -y policycoreutils-python
# バージョン確認
$ audit2allow --version
作成されるモジュールのポリシー確認
audit.logから作成されるポリシーを確認する
# ポリシー確認
$ sudo cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx
module nginx 1.0;
require {
type httpd_t;
type ntop_port_t;
class tcp_socket name_connect;
}
#============= httpd_t ==============
#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
allow httpd_t ntop_port_t:tcp_socket name_connect;
モジュール作成
モジュールを作成する
# ディレクトリを作成
$ cd ~
$ mkdir selinux
$ cd selinux
# モジュール作成
$ sudo cat /var/log/audit/audit.log | audit2allow -M nginx
# モジュールが作成されたことを確認
$ ls
nginx.pp nginx.te
モジュールインストール
作成したモジュールをインストールする
# インストール
$ sudo semodule -i nginx.pp
# モジュールがインストールされたことを確認
$ sudo semodule -l | grep 'nginx'
SELinux有効化
暫定対処のためにSELinuxを無効にしていた場合は有効にする
# SELinuxの有効化
# sudo setenforce 1
# SELinuxの状態確認
$ sudo getenforce
Enforcing
アクセス確認
Railsのページにアクセスできるようになってることを確認
備考
SELinux 基本コマンド
# 有効化
$ sudo setenforce 1
# 無効化
$ sudo setenforce 0
# 状態確認
$ sudo getenforce
audit2allow 基本コマンド
# モジュール内容確認
$ sudo cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx
# モジュール作成
$ sudo cat /var/log/audit/audit.log | audit2allow -M nginx
# 備考
「nginx」の部分は必要に応じて修正
setmodule 基本コマンド
# モジュール追加
$ sudo semodule -i nginx.pp
# モジュール削除
$ sudo semodule -r nginx
# モジュール有効化
$ sudo semodule -e nginx
# モジュール無効化
$ sudo semodule -d nginx
# モジュール一覧
$ sudo semodule -l
# 備考
「nginx」の部分は必要に応じて修正