Ubuntu Server 22.04 ガイド
WEB 01 / 05

NginxでWebページを配信する

Nginxを導入し、自分のWebページを別端末のブラウザーから確認します。

01 / 前提と公開範囲を確認する

対象はUbuntu Server 22.04へ新規にNginxを導入する構成です。物理マシン・仮想マシンの操作は共通です。管理者とSSH、ファイアウォール、OS更新を済ませ、sudoと復旧コンソールを確保してください。

この章の到達点は、別端末からHTTPで自分のページを表示することです。HTTPは暗号化されません。ログイン画面や秘密情報を公開せず、HTTPSは後の章で設定します。

以下の設定は既定サイトを切り替えます。既にWebサイト・コンテナー・リバースプロキシを運用しているサーバーは対象外です。ポート80の利用状況と既存設定を確認し、使用中ならここで中断して構成を設計してください。コマンドは特記以外、サーバーの一般管理者で実行します。

sudo ss -ltnp
sudo ufw status verbose
sudo test ! -e /etc/nginx/sites-available/server-guide
sudo test ! -e /var/www/server-guide

CLIENT_IPはサーバーから見える確認用端末の送信元IP、SERVER_IPは端末から到達できるサーバーのアドレスへ置き換えます。NAT・VPN・仮想NIC・クラウド側のFWも通信経路に含まれます。

02 / Nginxとサイト用ファイルを用意する

sudo apt-get update && sudo apt-get install nginx curl
sudo systemctl enable --now nginx
systemctl is-active nginx
systemctl is-enabled nginx

パッケージ取得や署名検証に失敗したら進まず、APTのエラーを修正します。サービスがactive・enabledであることを確認してください。配信ファイルは管理者が更新し、Webプロセスに書き込み権限を渡しません。

sudo test ! -e /var/www/server-guide &&
sudo install -d -o root -g root -m 755 /var/www/server-guide/public
sudo test ! -e /var/www/server-guide/public/index.html &&
printf '%s\n' '<!doctype html><html lang="ja"><meta charset="utf-8"><title>Server Guide</title><h1>Nginx is ready</h1></html>' | sudo tee /var/www/server-guide/public/index.html >/dev/null
sudo chown root:root /var/www/server-guide/public/index.html
sudo chmod 644 /var/www/server-guide/public/index.html

既存ディレクトリやファイルがあって検査に失敗した場合は、そのまま続けず内容を確認します。chmod 777やWebルート全体のwww-data所有への変更は行いません。

03 / サイト設定を作り切り替える

Web公開領域の外に設定をバックアップし、保存先を控えます。以下はこの手順で作る新規サイト専用です。

BACKUP="$(sudo mktemp -d /root/server-guide-nginx.XXXXXX)" &&
sudo cp -a /etc/nginx "$BACKUP/"
printf '保存先: %s
' "$BACKUP"

既存ファイルがないことを確認して、次の設定を書き込みます。server_name _はドメインを取得する設定ではありません。ここではIPv4の既定サイトとしてIPアドレスで確認します。IPv6で公開する場合は待受・FW・経路も別途設定し確認してください。

sudo test ! -e /etc/nginx/sites-available/server-guide &&
sudo tee /etc/nginx/sites-available/server-guide >/dev/null <<'EOF'
server {
    listen 80 default_server;
    server_name _;
    root /var/www/server-guide/public;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
    location ~ /\. {
        deny all;
    }
    location ~ \.php$ {
        return 404;
    }
}
EOF

標準のdefaultシンボリックリンクだけを外し、新規サイトを有効化します。他のサイト設定やファイルを一括削除しないでください。defaultが通常ファイルの場合や別の既定サイトがある場合は、ここで中断して確認します。

sudo ln -s /etc/nginx/sites-available/server-guide /etc/nginx/sites-enabled/server-guide &&
sudo test -L /etc/nginx/sites-enabled/default &&
sudo unlink /etc/nginx/sites-enabled/default &&
sudo nginx -t && sudo systemctl reload nginx

構文検査が失敗したら再読み込みせず、表示されたファイルと行を修正します。未導入のPHPファイルは404にしてソースを配信しない構成です。

04 / ローカルと別端末から表示する

curl --fail --show-error http://127.0.0.1/
sudo nginx -t
sudo ss -ltnp

サーバー内でNginx is readyを含むHTMLが返り、構文検査が成功し、TCP 80番の待受があることを確認します。次にUFWが有効なら、先に確認用端末だけのHTTP受信を許可します。既存のSSH許可を削除せず、新規SSH接続も確認してください。

sudo ufw allow from CLIENT_IP to any port 80 proto tcp
sudo ufw status numbered

別の端末のブラウザーでhttp://SERVER_IP/を開き、同じページが表示されることを確認します。curlを使う場合も別端末で次を実行します。

curl --fail --show-error http://SERVER_IP/

つながらないときは、①サーバー内のHTTP応答、②待受とサービス、③サーバー側FW、④クラウド・ルーター・NAT/ポート転送、⑤接続先アドレスの順で切り分けます。広い公開が必要なら対象とIPv4/IPv6を決めて許可しますが、この段階で無条件に全世界へ公開する必要はありません。

参考:動作確認と撮影条件

Ubuntu Server 22.04.5の実VM、Nginx 1.18.0で、構文検査・起動・自動起動・HTTP 200とページ本文を確認しました。別クライアントからのNAT転送経由HTTPは、UFW許可前は応答せず、管理元だけの許可後に200になりました。PHP URLの404も確認しています。物理機・公開インターネット・IPv6の到達性は未検証です。

Nginxの起動・HTTP応答の実行確認画面
Ubuntu Server 22.04の検証用VMの実画面。読者のアドレスやバージョンは環境により異なります。

05 / ログと戻し方を確認する

sudo journalctl -u nginx -b --no-pager
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 20 /var/log/nginx/access.log

403はファイルと親ディレクトリの権限、404はrootとファイル名、接続拒否は待受とサービス、タイムアウトは経路とFWを確認します。アクセスログには利用者のIP等が残るため、公開資料へそのまま貼り付けません。

この章だけを取り消す場合は、追加したsites-enabled/server-guideリンクを外し、変更前に有効だったdefaultリンクをバックアップと照合して戻します。sudo nginx -t && sudo systemctl reload nginxで反映します。追加したHTTP許可だけを削除し、SSH許可や無関係なFWルールを消さないでください。

静的ページが別端末で表示されたら、PHP-FPMの実行環境へ進みます。参考:Nginx公式の基本ガイド。