QNAPのDockerでNginxリバースプロキシを設定する方法【複数WordPressサイト対応】

QNAPのDockerでNginxリバースプロキシを設定する方法【複数WordPressサイト対応】

2026年3月29日

はじめに

QNAPのContainerStationでWordPressを複数サイト運用する場合、Nginxリバースプロキシを使うことでドメインごとに適切なWordPressコンテナにリクエストを振り分けることができます。

この記事では、実際に運用中の設定ファイルをもとに、NginxリバースプロキシをQNAPのDockerで設定する手順と各設定の意味を解説します。


Nginxリバースプロキシとは

リバースプロキシとは、クライアントからのリクエストを受け取り、適切なサーバーに転送する仕組みです。

[ブラウザ]
    ↓
[Cloudflare Tunnel]
    ↓
[Nginx リバースプロキシ] ← ここでドメインごとに振り分け
    ↓              ↓
[WordPress A]  [WordPress B]

Nginxリバースプロキシを使うメリット:

  • 1つのNginxで複数のWordPressサイトを管理できる
  • ドメインごとにSSL証明書を設定できる
  • www→非wwwのリダイレクトを一元管理できる
  • 静的ファイルのキャッシュ設定ができる

環境

  • QNAP NAS(ContainerStation インストール済み)
  • Docker Compose で構築
  • Cloudflare Tunnel でインターネット公開
  • WordPress × 複数サイト

ファイル構成

shared/
├── docker-compose.yml
├── nginx/
│   ├── nginx.conf          ← Nginxのメイン設定
│   └── conf.d/
│       ├── your-site1.conf ← サイト1の設定
│       └── your-site2.conf ← サイト2の設定
└── certs/
    ├── origin.crt          ← SSL証明書
    └── origin.key          ← SSL秘密鍵

docker-compose.ymlへの組み込み方

NginxをDockerコンテナとして起動するdocker-compose.ymlはこのように記述します。

services:
  nginx_reverse_proxy:
    container_name: nginx_reverse_proxy_shared
    image: nginx:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/certs:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
    networks:
      - shared_proxy

ポイント:

  • ports:ホストの80番・443番をコンテナに転送
  • volumes:設定ファイルを読み取り専用(:ro)でマウント
  • networks:WordPressコンテナと同じネットワークに接続

docker-compose.ymlの全体構成はこちら [QNAPのDockerを分離構成に移行する方法]


Step 1:nginx.confの設定

nginx.confはNginxのメイン設定ファイルです。

