RHEL8 の SELinux 環境で nginx の "13: Permission Denied" エラーを解消する
非標準ポートへプロキシする際に発生する nginx の Permission denied エラーを、SELinux の設定調整で解消する方法。
インスタンス上で 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 oknginx[1626]: nginx: [emerg] bind() to 0.0.0.0:1080 failed (13: Permission denied)nginx[1626]: nginx: configuration file /etc/nginx/nginx.conf test failedsystemd[1]: nginx.service: Control process exited, code=exited status=1systemd[1]: nginx.service: Failed with result 'exit-code'.systemd[1]: Failed to start The nginx HTTP and reverse proxy server.解決方法
解決策は、SELinux のポリシーを更新して nginx がカスタムポート 1080 を使用できるようにすることです。
sudo semanage port -a -t http_port_t -p tcp 1080sudo: semanage: command not found というエラーが出た場合は、以下のコマンドで必要なパッケージをインストールしてください。
sudo dnf provides /usr/sbin/semanagesudo dnf install policycoreutils-python-utilsまとめ
semanage port を使ってポート 1080 に http_port_t というラベルを付けたことで、この非標準ポートへのバインド時に発生していた nginx の 13: Permission denied エラーが解消されました。このエラーメッセージはファイアウォールやファイルパーミッションの問題と見分けがつきにくいものですが、SELinux が enforcing モードで動作している RHEL8 では、多くの場合、そのポートが nginx にバインドを許可されたタイプとしてラベル付けされていないだけです。これを理解していれば semanage port -a -t http_port_t -p tcp 1080 の一行で修正できます。SELinux が有効なホスト上の nginx 設定に新しい非標準ポートを追加するたびに、同じエラーを一から診断し直すのではなく、真っ先にこのコマンドを試す価値があります。
Related posts
EC2上でProxy.pyを軽量HTTPプロキシとして動かす
Proxy.pyにはそれ自体の認証機構がないため、EC2インスタンス上で動かしつつSSHトンネル経由で安全にアクセスする方法です。
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
API Gateway WebSocket:モック統合の実装
バックエンドのLambdaを一切使わず、モック統合のみでAPI Gateway WebSocket APIを構築し、あらかじめ用意されたレスポンスを返します。
CloudFront署名付きURL経由でS3にアップロードする
CloudFrontの署名付きURLを使えば、独自ドメイン経由でS3にアップロードできます。S3の直接の署名付きURLが使えない場合に有用です。
