Skip to content

🔄 内部サービスのポート変更手順 (WordPress / Website)

概要

Docker Infrastructure環境において、WordPress (PHP-FPM) や Bonus Website (Node.js) の内部待受ポートを変更する手順です。 これらは外部(ホストOS)に直接公開されておらず、Dockerネットワーク内でのみ通信されますが、NGINXとの連携設定を変更する必要があります。

INFO

FTPと異なり、これらのポートは「コンテナ間通信」用です。ホスト側のファイアウォール設定(UFW)やポートフォワーディング設定を変更する必要はありません。

1. WordPress (PHP-FPM) のポート変更

デフォルトの 9000 番ポートを変更する場合の手順です(例: 9001 に変更)。

手順

  1. PHP-FPM設定の修正 (srcs/requirements/wordpress/conf/www.conf)

    ini
    ; 変更前
    listen = 0.0.0.0:9000
    
    ; 変更後
    listen = 0.0.0.0:9001
  2. Dockerfileの修正 (srcs/requirements/wordpress/Dockerfile)

    dockerfile
    # 変更前
    EXPOSE 9000
    
    # 変更後
    EXPOSE 9001
  3. NGINX設定の修正 (srcs/requirements/nginx/conf/nginx.conf) WordPressへの転送先ポートを合わせます。

    nginx
    location ~ \.php$ {
        # ...
        # 変更前
        fastcgi_pass wordpress:9000;
        
        # 変更後
        fastcgi_pass wordpress:9001;
    }

2. Bonus Website (Node.js) のポート変更

デフォルトの 4443 番ポートを変更する場合の手順です(例: 5000 に変更)。

手順

  1. アプリケーション設定の修正 (srcs/requirements/bonus/website/server.js)

    javascript
    // 変更前
    const PORT = 4443;
    
    // 変更後
    const PORT = 5000;
  2. Dockerfileの修正 (srcs/requirements/bonus/website/Dockerfile)

    dockerfile
    # 変更前
    EXPOSE 4443
    
    # 変更後
    EXPOSE 5000
  3. NGINX設定の修正 (srcs/requirements/nginx/conf/nginx.conf) Websiteへのプロキシ転送先ポートを合わせます。

    nginx
    location ^~ /website/ {
        # 変更前
        proxy_pass http://website:4443/website/;
        
        # 変更後 (末尾のスラッシュなどに注意)
        proxy_pass http://website:5000/website/;
        # ...
    }

3. 設定の反映

変更後は、関連するコンテナを再ビルドして起動し直す必要があります。

bash
# 全て再構築する場合
make down
make all

# 個別に再構築する場合(例: WordPressとNginxのみ)
docker compose -f srcs/docker-compose.yml up -d --build wordpress nginx

✅ 動作確認

