SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともにわかりやすく伝える解説サイトです。

VPSで作るDjangoサイト構築手順 - Nginx編:2/4 Nginx・SSL/TLS初期設定

概要

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-services

    httphttpsが表示されれば、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 -T

    nginx -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のincludeSubDomainspreloadは、すべてのサブドメインを恒久的に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による検証まで含めて運用する。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp