LoginSignup
8

More than 5 years have passed since last update.

posted at

updated at

【備忘録】nginx, Rails連携時に「502 Bad Gateway」となる場合のSELinux設定

はじめに

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が表示される

selinux01.png

調査

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のページにアクセスできるようになってることを確認

selinux02.png

備考

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」の部分は必要に応じて修正

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8