DELOGs
[サーバ構築編#6] UbuntuへNginx1.28.0をインストール

サーバ構築編#6
UbuntuへNginx1.28.0をインストール

Ubuntu 24.04.2 LTSへNginx1.28.0をインストールします。合わせて、SetGIDやACLを利用して運用しやすいディレクトリの権限設定を実施

初回公開日

最終更新日

サーバ構築編第6回からは、サーバへ個別のミドルウェアをインストールしていきます。 WebサーバであるNginx1.26.3のインストールを進めます。 合わせて、SetGIDやACLを利用して運用しやすいディレクトリの権限設定を実施します。
前提として、このサーバでは、Node.jsでNext.jsで作られたサイトを運用する想定です。 また、利用するドメインのDNSの設定がまだの場合は、それを完了させてください。 DNSの設定はとりあえず仮にexample.comなら、example.comとwww.example.comのIPアドレス(Aレコード)について、WebサーバのグローバルIPが設定されていれば問題ありません。

1. Nginx1.28.0のインストール手順

Ubuntu 24.04の標準リポジトリでインストール可能なNginxのバージョンを調べる

bash
1sudo apt update 2apt-cache policy nginx
bash
1nginx: 2 インストールされているバージョン: (なし) 3 候補: 1.24.0-2ubuntu7.1 4 バージョンテーブル: 5 1.24.0-2ubuntu7.1 500 6 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 7 500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages 8 1.24.0-2ubuntu7 500 9 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages
標準リポジトリからのインストールだとnginx-1.24.0がインストールされるようです。 2025年5月27日現在は、Nginx安定版(Stable version)の最新は nginx-1.28.0となっています。 https://nginx.org/en/download.html 
最新の安定版をイントールしていきます。

Nginx公式リポジトリのGPGキーをバイナリ形式で保存

Ubuntu標準リポジトリ以外からインストールを行うには、バイナリ形式(.gpg)でGPGキーを保存 するのが推奨されています。
bash
1sudo mkdir -p /etc/apt/keyrings #/etc/apt/keyringsディレクトリがない場合 2curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/nginx.gpg
  • curl -fsSL → Nginx公式のGPGキーを取得
  • gpg --dearmor -o /etc/apt/keyrings/nginx.gpg → バイナリ形式(.gpg)に変換して保存

Nginx公式リポジトリを追加

次に、安定版(Stable)を使うためのAPTリポジトリを追加します。
bash
1echo "deb [signed-by=/etc/apt/keyrings/nginx.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list > /dev/null
  • signed-by=/etc/apt/keyrings/nginx.gpg → GPGキーの正しいパスを指定
  • lsb_release -cs → noble を自動取得(Ubuntu 24.04)

Nginx 1.28.0をインストール

bash
1sudo apt update 2 3sudo apt install nginx -y
○インストールされたNginxのバージョンを確認
bash
1nginx -v
bash
1nginx version: nginx/1.28.0
Nginx 1.26.3のインストールは完了です。

2. Nginxの起動と有効化

Nginxを 起動 & 自動起動設定

bash
1sudo systemctl enable --now nginx
  • enable → OS起動時に自動起動
  • --now → すぐに起動
○ Nginx のステータス確認
bash
1systemctl status nginx
bash
1nginx.service - nginx - high performance web server 2 Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled) 3 Active: active (running) since ・・・
  • active (running) なら正常に動作中!

ufwでポートを解放

○ufwの状態を確認
bash
1sudo ufw status
○ポート 80(HTTP)と 443(HTTPS)を開放
bash
1sudo ufw allow 80/tcp # HTTP (リダイレクト用) 2sudo ufw allow 443/tcp # HTTPS (HTTP/2) 3sudo ufw allow 443/udp # HTTP/3 (QUIC)
HTTP/3での運用にも対応するため、UDPのポートも解放します。
○設定を反映させるため、ufw を再読み込み
bash
1sudo ufw reload
○ポート 80 でLISTENしているか確認
bash
1sudo lsof -i :80
bash
1COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 2nginx XXXXX root 6u IPv4 XXXXX 0t0 TCP *:http (LISTEN) 3nginx XXXXX nginx 6u IPv4 XXXXX 0t0 TCP *:http (LISTEN) 4nginx XXXXX nginx 6u IPv4 XXXXX 0t0 TCP *:http (LISTEN) 5nginx XXXXX nginx 6u IPv4 XXXXX 0t0 TCP *:http (LISTEN) 6nginx XXXXX nginx 6u IPv4 XXXXX 0t0 TCP *:http (LISTEN)
上記のように表示されれば、一旦有効化はOKです。 もし何も表示されなければsudo systemctl restart nginxnginxの再起動を試してみてください。

3.ディレクトリの準備と設定の確認

ユーザグループの設定

Nginxはwww-dataユーザーとして読み取り等の動作を行います。 運用時は各ユーザがrsyncscpなどでファイルをアップロードするので、対象ユーザをwww-dataグループに含めます。
bash
1sudo usermod -aG www-data deployuser
  • deployuser(実際に運用するユーザ名へ変えてください) を www-data グループに追加
  • -aG オプションで 既存のグループを維持しつつ www-data に追加(-G だけだと他のグループが消える)
設定を反映させるために、deployuser でログインし直すか、以下のコマンドで即時反映:
bash
1newgrp www-data

サイトデータを設置するディレクトリの作成

