msano / PHP/Nginx/MySQL - Dockerインスタンス連携におけるNginx設定

Created Sat, 06 Jun 2026 19:11:38 +0000 Modified Thu, 25 Jun 2026 19:37:16 +0000
1337 Words

はじめに

devcontainerPHPのフルスタックアプリケーション開発環境を作成しました。 その過程でnginxの設定に詰まったので振り返りを兼ねて共有します。

結論

nginx, PHPとディレクトリを分けた状態でDockerインスタンスを連携させるにはDocumentRootの設定を追加し、nginx.confrootのパスを修正する必要がありました。

達成したかったこと

nginxを使いhttp://localhost/ にアクセスしたら index.phpのページが表示されるようにしたいと思いました。

ソースコードのディレクトリは以下の通りです。

my-php-app/
│
├── .devcontainer/                  
│   ├── devcontainer.json   # 開発環境の設定      
│   └── docker-compose.yml  # php, nginx, dbと各コンテナを設定         
│
├── nginx/                  
│   ├── default.conf        # phpアプリのルーティングを設定  
│   └── Dockerfile 
│
├── php_code/                  
│   ├── index.php           # / にアクセスした際に表示されるページ
│   └── Dockerfile
│
└── README.md                # プロジェクトの説明

修正前のdocker-compose.yml, nginx.confの設定は以下のとおりです。

docker-compose.yml

version: "3.9"
services:
	nginx:
	build: ../nginx/
	ports:
		- 80:80
	volumes:
		- ../:/var/www/html/

php:
	build: ../php_code/
	volumes:
		- ../:/var/www/html/

db:
	image: mariadb
	volumes:
		- mysql-data:/var/lib/mysql
	environment:
		MYSQL_ROOT_PASSWORD: mariadb
		MYSQL_DATABASE: ecomdb

volumes:
	mysql-data:

nginx.conf

server {
	listen 80 default_server;
	root /var/www/html;
	index index.html index.php;
	
	charset utf-8;
	
	location / {
	proxy_pass http://php;
	}
	
	location = /favicon.ico { access_log off; log_not_found off; }
	location = /robots.txt { access_log off; log_not_found off; }
	
	access_log off;
	error_log /var/log/nginx/error.log error;
	
	sendfile off;
	
	client_max_body_size 100m;
	
	location ~ /.ht {
	deny all;
	}
}

この設定でDockerコンテナを立ち上げ、 http://localhost/ にアクセスするとindex.phpにアクセスすることができませんでした。ですが、index.phpファイルをルート配下に移動するとアプリを表示することができました。しかし、ディレクトリを分けることで可読性を向上させたたく、index.php/php_code配下に置きたいと思いました。

index.php/php_code配下に置いた際のメッセージは次のとおりです。

[Thu Jun 04 19:13:46.527416 2026] [autoindex:error] [pid 16:tid 16] [client 172.18.0.2:45812] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.php,index.html) found, and server-generated directory index forbidden by Options directive

解決

これについて設定修正箇所は2箇所ありました。

  1. DocumentRootを変更
  2. nginx.confrootのパスが/php_codeを指すように変更

1. DocumentRoot を変更した件

nginxのDockerインスタンスからphpのDockerインスタンスにアクセスするため、nginx/default.confで次のように設定しています。

proxy_pass http://php;

ですが、PHPはデフォルトでドキュメントのルートとして/var/www/htmlを指すため、コンテナのvar/www/html/php_code/配下にあるindex.phpにアクセスすることができませんでした。 このDocumentRootを変更するため、PHPコンテナのDockerfileに次の設定を追加します。

# DocumentRoot を php_code に変更

ENV APACHE_DOCUMENT_ROOT=/var/www/html/php_code

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \

&& sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

2. nginx.confのrootのパスを変更した件

1 は http://localhost/ にアクセスした際の振る舞いなので、他のページに遷移しようとしても失敗します。 これを解消するためにnginxdefault.confにてドキュメントルートを変更する必要があります。 具体的には次のように変更します。

root /var/www/html/php_code;

これでURLからPHPアプリのページを表示し、別のページに遷移ができるようになりました!🥳

参考

Nginx: Everything about proxy_pass

Nginx connect() failed (111 connection refused) while connecting to upstream

Access container name in Nginx configuration file

How to Use docker init for PHP Projects

Docker で Apache + PHP コンテナを作る方法

Deploying a PHP Web App with Docker Compose, Nginx, and MariaDB