LoginSignup
7
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-30

はじめに

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

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
  3. You can use dark theme
What you can do with signing up
7
8