ここでは/var/wwwに各サイトのデータを配置する想定で話を進めます。 /var/wwwはデフォルトで存在すると思います。 Nginxが読み取りできるように、これの所有グループを変更します。
bash
1sudo chown root:www-data /var/www
パーミッションも変更します。
bash
1sudo chmod 775 /var/www

chmod g+s(SetGID)でディレクトリグループを親ディレクトリと統一

通常、新しいディレクトリを作成すると、そのディレクトリの グループは作成したユーザーのプライマリグループ になります。 しかし、chmod g+sを設定すると、親ディレクトリのグループを自動的に引き継ぐ ため、管理がしやすくなります。
SetGID を/var/wwwへ適用:
bash
1sudo chmod g+s /var/www
chmod g+s を適用した後の挙動
たとえば、deployuser で /var/www にディレクトリを作成すると:
bash
1mkdir /var/www/testsite 2ls -ld /var/www/testsite
出力:
bash
1drwxrwsr-x 2 deployuser www-data 4096 318 14:05 /var/www/testsite
  • グループが www-data に統一!(g+s の効果)
  • これにより、www-data(Nginx)でもアクセスしやすくなる!

setfacl(ACL)でwww-dataグループに書き込み権限を付与

通常、chmod g+s だけでは、ファイルの書き込み権限までは変更できません。 そのため、Nginx(www-data ユーザー)やその他のwww-dataグループのユーザがファイルを書き込む必要がある場合は、setfacl を使って www-data に rwx 権限を追加します。
acl パッケージをインストール:
bash
1sudo apt update 2sudo apt install acl -y
setfacl コマンドの確認:
bash
1setfacl --version
出力例:
bash
1setfacl --version
bash
1setfacl 2.3.2
aclの設定:
bash
1sudo setfacl -R -m g:www-data:rwx /var/www 2sudo setfacl -R -d -m g:www-data:rwx /var/www
  • www-data グループに /var/www の読み書き実行権限 (rwx) を付与!
  • すでにあるファイル・ディレクトリにも適用!(-R オプション)
  • -d -m g:www-data:rwx → 新しく作るディレクトリやファイルにも www-data:rwx を適用
setfacl を適用した後の挙動
例えば、deployuser が /var/www/testsite/index.html を作成すると:
bash
1touch /var/www/testsite/index.html 2ls -l /var/www/testsite/index.html
出力:
bash
1-rw-rw-r--+ 1 deployuser www-data 0 318 14:10 /var/www/testsite/index.html
  • グループ www-data に rw- 権限が付与されている!(setfacl の効果)
  • ACL が適用されているファイルには + が付く!
これで、 www-dataグループに所属ユーザは/var/www配下のディレクトリ内のファイルを自由に上書きできるようになります。 複数人でサイトデータを更新するときに、「更新できない!」と言われないようにこの辺は最初に設定しておくと運用が楽になると思います。

4.バーチャルホスト設定(HTTP)

ここでは省略しますが、DNSの設定は済ませておいてください。
○バーチャルホスト用のディレクトリを作成
まず、Webサイトのデータを配置するディレクトリを作ります。 (例: example.com を設定する場合)
bash
1sudo mkdir -p /var/www/example.com/html
適当な index.html を作っておく:
bash
1echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/html/index.html

バーチャルホストの設定ファイルを作成

Nginx 公式リポジトリ版(nginx.org からインストールしたもの)では、conf.d/ を使うのがデフォルト になっています。 ここでもconf.d/配下にバーチャルホストの設定ファイルを追加して利用していきます。
Nginx の設定ファイルを /etc/nginx/conf.d/ に作成します。
bash
1sudo vi /etc/nginx/conf.d/example.com.conf
bash : example.com.conf
1server { 2 listen 80; 3 server_name www.example.com; 4 5 return 301 http://example.com$request_uri; 6} 7 8server { 9 listen 80; 10 server_name example.com; 11 12 root /var/www/example.com/html; 13 index index.html; 14 15 location / { 16 try_files $uri $uri/ =404; 17 } 18}
sslの設定をすると、上記は利用しなくなりますが、一応、リダレクト処理やtry_filesで404を返す処理などは記述しておきます。
同様に、ホスト設定を追加する際は、/etc/nginx/conf.d/配下にxxxxx.confというドメインの設定ファイルを追加していきます。
仮に一時的に利用しなくなったドメインは下記のようにすると一時無効化ができます。
bash
1sudo mv /etc/nginx/conf.d/example.com.conf /etc/nginx/conf.d/example.com.conf.disabled
もちろん、ドメインを利用しなくなればconfファイルを削除すればOKです。
bash
1sudo rm /etc/nginx/conf.d/example.com.conf

default.conf を無効化

bash
1sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled
この設定があると、「どのサーバーにも該当しないリクエスト」がデフォルトの /usr/share/nginx/html に行ってしまうので、意図しないページが表示を避けるためにはdefault.confを無効化

Nginxを再起動

bash
1sudo nginx -t # 設定ファイルのチェック 2sudo systemctl restart nginx # Nginx を再起動
Nginx を再起動したら、ブラウザでアクセスしてチェックします。
続きはこちら...
前回の確認はこちら...
この記事の執筆・編集担当
DE

松本 孝太郎

DELOGs編集部/中年新米プログラマー

ここ数年はReact&MUIのフロントエンドエンジニアって感じでしたが、Next.jsを学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。