概要
VPSへNginxを導入し、独自ドメインで静的ページを表示した後、Let's Encryptの証明書を使ってHTTPS化する流れを整理する。
Webサイトを公開するには、Nginxを起動するだけでなく、VPS事業者側のパケットフィルター、OS側のfirewalld、DNS、Nginxの仮想ホストを対応させる必要がある。SSL/TLS証明書は取得後も更新が続くため、自動更新のテストまでを一連の作業として確認する。
※ この記事は、CentOS Stream 9で構築した記録をもとに、2026年7月時点の公式情報を確認して再構成している。CentOS Stream 9のEOLは2027年5月31日に予定されているため、新規構築では運用予定期間を考慮してOSを選択する。NginxやCertbotの画面・パッケージ構成は更新されるため、実行前に各公式ドキュメントも確認する。
前提環境
- VPS
XServer VPS - OS
CentOS Stream 9 - Webサーバー
Nginx - ドメイン
example.com - DNS
example.comのAレコードがVPSのIPアドレスを指していること
この記事で扱うこと
- Nginxのインストールと自動起動設定。
- パケットフィルターと
firewalldでHTTP/HTTPSを許可する手順。 - ドキュメントルートと仮想ホストの設定。
- CertbotによるSSL/TLS証明書の取得とHTTPからHTTPSへの転送。
- 証明書の自動更新とNginxの確認方法。
作業時の注意点
- DNSの反映
証明書を取得する前に、対象ドメインがVPSのIPアドレスへ名前解決されることを確認する。 - 二つの通信制御
VPS側のパケットフィルターとOS側のfirewalldの両方で80番・443番ポートを許可する。 - 設定の反映
Nginxを再読込みする前に、必ずnginx -tで構文を確認する。 - HSTS
HTTPSで問題なく接続できることを確認してから有効化する。誤った設定は指定期間中ブラウザに保持される。 - 証明書の更新
取得だけで終わらせず、certbot renew --dry-runで自動更新できることを確認する。
実施内容
Nginxのインストール
-
Nginxをインストールし、自動起動を有効化
CentOS Stream 9のリポジトリからNginxを導入する。表示されるバージョンは更新状況によって異なる。$ sudo dnf update -y $ sudo dnf install -y nginx $ nginx -v $ sudo systemctl enable --now nginx $ sudo systemctl status nginx
HTTP・HTTPS通信の許可
-
XServer VPSのパケットフィルター
VPSパネルの「パケットフィルター設定」を有効にし、Web用のTCP 80番・443番ポートを接続元「すべて」から許可する。SSH用の22番ポートは、可能であれば管理端末のIPアドレスだけに制限する。
FTPを利用しない構成では、20番・21番ポートをWeb公開のために開ける必要はない。 -
firewalldの設定
Nginxが使用するHTTPとHTTPSの定義を恒久設定へ追加する。$ sudo systemctl enable --now firewalld $ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload $ sudo firewall-cmd --list-serviceshttpとhttpsが表示されれば、OS側の受信許可は完了となる。
ドキュメントルートの作成
-
公開用ディレクトリを作成
Nginxにはファイルの読取り権限だけを与え、公開ファイルをNginx実行ユーザーの所有物にする必要はない。$ sudo install -d -o root -g nginx -m 0755 /var/www/example.com/html $ sudo vim /var/www/example.com/html/index.html<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Nginx Test</title> </head> <body> <h1>Nginx is running.</h1> </body> </html>/var/www配下には通常Webコンテンツ用のSELinuxコンテキストが適用される。別の場所から移動したファイルがある場合は、既定値へ戻しておく。$ sudo restorecon -Rv /var/www/example.com
Nginxの仮想ホスト設定
-
初期設定をバックアップ
$ sudo cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.initial $ sudo nginx -Tnginx -Tで読み込まれる設定全体を確認し、default_serverが複数定義されないようにする。パッケージ標準のserverブロックがある場合は、未登録のHTTPホストを拒否する既定サーバーとして整理する。 -
未登録のHTTPホストを拒否する設定
/etc/nginx/conf.d/00-default.confを作成する。既存の設定にdefault_serverがある場合は、先にその指定を削除または置換する。server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } -
example.com用の設定
/etc/nginx/conf.d/example.com.confを次の内容で作成する。server { listen 80; listen [::]:80; server_name example.com; root /var/www/example.com/html; index index.html; location / { try_files $uri $uri/ =404; } }www.example.comも利用する場合は、先にDNSレコードを作成してからserver_nameと後述のCertbotコマンドへ追加する。 -
設定の構文確認と再読込み
$ sudo nginx -t $ sudo systemctl reload nginx $ curl -I http://example.com/HTTP/1.1 200 OKが返り、ブラウザにテストページが表示されればHTTPでの公開は成功となる。
Certbotのインストール
-
Snap版Certbotを導入
Certbot公式のNginx向け手順に合わせ、EPELからsnapdを導入する。既に別の方法でCertbotをインストールしている場合は、複数の導入方法を混在させない。$ sudo dnf install -y epel-release $ sudo dnf install -y snapd $ sudo systemctl enable --now snapd.socket $ sudo ln -s /var/lib/snapd/snap /snap $ sudo snap install core $ sudo snap refresh core $ sudo snap install --classic certbot $ sudo ln -s /snap/bin/certbot /usr/local/bin/certbot $ certbot --versionシンボリックリンクが既に存在する場合は、作成済みのリンク先を確認し、重複して作成しない。
SSL/TLS証明書の取得
-
Nginxプラグインで証明書を取得
次のコマンドは、ドメイン認証、証明書の取得、Nginxへの証明書設定をまとめて行う。途中でHTTPからHTTPSへのリダイレクトを選択する。$ sudo certbot --nginx -d example.com $ sudo nginx -t $ sudo systemctl reload nginx--nginxと--webrootは異なる認証方法となるため、一つのコマンドで混在させない。設定を手動管理したい場合はcertbot certonly --nginxで証明書だけを取得し、Nginxの設定を別途行う。 -
HTTPSとリダイレクトを確認
$ curl -I https://example.com/ $ curl -I http://example.com/HTTPSで正常な応答が返り、HTTPがHTTPSへ
301または308で転送されれば成功となる。
セキュリティ関連ヘッダーの設定
-
HTTPS用の
serverブロックへ追加
Certbotが生成または更新したHTTPS用設定へ、サイトの要件に合うヘッダーを追加する。X-XSS-Protectionは現在のブラウザで廃止されているため使用しない。server_tokens off; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "DENY" always; add_header Referrer-Policy "same-origin" always; add_header Strict-Transport-Security "max-age=31536000" always;フレーム内表示が必要なサイトでは、
X-Frame-OptionsやCSPのframe-ancestorsを要件に合わせる。HSTSのincludeSubDomainsやpreloadは、すべてのサブドメインを恒久的にHTTPS化できる場合だけ検討する。$ sudo nginx -t $ sudo systemctl reload nginx $ curl -I https://example.com/
証明書の自動更新確認
-
更新処理をテスト
Certbotが用意したsystemd timerまたはcronの登録状況を確認し、実際の証明書を更新せずに処理を検証する。$ systemctl list-timers --all | grep -i certbot $ sudo certbot renew --dry-run証明書は短い有効期間で運用されるため、固定日付に手作業で更新するのではなく、自動更新の失敗を監視できる状態にする。
まとめ
- Nginxの公開では、VPS側とOS側の両方でHTTP・HTTPS通信を許可する。
- ドメインごとの設定は
conf.dへ分離し、未登録のHTTPホストを80番ポートの既定サーバーで拒否すると構成を把握しやすい。 - Nginxの設定変更は、
nginx -tに成功してから再読込みする。 - Certbotでは認証方法を混在させず、証明書取得後にHTTPSへの転送を確認する。
- SSL/TLS証明書は自動更新と
--dry-runによる検証まで含めて運用する。
参考文献
- The CentOS Project, Comparing CentOS Stream and CentOS Linux
- Red Hat, Deploying web servers and reverse proxies:Setting up and configuring NGINX
- XServer VPS, パケットフィルターの設定
- NGINX Documentation, Server names
- NGINX Documentation, Module ngx_http_headers_module
- Snapcraft Documentation, Install snap on CentOS
- Certbot, Nginx on Linux(snap)
- RFC Editor, RFC 6797:HTTP Strict Transport Security