目次
はじめに
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のメイン設定ファイルです。

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 auto | CPUコア数に応じて自動でワーカープロセス数を設定 |
worker_connections 1024 | 1プロセスが同時に処理できる接続数 |
gzip on | レスポンスを圧縮して転送量を削減 |
gzip_types | 圧縮対象のMIMEタイプ(CSS・JS・JSON・SVGなど) |
gzip_min_length 1024 | 1KB以上のファイルのみ圧縮 |
sendfile on | ファイル転送の最適化 |
keepalive_timeout 65 | Keep-Alive接続を65秒維持 |
include /etc/nginx/conf.d/*.conf | conf.dフォルダの設定ファイルを読み込む |
最後のincludeが重要で、サイトごとの設定ファイルはすべてconf.d/フォルダに配置します。
Step 2:サイトごとの設定ファイル(conf.d/)
各サイトの設定はconf.d/フォルダに1サイト1ファイルで管理します。
upstream設定

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 ssl | HTTPS(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サイト目も同じ構造で作成します。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

200や301が返っていれば正常です。
Step 5:ContainerStationで確認する

ContainerStationの「コンテナ」タブでnginx_reverse_proxy_sharedが「実行中」になっていることを確認します。
Step 6:ブラウザで動作確認する


両サイトが正常に表示されれば設定完了です。
新しいサイトを追加するときの手順
分離構成のメリットとして、新しいサイトの追加が簡単です。
conf.d/フォルダに新しい.confファイルを作成- 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/にファイルを追加するだけで対応できる
