Ubuntu 22.04でNginxをインストール・設定する:実践Webサーバー構築をA to Zで解説

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

5分でNginxを動かす — まず動かして、後から理解する

ターミナルを開いて、以下の3つのコマンドを実行しよう:

sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx

完了。ブラウザを開いて http://localhost またはサーバーのIPアドレスを入力すると、Nginxのデフォルトページがすぐ表示される。それだけだ。

ただし、ここで止まるとWebサーバーはデモページを表示するだけになる。以降では、Nginxが広く信頼されている理由と、実際のウェブサイトを動かすための設定方法を解説する。

Nginxとは何か、なぜApacheを使わないのか

「web server Linux」と検索すると、NginxとApacheという2つの名前が出てくる。両方を長年使ってきた率直な答えは:ケースバイケースだが、モダンなサーバー環境ではほとんどの場合Nginxに軍配が上がる。

Apacheは1995年に登場し、リクエストごとに独自のスレッドで処理する。トラフィックが少ない場合は問題ないが、同時接続が1,000件になると、Apacheは1,000スレッドを必要とし、RAMがみるみる消費される。

Nginxはまさにその問題を解決するために2004年に生まれた。イベント駆動アーキテクチャにより、1つのプロセスで数千の接続を同時に処理できる。自分が管理している4GB RAMのサーバーでは、NginxのワーカープロセスはRAMを約10〜15MBしか消費しない。同じトラフィックでApacheを動かすと?軽く100MB以上になってしまう。

NginxはピュアなWebサーバー以上のことができる:リバースプロキシ、ロードバランサー、HTTPキャッシュ——これらすべてが1つのコンパクトなパッケージに収まっている。

Ubuntu 22.04へのNginxインストール(正しい方法)

ステップ1:アップデートとインストール

sudo apt update
sudo apt install nginx -y

ステップ2:ステータスの確認

sudo systemctl status nginx

緑色で Active: active (running) と表示されれば問題ない。自動起動していない場合:

sudo systemctl start nginx
sudo systemctl enable nginx  # 再起動時に自動起動する

ステップ3:ファイアウォールの設定

Ubuntu 22.04ではUFWを使用する。Nginxの通過を許可しよう:

sudo ufw allow 'Nginx Full'
sudo ufw status

Nginx Full はHTTP(ポート80)とHTTPS(ポート443)の両方を開放する。テスト環境でHTTPだけが必要な場合は、代わりに Nginx HTTP を使おう。

Nginxのディレクトリ構造 — 迷わないために把握しておく

どのファイルがどこにあるかを先に把握しておけば、後で探し回らずに済む:

  • /etc/nginx/nginx.conf — メインの設定ファイル、通常は触る必要がない
  • /etc/nginx/sites-available/ — 各ウェブサイトの設定ファイルを格納(無効なサイトも含む)
  • /etc/nginx/sites-enabled/ — sites-availableへのシムリンク、稼働中のサイトのみ
  • /var/www/html/ — デフォルトのWebディレクトリ
  • /var/log/nginx/ — ログファイル(access.logとerror.log)

この仕組みはなかなか賢い:sites-available に設定ファイルを作成し、sites-enabled へシムリンクを張って有効化する。ウェブサイトを一時的に無効にしたい場合はシムリンクを削除するだけ——元のファイルを削除する必要はない。メンテナンス時にとても便利だ。

バーチャルホストの設定 — 1台のサーバーで複数のウェブサイトをホスト

この部分を飛ばして後で困る人が多い。バーチャルホストを使えば、1台のサーバーで複数のウェブサイトを動かし、ドメイン名で区別できる。

ウェブサイト用のディレクトリとコンテンツを作成する

sudo mkdir -p /var/www/mysite.com/html
sudo chown -R $USER:$USER /var/www/mysite.com/html
echo "<h1>私のウェブサイト</h1>" | sudo tee /var/www/mysite.com/html/index.html

Nginxの設定ファイルを作成する

sudo nano /etc/nginx/sites-available/mysite.com

ファイルの内容:

server {
    listen 80;
    listen [::]:80;

    server_name mysite.com www.mysite.com;
    root /var/www/mysite.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/mysite.access.log;
    error_log /var/log/nginx/mysite.error.log;
}

ウェブサイトを有効化してリロードする

sudo ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/
sudo nginx -t          # リロード前にシンタックスを確認する
sudo systemctl reload nginx

nginx -t コマンドはとても重要だ——設定ファイルのシンタックスエラーによるWebサーバーのクラッシュを防ぐため、リロード前に必ず実行しよう。

応用編:Nginxをバックエンドアプリのリバースプロキシとして使う

本番環境でよくあるシナリオ:Node.js/Python/GoアプリがポートS3000で動いていて、ドメイン付きでポート80/443を通じて外部に公開したい場合だ。Nginxが中間に立ち、橋渡し役を果たす。

server {
    listen 80;
    server_name app.mysite.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
    }
}

X-Real-IPX-Forwarded-For の2つのヘッダーにより、バックエンドアプリはNginxのIPではなく、クライアントの本来のIPアドレスを受け取れる。この行がないと、すべてのリクエストが127.0.0.1から来たことになり、デバッグログが非常に見づらくなる。

Let’s EncryptでHTTPSを有効化 — 無料かつ自動

ChromeはHTTPSのないすべてのサイトに「保護されていない通信」と表示し、UXとSEOランキングの両方に影響する。Certbotはこれを完全無料で処理してくれる:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d mysite.com -d www.mysite.com

CertbotはNginxの設定ファイルを自動的に編集してSSLを追加する。証明書は90日ごとに自動更新される——確認するには:

sudo certbot renew --dry-run

日常的に使う人からの実践的なTips

1. ログは最高のデバッグツール

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

ウェブサイトに問題がある?ターミナルを2つ開こう:1つはerror.logを監視し、もう1つでエラーを再現する。ほとんどの問題はすぐに明らかになる。

2. Gzipと基本的なセキュリティでパフォーマンスを最適化する

/etc/nginx/nginx.confhttp {} ブロックに以下を追加する:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1000;

keepalive_timeout 65;
server_tokens off;  # レスポンスヘッダーからNginxのバージョンを隠す

gzip on はレスポンスをクライアントに送る前に圧縮する——HTML/CSS/JSファイルの帯域幅を60〜70%削減できる。server_tokens off はレスポンスヘッダーからNginxのバージョンを隠し、攻撃者に脆弱性を探す情報を与えない。

3. レートリミット — スパムとブルートフォースをブロックする

http {
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=api burst=20 nodelay;
        }
    }
}

この設定は各IPアドレスが /api/ へ送れるリクエストを1秒あたり10件に制限する。数行の設定で、追加ツール不要でブルートフォースや基本的なリクエストフラッドのほとんどをブロックできる。

4. ダウンタイムなしのリロード — 本番環境の秘訣

# シンタックスを確認する
sudo nginx -t

# ダウンタイムなしでリロードする
sudo systemctl reload nginx

restart とは違い、reload はNginxを停止しない——新しい設定を読み込んで適用するが、既存の接続は切断されない。本番環境では、常に restart ではなく reload を使おう

まとめ

Nginxは評判ほど怖くない。2分でインストール完了。さらに5分でバーチャルホストが動く。リバースプロキシやSSLも——数ブロックの設定を追加するだけだ。

覚えておくべき3つのこと:リロード前に必ず nginx -t を実行する、restart ではなく reload を使う、そしてログファイルを軽く見ない——問題が発生したときに最初に確認すべき場所だ。

Share: