勉強したことのメモ.

Webエンジニア / プログラマが勉強したことのメモ。

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

 - Nginx サーバー

  関連記事

Let's Encryptの自動更新時「Failed to renew certificate~」エラーの対応方法
Let's Encryptの自動更新時「Failed to renew certificate~」エラーの対応方法

CentOSからAlmaLinuxに移行後、初めてのLet's Encrypt更 ...

CentOS6.10に無料SSL(Let's Encrypt)を導入
CentOS6.10に無料SSL(Let's Encrypt)を導入

以前にもVPSにLet's Encryptを導入するという記事を書いたが、テスト ...

Nginxのバーチャルホスト設定とLet's Encryptの導入
Nginxのバーチャルホスト設定とLet's Encryptの導入

NginxでVirtualHostの設定し、複数のドメインを同一サーバに割り当て ...

Podmanで導入したApacheのチューニング(mpm_prefork)に関する設定方法
Podmanで導入したApacheのチューニング(mpm_prefork)に関する設定方法

Podmanで導入したApacheのチューニング(mpm_prefork)を行い ...

Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法

先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...