AlmaLinux8系にNginxを導入しPodmanコンテナに接続する方法
AlmaLinux8でホスト側はApacheからPodmanコンテナ環境に接続しているが、ホスト側をNginxに変更してみたい。また、ホスト側には既にLet's Encryptを導入済みのため、この辺りの設定も行って引き続きHTTPS接続できるようにしたい。以下に対応方法をメモ。
やりたいこと
- ホスト側Apache -> コンテナ環境のホスト側をNginxに変更
- Apacheは停止させるが念のため残しておきたい
- Let's Encryptは引き続き使えるように設定し、HTTPS接続できるようにしたい
- バーチャルホスト設定としてIPアドレスでのアクセスは拒否、指定したドメインのみ接続できるようにしたい
環境について
VPS
今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。
- 接続ポート -> 22
- ユーザ名 -> root
- パスワード or 秘密鍵 -> インスタンス作成時に選択したもの
ホスト(VPS)側 AlmaLinux
詳細なバージョンは以下の通り。
# AlmaLinuxのバージョン確認 cat /etc/redhat-release # 実行結果 AlmaLinux release 8.10 (Cerulean Leopard)
対応方法
Nginxの導入
サーバにSSH接続し以下の通り進めていく。
# nginxのインストール dnf install nginx # インストールされたバージョンの確認 nginx -v # 出力結果 nginx version: nginx/1.14.1 # カスタム設定ファイルの作成 vi /etc/nginx/conf.d/custom.conf
カスタム設定ファイルは以下内容で保存。ドメイン部分は適宜変更すること。
# =========================================================
# IPアドレス直接指定・未定義ドメインのアクセスを拒否
# =========================================================
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
# SSL証明書の設定
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
# レスポンスは何も返さずに接続を拒否
return 444;
}
# =========================================================
# HTTP -> HTTPSリダイレクト
# =========================================================
server {
listen 80;
listen [::]:80;
server_name test.com www.test.com;
# すべてHTTPSへ301リダイレクト
return 301 https://test.com$request_uri;
}
# =========================================================
# wwwあり -> wwwなしへリダイレクト
# =========================================================
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.test.com;
# SSL証明書の設定
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
# wwwなしへ301リダイレクト
return 301 https://test.com$request_uri;
}
# =========================================================
# コンテナへリバースプロキシ
# =========================================================
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name test.com;
# SSL証明書の設定
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
# セキュリティ・TLS設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 最大アップロードサイズ(デフォルト値は1Mと少ないので変更)
client_max_body_size 20M;
# ログ設定
access_log /var/log/nginx/test.com.access.log;
error_log /var/log/nginx/test.com.error.log;
# コンテナへのリバースプロキシ設定
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
次にデフォルト設定ファイルを編集する。
# デフォルト設定ファイルのバックアップを作成(yyddmm部分は適宜変更) cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.yymmdd # デフォルト設定ファイルを開く vi /etc/nginx/nginx.conf
37~58行目付近の以下server{}部分を丸ごとコメントアウトもしくは削除する(カスタム設定ファイルのdefault_serverと衝突するため)。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
デフォルト設定ファイルを上書き保存。以下構文チェックを行い、問題が無ければ設定ファイルを適用させる。
# 構文チェック nginx -t # 出力結果 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # 設定ファイルを読み込ませて適用 systemctl reload nginx
Apacheから切り替え
引き続きサーバにSSH接続し以下の通り進める。
# Apacheの停止 systemctl stop httpd # Apacheの自動起動を停止 systemctl disable httpd # Nginxの起動 systemctl start nginx # Nginxの自動起動を設定 systemctl enable nginx
この時点でブラウザから設定したドメインにアクセスできる筈。
Let's Encryptの設定
# Nginx用のCerbotをインストール dnf install python3-certbot-nginx # Nginx用の認証用プラグインで証明書の既存の有効期限に関わらず強制的に再取得・更新(ドメイン部分は適宜変更) certbot certonly --nginx -d test.com -d www.test.com --force-renewal # 自動更新のテスト(証明書更新後にNginxもリロードされるかチェック) certbot renew --dry-run --deploy-hook "systemctl reload nginx" # certbotの全体設定ファイルのバックアップを作成(yymmdd部分は適宜変更) cp /etc/letsencrypt/cli.ini /etc/letsencrypt/cli.ini.yymmdd # certbotの全体設定ファイルを開く vi /etc/letsencrypt/cli.ini
設定ファイル内に以下を追記して保存。
deploy-hook = systemctl reload nginx
以上で設定完了となる。
補足
Cockpit上でApacheに関するエラー通知が表示される
Cockpit上で以下エラー通知が表示されていた。こちらはホスト(VPS)自体をrebootすることで表示されなくなった。
Failed to start The Apache HTTP Server. systemd httpd.service: Failed with result 'exit-code'. systemd httpd.service: Main process exited, code=exited, status=1/FAILURE systemd
関連記事
-
-
Let's Encryptの自動更新時「Failed to renew certificate~」エラーの対応方法
CentOSからAlmaLinuxに移行後、初めてのLet's Encrypt更 ...
-
-
CentOS6.10に無料SSL(Let's Encrypt)を導入
以前にもVPSにLet's Encryptを導入するという記事を書いたが、テスト ...
-
-
Nginxのバーチャルホスト設定とLet's Encryptの導入
NginxでVirtualHostの設定し、複数のドメインを同一サーバに割り当て ...
-
-
Podmanで導入したApacheのチューニング(mpm_prefork)に関する設定方法
Podmanで導入したApacheのチューニング(mpm_prefork)を行い ...
-
-
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...