Ubuntu 26.04 講座 / Nginx サイト構成: sites-available と sites-enabled

Ubuntu Nginxのサイト設定は、実際のinclude構造を確認した後、sites-availableの構成ファイルをsites-enabledで有効化する方式で管理できます。この実習では127.0.0.1:8080に2つのサイトを構成し、外部公開なしでホストごとの応答を確認します。

ここで外部に公開しない対象は、新しい8080番の実習サイトです。UbuntuのNginxインストールでは、基本サイトを起動できるため、サーバー全体がループバック専用になるわけではありません。インストール前にUFW講座の管理接続保持とファイアウォール範囲を確認するか、外部と分離された専用実習VMで行います。

インストールと既存設定の確認

sudo apt update
sudo apt install nginx curl
sudo nginx -t
sudo nginx -T
sudo ss -lntp

専用VMで実施し、既存のウェブサーバーがポートを使用している場合でも強制終了は行いません。nginx -Tで実際のsites-enabled includeや既存のlisten・server_name・デフォルトサーバーを確認します。全体構成には機密性の高いアドレスや認証設定が含まれる可能性があるため、公開しません。

Ubuntu Nginx構成案内は、基本サイトとserver block・ドキュメントルートの関係を説明しています。

標準の80番サイトの公開範囲を確認する

sudo ss -lntp
sudo ufw status verbose
ls -l /etc/nginx/sites-enabled
sudo nginx -T

0.0.0.0:80·[::]:80 のようなリスナーは 127.0.0.1:8080 とは異なります。UFW が無効、または広範囲に80番を許可している環境では、基本サイトに他のデバイスがアクセスできる可能性があります。サーバー内部と実際に許可・除外するクライアントの新しい接続を分けて確認します。

新しい専用 VM でパッケージの基本サイトが不要な場合は、以下のブロックでそのシンボリックリンクをバックアップしたうえで、リンクだけを削除して無効化できます。既存の運用サイトには適用しません。予想されるリンク・対象やチェック・バックアップが異なる、または失敗した場合は中止します。

(
set -eu
link=/etc/nginx/sites-enabled/default
if [ ! -L "$link" ] || [ "$(readlink -f "$link")" != /etc/nginx/sites-available/default ]; then
    printf 'Not the expected package-default symlink; inspect manually.\n' >&2
    exit 1
fi
backup_dir=$(sudo mktemp -d /root/nginx-default-link.XXXXXX)
sudo cp -a "$link" "$backup_dir/default"
printf 'Preserved link: %s/default\n' "$backup_dir"
sudo rm -- "$link"
sudo nginx -t
sudo systemctl reload nginx
sudo ss -lntp
)

元の sites-available/default は残します。80番が残っている場合は他のサイト・プロセスを調査します。復元は記録したバックアップのリンクを使用し、同じ名前にその後変更がないか確認して元の位置に戻した後、nginx -t が成功してから reload します。他の管理者の変更を上書きしません。

Ubuntu の Nginx インストール案内でパッケージ導入とサービス開始を確認できます。

異なるドキュメントルートを準備する

以下の名前のフォルダーと設定ファイルがすでに存在する場合は、内容を保持し、実習用の名前を新たに設定します。専用の空のパスで次のように異なる応答を作成します。ウェブサーバーユーザーが読み取れるようにする必要がありますが、すべてのユーザーに書き込み権限を与える必要はありません。

sudo install -d -m 0755 /srv/ubuntu-course-alpha /srv/ubuntu-course-beta
printf '%s\n' 'alpha-site' | sudo tee /srv/ubuntu-course-alpha/index.html
printf '%s\n' 'beta-site' | sudo tee /srv/ubuntu-course-beta/index.html

1つの構成ファイルに完全なローカルサイトを定義する

/etc/nginx/sites-available/ubuntu-course-labという新しいファイルに次の全構成を保存します。alpha.example.testとbeta.example.testはドキュメント・ローカル試験用の名前であり、実際のDNS登録やHTTPS認証の対象ではありません。80番ポートの標準サイトの有効・無効は、この8080番の実習とは別に管理します。

server {
    listen 127.0.0.1:8080 default_server;
    server_name _;
    return 404;
}
server {
    listen 127.0.0.1:8080;
    server_name alpha.example.test;
    root /srv/ubuntu-course-alpha;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
server {
    listen 127.0.0.1:8080;
    server_name beta.example.test;
    root /srv/ubuntu-course-beta;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

最初のブロックは、同じアドレス・ポートで未知のHostを404で処理します。server_nameのアンダースコア自体は特別な拒否機能ではなく、default_serverがデフォルト要求を受け取るようにした構成です。同じアドレス・ポートでデフォルトサーバーを重複指定しません。

有効化後の構文チェックとreload

(
set -eu
sudo ln -s /etc/nginx/sites-available/ubuntu-course-lab /etc/nginx/sites-enabled/ubuntu-course-lab
sudo nginx -t
sudo systemctl reload nginx
)

シンボリックリンクがすでにある場合は上書きせず、まず対象を確認します。nginx -tが失敗した場合はreloadせず、ファイル・行・ポートの競合を修正します。構文チェックの成功は、実際のファイル権限や正しいHost応答までは保証しません。

名前・パス・デフォルト応答をそれぞれテストする

curl --fail --show-error --resolve alpha.example.test:8080:127.0.0.1 http://alpha.example.test:8080/
curl --fail --show-error --resolve beta.example.test:8080:127.0.0.1 http://beta.example.test:8080/
curl -i -H "Host: unknown.example.test" http://127.0.0.1:8080/

最初の二つのリクエストはそれぞれ alpha-site・beta-site を、最後のリクエストは 404 を期待します。--resolve はこのリクエストの名前と接続先アドレスだけを指定し、システム DNS を変更しません。サーバーの応答が異なる場合は include・重複する server_name・リクエストポート・ドキュメントルートとログを照合します。

実習を無効化するには今回の sites-enabled リンクだけを削除した後、nginx -t を通過させて reload します。既存のサイトや元のファイルは一緒に削除しません。実際のインターネット公開は、ドメイン・アドレス・ファイアウォール・HTTPS・ログポリシーを別途準備した後に行う必要があります。