ブラウザから通常通りアクセスできるか確認します。 内部ポートが変わっていても、NGINXが適切にプロキシしていれば、ユーザー(ブラウザ)から見たURL (https://local.dev/...) は変わりません。

3. MariaDB (Database) のポート変更

デフォルトの 3306 番ポートを変更する場合の手順です(例: 3307 に変更)。

手順

  1. MariaDB設定の修正 (srcs/requirements/mariadb/conf/50-server.cnf)

    ini
    [mysqld]
    ; 変更前
    port = 3306
    
    ; 変更後
    port = 3307
  2. Dockerfileの修正 (srcs/requirements/mariadb/Dockerfile)

    dockerfile
    # 変更前
    EXPOSE 3306
    
    # 変更後
    EXPOSE 3307
  3. 環境変数の修正 (srcs/.env) WordPressがデータベースへ接続する際のホスト指定を変更します。

    ini
    # 変更前
    MYSQL_HOSTNAME=mariadb
    
    # 変更後
    MYSQL_HOSTNAME=mariadb:3307

    ※ NGINXと異なり、WordPressは環境変数(MYSQL_HOSTNAME)を使って接続先を決定します。

技術的補足: setup.sh の自動対応について

MariaDBのポートを変更すると、通常は以下の問題が発生しますが、本プロジェクトの setup.sh はこれらを自動的に処理するように実装されています。

  1. 接続待機チェック (mysqladmin ping) の問題: mysqladmin コマンドは host:port 形式を認識しません。 setup.sh 内でホスト名とポート番号を分離してコマンドに渡す処理が入っています。

  2. 既存ボリュームの設定残留 (wp-config.php) の問題: WordPressのデータがボリュームに残っている場合、古いポート設定(3306)が wp-config.php に書き込まれたままになり、再起動ループ(データベース接続エラー)が発生します。 setup.sh は起動時に現在の環境変数の値で wp-config.phpDB_HOST を強制的に上書き更新し、この問題を回避しています。

    bash
    # setup.sh 内の該当処理
    if [ -f wp-config.php ]; then
        wp config set DB_HOST $MYSQL_HOSTNAME --allow-root
    fi

4. 設定の反映

変更後は、関連するコンテナを再ビルドして起動し直す必要があります。

bash
# 全て再構築する場合
make down
make all

# 個別に再構築する場合
docker compose -f srcs/docker-compose.yml up -d --build mariadb wordpress

✅ 動作確認

ブラウザからの確認に加え、コンテナ間通信で内部ポートが正しく変更されているか確認します。 NGINXコンテナ(WordPress/Websiteのクライアント役)やWordPressコンテナ(MariaDBのクライアント役)からコマンドを実行します。

1. WordPress (9001) の確認

NGINXコンテナから、新しいポートのWordPressへ接続できるか確認します。 ※ WordPressはFastCGIのため、curl では完全なレスポンスは得られませんが、接続確認は可能です。

bash
# NGINXコンテナからWordPressへ接続
docker compose -f srcs/docker-compose.yml exec nginx nc -zv wordpress 9001

成功例: Connection to wordpress 9001 port [tcp/*] succeeded!

2. Website (5000) の確認

NGINXコンテナから、新しいポートのWebsiteへ接続できるか確認します。

bash
# NGINXコンテナからWebsiteへHTTPリクエスト
docker compose -f srcs/docker-compose.yml exec nginx curl -v http://website:5000/website/health

成功例: HTTP/1.1 200 OK が返ってくれば成功です。

3. MariaDB (3307) の確認

WordPressコンテナから、新しいポートのMariaDBへ接続できるか確認します。

bash
# WordPressコンテナからMariaDBへPing
docker compose -f srcs/docker-compose.yml exec wordpress mysqladmin -h mariadb -P 3307 -u$MYSQL_USER -p$MYSQL_PASSWORD ping

成功例: mysqld is alive

TIP

これらの確認により、「ホストOSからは見えないが、Dockerネットワーク内部では正しくポートが変更され、通信できていること」を証明できます。

接続できない(502 Bad Gateway や DB connection error)場合は、設定したポート番号が全てのファイルで一致しているか再確認してください。

❓ FAQ (よくある質問)

Q. /etc/hosts でポート変更に対応できますか?

A. いいえ、できません。

/etc/hosts は「ドメイン名(ホスト名)を IPアドレス に変換する」ための仕組みであり、ポート番号を指定する機能はありません。 例えば、/etc/hosts127.0.0.1:9001 wordpress のように書くことはできません(無効な構文です)。

したがって、ポートを変更する場合は、必ず以下の設定変更が必要です:

  1. サービスの待受ポート変更 (listen)
  2. NGINXの転送先ポート変更 (fastcgi_pass / proxy_pass)

Q. OAuth APIのリダイレクトURIを複数登録しても大丈夫ですか?

A. はい、大丈夫です(推奨されます)。

42APIの認証システムは、リクエストに含まれる redirect_uri が「登録済みのURIリストのいずれかと完全一致するか」をチェックします(ホワイトリスト方式)。

したがって、以下のように複数の環境用URIを登録しておくことで、設定を変更せずに環境を使い分けることができます:

  • 本番環境用: https://local.dev/website/auth/42/callback
  • ポート変更検証用: https://local.dev:8443/website/auth/42/callback
  • 開発環境用: http://localhost:3000/website/auth/42/callback

既存の設定を削除する必要はありません。

Released under the MIT License.