nginx.confの設定内容(worker_processes・gzip・keepalive等の共通設定)
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    gzip                   on;
    gzip_types             text/plain text/css application/javascript application/json image/svg+xml;
    gzip_min_length        1024;
    gzip_proxied           any;

    sendfile              on;
    keepalive_timeout     65;

    include /etc/nginx/conf.d/*.conf;
}

各設定の意味:

設定意味
worker_processes autoCPUコア数に応じて自動でワーカープロセス数を設定
worker_connections 10241プロセスが同時に処理できる接続数
gzip onレスポンスを圧縮して転送量を削減
gzip_types圧縮対象のMIMEタイプ(CSS・JS・JSON・SVGなど)
gzip_min_length 10241KB以上のファイルのみ圧縮
sendfile onファイル転送の最適化
keepalive_timeout 65Keep-Alive接続を65秒維持
include /etc/nginx/conf.d/*.confconf.dフォルダの設定ファイルを読み込む

最後のincludeが重要で、サイトごとの設定ファイルはすべてconf.d/フォルダに配置します。


Step 2:サイトごとの設定ファイル(conf.d/)

各サイトの設定はconf.d/フォルダに1サイト1ファイルで管理します。

upstream設定

Nginxのupstream設定ファイル(WordPressコンテナへの転送先定義)
upstream wordpress_your_site {
    server wordpress_your_site:80;
}

upstreamはリクエストの転送先を定義します。wordpress_your_siteはDockerコンテナ名で、同じDockerネットワーク内であればコンテナ名で名前解決できます。

www→非wwwリダイレクト(HTTP)

server {
    listen 80;
    server_name www.your-site.com;
    return 301 https://your-site.com$request_uri;
}

HTTPでwwwありのURLにアクセスした場合、wwwなしのHTTPSにリダイレクトします。

www→非wwwリダイレクト(HTTPS)

server {
    listen 443 ssl;
    server_name www.your-site.com;
    ssl_certificate     /etc/certs/origin.crt;
    ssl_certificate_key /etc/certs/origin.key;
    return 301 https://your-site.com$request_uri;
}

HTTPSでwwwありのURLにアクセスした場合も、wwwなしのHTTPSにリダイレクトします。

メインのサーバー設定

server {
    listen 443 ssl default_server;
    server_name your-site.com;

    ssl_certificate     /etc/certs/origin.crt;
    ssl_certificate_key /etc/certs/origin.key;

    location / {
        proxy_pass http://wordpress_your_site;
        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_set_header X-Forwarded-Proto $scheme;
    }

    location ~* \.(?:css|js|png|jpg|jpeg|gif|ico|woff2?|svg|ttf|eot)$ {
        proxy_pass http://wordpress_your_site;
        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_set_header X-Forwarded-Proto $scheme;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

各設定の意味:

設定意味
listen 443 sslHTTPS(443番ポート)で待ち受ける
default_serverデフォルトのサーバーブロック
proxy_passリクエストをWordPressコンテナに転送
proxy_set_header Host元のホスト名をWordPressに伝える
proxy_set_header X-Real-IPクライアントの実IPアドレスを伝える
proxy_set_header X-Forwarded-Forプロキシ経由のIPアドレスチェーンを伝える
proxy_set_header X-Forwarded-Proto元のプロトコル(https)を伝える
expires 30d静的ファイルを30日間キャッシュ
Cache-Control: public, immutable変更されないファイルとしてキャッシュ

X-Forwarded-Protoが重要な理由 WordPressはこのヘッダーを見てHTTPSかどうかを判断します。 これがないとWordPressが「HTTPでアクセスされている」と誤認してリダイレクトループが発生することがあります。


Step 3:2サイト目の設定ファイル

2サイト目のNginx設定ファイル(your-site2.conf)のスクリーンショット

2サイト目も同じ構造で作成します。conf.d/フォルダに追加するだけでNginxが自動的に読み込みます。

upstream wordpress_your_site2 {
    server wordpress_your_site2:80;
}

server {
    listen 80;
    server_name www.your-site2.com;
    return 301 https://your-site2.com$request_uri;
}

server {
    listen 443 ssl;
    server_name www.your-site2.com;
    ssl_certificate     /etc/certs/origin.crt;
    ssl_certificate_key /etc/certs/origin.key;
    return 301 https://your-site2.com$request_uri;
}

server {
    listen 443 ssl;
    server_name your-site2.com;
    ssl_certificate     /etc/certs/origin.crt;
    ssl_certificate_key /etc/certs/origin.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://wordpress_your_site2;
        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_set_header X-Forwarded-Proto $scheme;
    }

    location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|woff2?|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        proxy_pass http://wordpress_your_site2;
        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_set_header X-Forwarded-Proto $scheme;
    }
}

Step 4:Nginxを起動して動作確認する

cd /share/CACHEDEV4_DATA/docker/shared
docker compose up -d nginx_reverse_proxy

ログを確認します:

docker logs nginx_reverse_proxy_shared 2>&1 | tail -10
docker logsコマンドでNginxの起動ログを確認しているターミナル画面

200や301が返っていれば正常です。


Step 5:ContainerStationで確認する

ContainerStationのコンテナ一覧でnginx_reverse_proxy_sharedが実行中の状態

ContainerStationの「コンテナ」タブでnginx_reverse_proxy_sharedが「実行中」になっていることを確認します。


Step 6:ブラウザで動作確認する

両サイトが正常に表示されれば設定完了です。


新しいサイトを追加するときの手順

分離構成のメリットとして、新しいサイトの追加が簡単です。

  1. conf.d/フォルダに新しい.confファイルを作成
  2. Nginxをリロード
docker exec nginx_reverse_proxy_shared nginx -s reload

Nginxを停止せずに設定を反映できます。


まとめ

NginxリバースプロキシをQNAPのDockerで設定するポイントをまとめます。

  • nginx.confでgzip圧縮・keepalive等の共通設定を行う
  • サイトごとの設定はconf.d/フォルダに1ファイルで管理する
  • upstreamでWordPressコンテナへの転送先を定義する
  • proxy_set_headerでクライアント情報をWordPressに伝える
  • 静的ファイルはexpires 30dでキャッシュして高速化する
  • 新しいサイトはconf.d/にファイルを追加するだけで対応できる

関連記事