Difyコミュニティ版は非常に強力ですが、デフォルトの設定では1台のサーバーで1つのDifyインスタンスしか公開できません(ポート80/443を占有するため)。
しかし、Nginxをリバースプロキシとしてホストサーバーに設定することで、dify-a.yourdomain.com や dify-b.yourdomain.com のように、異なるドメイン名(サブドメイン)でアクセスされた場合に、それぞれ対応するDifyコンテナへリクエストを振り分けることが可能になります。
この記事では、1台のUbuntuサーバー上で複数のDifyインスタンス(例: difyai と aidify)を運用するための、ホストNginxの設定手順を詳しく解説します。SSL(HTTPS)の設定もこのNginxで行います。
前提条件:
- 1台のUbuntuサーバーが用意されていること。
- 各Difyインスタンスが、それぞれ別のディレクトリ(例:
/home/user/difyai,/home/user/aidify)にソースコードがクローンされ、Docker Composeで起動可能な状態になっていること。(参考: 『【補足1】DifyのためのConoHa VPS初期セキュリティ設定ガイド』) - 各Difyインスタンスに割り当てるドメイン名(またはサブドメイン)が用意され、サーバーのIPアドレスを指すようにDNS設定(Aレコード)が完了していること。
- 各ドメインに対応するSSL証明書と秘密鍵が用意されていること。(Let’s Encryptなどで取得可能。参考: 『【補足2】Dify導入のためのLinux基礎:OpenSSLでSSL/TLS証明書を準備する方法』)
- 基本的なLinuxコマンド(
cd,sudo,vi/nano,systemctl,ln,rm)およびDocker Composeコマンド (docker compose up -d,down) の知識があること。
ステップ1: ホストサーバーへのNginxインストール
まず、リバースプロキシとして機能させるNginxをホストサーバー(Difyコンテナが動いているサーバー)にインストールします。
1.システムユーザーの作成(任意)
Nginxが特権のないユーザーで実行されるよう、ユーザーとグループを作成します。
sudo groupadd nginx
sudo useradd -g nginx nginx
2.パッケージのインストール:
OSのパッケージマネージャー(Ubuntu/Debianの場合はapt)でNginxをインストールします。
# パッケージリストを更新
sudo apt update
# Nginxをインストール
sudo apt install nginx
# (任意) Nginx用のシステムユーザーを確認または作成する場合
# sudo groupadd nginx
# sudo useradd -g nginx nginx
# (通常、aptでインストールすると自動で作成されます)
# インストール後、Nginxサービスの状態を確認
sudo systemctl status nginx
# ● nginx.service - A high performance web server...
# Active: active (running) ... と表示されればOK
ステップ2: 各Difyコンテナの設定変更 (ポートとHTTPS)
次に、各Difyインスタンスが外部から直接アクセスされるのではなく、ホストのNginx経由でのみアクセスされるように設定を変更します。
2.1: ポート設定の変更 (docker-compose.yaml)
各Difyインスタンスの docker ディレクトリにある docker-compose.yaml ファイルを編集します。nginx サービスの ports: 設定を、ホストのローカルループバックアドレス (127.0.0.1) にのみバインドするように変更します。これにより、外部ネットワークからの直接接続を防ぎます。
インスタンス1 (difyai の例): ports: を '127.0.0.1:8080:80' に変更します(ホストの8080番ポートをコンテナの80番に)。
# /home/user/difyai/docker/docker-compose.yaml を編集
services:
nginx:
image: nginx:latest
container_name: difyai-nginx # コンテナ名を区別しやすくする (任意)
# ... (既存の設定) ...
ports:
- - "${EXPOSE_NGINX_PORT:-80}:80" # 元の設定をコメントアウトまたは削除
- - "${EXPOSE_NGINX_SSL_PORT:-443}:443" # SSLはホストNginxで行うため不要
+ - "127.0.0.1:8080:80" # ローカルホストの8080番にバインド
# ... (以下略) ...
インスタンス2 (aidify の例): ports: を '127.0.0.1:8081:80' に変更します(ホストの8081番ポートを使用)。ポート番号はインスタンスごとに重複しないように設定してください。
# /home/user/aidify/docker/docker-compose.yaml を編集
services:
nginx:
image: nginx:latest
container_name: aidify-nginx # コンテナ名を区別しやすくする (任意)
# ... (既存の設定) ...
ports:
- - "${EXPOSE_NGINX_PORT:-80}:80"
- - "${EXPOSE_NGINX_SSL_PORT:-443}:443"
+ - "127.0.0.1:8081:80" # ローカルホストの8081番にバインド
# ... (以下略) ...
2.2: Dify内部NginxのHTTPS無効化 (.env)
各Difyインスタンスの docker ディレクトリにある .env ファイルを編集し、Difyコンテナ内のNginxがHTTPSを処理しないように設定します。これは、SSL/TLSの処理はホスト側のNginxが一括して行うためです。
# /home/user/difyai/docker/.env と /home/user/aidify/docker/.env の両方を編集
# ... (既存の設定) ...
# Whether Nginx enables HTTPS support. Requires configuring NGINX_SSL_CERT_FILENAME and NGINX_SSL_CERT_KEY_FILENAME.
# Default is false.
- NGINX_HTTPS_ENABLED=true # もし true になっていたら false に変更
+ NGINX_HTTPS_ENABLED=false
# ... (以下略) ...
.envファイル内のEXPOSE_NGINX_PORTやEXPOSE_NGINX_SSL_PORTの設定は、docker-compose.yamlで直接127.0.0.1:...と指定したため、無視されます。
ステップ3: ホストNginxのリバースプロキシ設定
ホストサーバーにインストールしたNginxの設定ファイルを作成し、ドメイン名に基づいてリクエストを適切なDifyコンテナ(のローカルポート)に転送(プロキシ)するように設定します。
3.1: Nginx設定ファイルの作成
/etc/nginx/sites-available/ ディレクトリに、設定ファイル(例: dify-proxy.conf)を新規作成します。
sudo vi /etc/nginx/sites-available/dify-proxy.conf
# または sudo nano /etc/nginx/sites-available/dify-proxy.conf
以下の内容を記述します。ドメイン名、SSL証明書/秘密鍵のパス、proxy_pass で指定するポート番号は、ご自身の環境に合わせて必ず変更してください。
# HTTP (80番) へのアクセスは HTTPS (443番) へリダイレクト
server {
listen 80;
listen [::]:80; # IPv6対応
server_name difyai.yourdomain.com aidify.yourdomain.com; # ★ご自身のドメイン名に変更
# Let's Encrypt 認証用の設定 (Certbotを使う場合)
location ~ /.well-known/acme-challenge/ {
root /var/www/html; # Certbotが使うディレクトリに合わせてください
allow all;
}
# 上記以外は HTTPS へリダイレクト
location / {
return 301 https://$host$request_uri;
}
}
# --- Dify インスタンス 1 (difyai) ---
server {
listen 443 ssl http2;
listen [::]:443 ssl http2; # IPv6対応
server_name difyai.yourdomain.com; # ★ご自身のドメイン名に変更
# --- SSL設定 ---
ssl_certificate /etc/letsencrypt/live/[difyai.yourdomain.com/fullchain.pem](https://difyai.yourdomain.com/fullchain.pem); # ★証明書パスに変更
ssl_certificate_key /etc/letsencrypt/live/[difyai.yourdomain.com/privkey.pem](https://difyai.yourdomain.com/privkey.pem); # ★秘密鍵パスに変更
# (推奨: より強力なSSL設定を追加 - 以下は例)
# include /etc/letsencrypt/options-ssl-nginx.conf;
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# --- リバースプロキシ設定 ---
location / {
# Difyコンテナ1 (difyai) がリッスンしているローカルポートを指定
proxy_pass
![]()
http://127.0.0.1:8080(http://127.0.0.1:8080);
# 必須ヘッダー設定
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;
# WebSocket対応 (Difyが必要とする場合)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# タイムアウト設定 (必要に応じて調整)
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout 60s;
}
}
# --- Dify インスタンス 2 (aidify) ---
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name aidify.yourdomain.com; # ★ご自身のドメイン名に変更
# --- SSL設定 ---
ssl_certificate /etc/letsencrypt/live/[aidify.yourdomain.com/fullchain.pem](https://aidify.yourdomain.com/fullchain.pem); # ★証明書パスに変更
ssl_certificate_key /etc/letsencrypt/live/[aidify.yourdomain.com/privkey.pem](https://aidify.yourdomain.com/privkey.pem); # ★秘密鍵パスに変更
# (推奨: 上記と同様の強力なSSL設定を追加)
# --- リバースプロキシ設定 ---
location / {
# Difyコンテナ2 (aidify) がリッスンしているローカルポートを指定
proxy_pass
![]()
http://127.0.0.1:8081(http://127.0.0.1:8081);
# 必須ヘッダー設定 (上記と同様)
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;
# WebSocket対応 (上記と同様)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# タイムアウト設定 (上記と同様)
}
}
3.2: Nginx設定の有効化
作成した設定ファイルを Nginx が読み込むように、シンボリックリンクを作成します。デフォルトの設定ファイル (default) は無効化しておくと良いでしょう。
# デフォルト設定を無効化 (存在する場合)
sudo rm /etc/nginx/sites-enabled/default
# 作成した設定ファイルを有効化
sudo ln -s /etc/nginx/sites-available/dify-proxy.conf /etc/nginx/sites-enabled/
# Nginx設定ファイルの構文チェック
sudo nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# と表示されればOK
構文エラーが出た場合は、dify-proxy.conf の記述内容(特に {} や ; の閉じ忘れ)を確認してください。
ステップ4: サービスの再起動と動作確認
設定が完了したら、関連するサービスを再起動して変更を反映させます。
4.1: 各Difyインスタンスの再起動
各Difyインスタンスの docker ディレクトリに移動し、docker compose down と docker compose up -d を実行して、ポート設定などを反映させた状態でコンテナを再起動します。
# インスタンス1 (difyai) のディレクトリへ移動
cd /home/user/difyai/docker
sudo docker compose down
sudo docker compose up -d
# インスタンス2 (aidify) のディレクトリへ移動
cd /home/user/aidify/docker
sudo docker compose down
sudo docker compose up -d
4.2: ホストNginxの再起動
ホストのNginxサービスを再起動して、新しいリバースプロキシ設定を読み込ませます。
sudo systemctl restart nginx
4.3: ポート接続確認 (任意)
ホストサーバーで、Nginxが80番と443番をリッスンし、Difyコンテナが指定したローカルポート(8080, 8081)をリッスンしているか確認できます。
# Nginx が 80, 443 をリッスンしているか確認
sudo lsof -i :80
sudo lsof -i :443
# Docker (Nginxコンテナ) がローカルポートをリッスンしているか確認
sudo lsof -i :8080
sudo lsof -i :8081
# または
ss -tulnp | grep -E '8080|8081'


コメント