RHEL8 の SELinux 環境で nginx の "13: Permission Denied" エラーを解消する

RHEL8 の SELinux 環境で nginx の "13: Permission Denied" エラーを解消する

非標準ポートへプロキシする際に発生する nginx の Permission denied エラーを、SELinux の設定調整で解消する方法。

Takahiro Iwasa
3 min read

インスタンス上で 1080 のような非標準ポートへトラフィックをルーティングするよう nginx を設定すると、13: Permission denied というエラーに遭遇することがあります。この問題は、多くの場合 SELinux の制限が原因で発生します。

systemd[1]: Starting The nginx HTTP and reverse proxy server...
nginx[1626]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx[1626]: nginx: [emerg] bind() to 0.0.0.0:1080 failed (13: Permission denied)
nginx[1626]: nginx: configuration file /etc/nginx/nginx.conf test failed
systemd[1]: nginx.service: Control process exited, code=exited status=1
systemd[1]: nginx.service: Failed with result 'exit-code'.
systemd[1]: Failed to start The nginx HTTP and reverse proxy server.

解決方法

解決策は、SELinux のポリシーを更新して nginx がカスタムポート 1080 を使用できるようにすることです。

Terminal window
sudo semanage port -a -t http_port_t -p tcp 1080

sudo: semanage: command not found というエラーが出た場合は、以下のコマンドで必要なパッケージをインストールしてください。

Terminal window
sudo dnf provides /usr/sbin/semanage
sudo dnf install policycoreutils-python-utils

まとめ

semanage port を使ってポート 1080http_port_t というラベルを付けたことで、この非標準ポートへのバインド時に発生していた nginx の 13: Permission denied エラーが解消されました。このエラーメッセージはファイアウォールやファイルパーミッションの問題と見分けがつきにくいものですが、SELinux が enforcing モードで動作している RHEL8 では、多くの場合、そのポートが nginx にバインドを許可されたタイプとしてラベル付けされていないだけです。これを理解していれば semanage port -a -t http_port_t -p tcp 1080 の一行で修正できます。SELinux が有効なホスト上の nginx 設定に新しい非標準ポートを追加するたびに、同じエラーを一から診断し直すのではなく、真っ先にこのコマンドを試す価値があります。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.