コンテンツにスキップ

HTTP/HTTPSとリダイレクトの設定

Debian / Ubuntu 系で nginx をインストールし、HTTP 公開、HTTPS 公開、HTTP から HTTPS へのリダイレクトを設定する。


項目 例
OS Debian 13.x(Ubuntu系でも概ね同様)
サイト名 www.example.com
ドキュメントルート /var/www/www.example.com/html
証明書 /etc/nginx/tls/www.example.com/fullchain.pem
秘密鍵 /etc/nginx/tls/www.example.com/privkey.pem
設定ファイル /etc/nginx/sites-available/www.example.com.conf

証明書と秘密鍵の成果物は作成済みとし、手順4でnginxへ配備する。作成方法は Server Certificateの作成 を参照する。


Terminal window
sudo apt update
sudo apt install nginx

サービス状態を確認する。

Terminal window
systemctl status nginx

2. HTTP用のドキュメントルートを作る

Section titled “2. HTTP用のドキュメントルートを作る”
Terminal window
sudo mkdir -p /var/www/www.example.com/html

確認用の HTML を作る。

Terminal window
cat <<'EOF' | sudo tee /var/www/www.example.com/html/index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>www.example.com</title>
</head>
<body>
<h1>www.example.com</h1>
</body>
</html>
EOF

/etc/nginx/sites-available/www.example.com.conf を作成する。

/etc/nginx/sites-available/www.example.com.conf
server {
listen 80;
listen [::]:80;
server_name www.example.com;
root /var/www/www.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

有効化する。

Terminal window
sudo ln -s /etc/nginx/sites-available/www.example.com.conf \
/etc/nginx/sites-enabled/www.example.com.conf

構文を確認して reload する。

Terminal window
sudo nginx -t
sudo systemctl reload nginx

HTTP で確認する。

Terminal window
curl -I http://www.example.com/

期待する状態は、200 OK が返ることである。


Server Certificateの作成 で作成した fullchain.pem と privkey.pem を配備する。

Terminal window
sudo install -d -o root -g root -m 700 \
/etc/nginx/tls/www.example.com
sudo install -o root -g root -m 644 fullchain.pem \
/etc/nginx/tls/www.example.com/fullchain.pem
sudo install -o root -g root -m 600 privkey.pem \
/etc/nginx/tls/www.example.com/privkey.pem

fullchain.pem はサーバー証明書、Intermediate CA証明書の順で連結する。Root CA証明書は含めず、接続するクライアントのTrust Storeへ登録する。

検証用クライアントがDebianの場合の例。

Terminal window
sudo install -o root -g root -m 644 ca.crt \
/usr/local/share/ca-certificates/skills-root-ca.crt
sudo update-ca-certificates

同じ設定ファイルに HTTPS 用の server を追加する。

/etc/nginx/sites-available/www.example.com.conf
server {
listen 80;
listen [::]:80;
server_name www.example.com;
root /var/www/www.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/tls/www.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/tls/www.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/www.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

構文を確認して reload する。

Terminal window
sudo nginx -t
sudo systemctl reload nginx

HTTPS で確認する。

Terminal window
curl -I https://www.example.com/

証明書エラーになる場合は、接続名がSANと一致するか、Root CAが検証用端末のTrust Storeへ登録されているか、サーバーがIntermediate CA証明書を配布しているかを確認する。

切り分けだけなら curl -k で証明書検証を一時的に無効化できるが、最終確認や通常運用では使わない。


6. HTTPからHTTPSへリダイレクトする

Section titled “6. HTTPからHTTPSへリダイレクトする”

HTTP 用 server を、静的ファイル配信ではなくリダイレクト専用にする。

/etc/nginx/sites-available/www.example.com.conf
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/tls/www.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/tls/www.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/www.example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

反映する。

Terminal window
sudo nginx -t
sudo systemctl reload nginx

HTTP でアクセスし、HTTPS へリダイレクトされることを確認する。

Terminal window
curl -I http://www.example.com/

期待する状態は、301 Moved Permanently と Location: https://www.example.com/ が返ることである。


Terminal window
sudo nginx -t
sudo nginx -T
systemctl status nginx
journalctl -u nginx
curl -I http://www.example.com/
curl -I https://www.example.com/

nginx -T は、include された設定を含めて nginx が読んでいる設定全体を表示する。複数ファイルに分かれた設定の確認に使う。