複数DifyインスタンスのためのNginxリバースプロキシ設定ガイド (Ubuntu + Nginx)

Dify環境構築

Difyコミュニティ版は非常に強力ですが、デフォルトの設定では1台のサーバーで1つのDifyインスタンスしか公開できません(ポート80/443を占有するため)。

しかし、Nginxリバースプロキシとしてホストサーバーに設定することで、dify-a.yourdomain.comdify-b.yourdomain.com のように、異なるドメイン名(サブドメイン)でアクセスされた場合に、それぞれ対応するDifyコンテナへリクエストを振り分けることが可能になります。

この記事では、1台のUbuntuサーバー上で複数のDifyインスタンス(例: difyaiaidify)を運用するための、ホストNginxの設定手順を詳しく解説します。SSL(HTTPS)の設定もこのNginxで行います。

前提条件:

 

ステップ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_PORTEXPOSE_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 downdocker 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'

コメント

error: Content is protected !!