dockerを使用してphp webappを構成しようとしています。アイデアはphp-fpm
、スタンドアロンコンテナーでアプリを実行し、nginxを実行する別のコンテナーを用意することです。このセットアップのアイデアは、同じnginxコンテナを使用して、同じマシンですでに動作している他のウェブアプリにリクエストをプロキシすることです。問題は、nginx
静的ファイル(js、cssなど)を適切に処理できないことfpm
です。
ファイルシステムは次のようになります。
/
├── Makefile
├── config
│ └── webapp.config
└── webapp
└── web
├── index.php
└── static.js
私はMakefile
このように見えるものを使用してすべてを実行しています(これには興味がありませんdocker-compose
):
PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'
run: | run-network run-webapp run-nginx
run-network:
docker network create internal-net
run-webapp:
docker run --rm \
--name=webapp \
--net=internal-net \
--volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
-p 9000:9000 \
php:5.6.22-fpm-alpine
run-nginx:
docker run --rm \
--name=nginx \
--net=internal-net \
--volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
-p 80:80 \
nginx:1.11.0-alpine
これは私のconfig/webapp.conf
ようです。
server {
listen 80;
server_name webapp.domain.com;
# This is where the index.php file is located in the webapp container
# This folder will contain an index.php file and some static files that should be accessed directly
root /var/www/webapp/web;
location / {
try_files $uri $uri/ @webapp;
}
location @webapp {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ ^/index\.php(/|$) {
include fastcgi_params;
fastcgi_pass webapp:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
そのindex.php
ファイルを使用して処理する必要があるアクションはすべて機能します。ただし、静的ファイルは提供されないため、厄介な404
エラーが発生します(php webappには実際にルートが構成されていないため)。nginxはそれらを実際のwebapp
コンテナー内にあるときに、独自のコンテナーファイルシステムからそれらをロードしようとし、に失敗すると考えています@webapp
。
nginx
別のコンテナーにあるファイルを提供するように構成できる方法はありますか?
nginx
phpアプリケーション内ではリクエストファイルを作成しfpm
ていません。そのためにプロキシを作成しており、nginx
php以外の静的ファイルにアクセスする必要があります。
webapp
コンテナーではなく、コンテナー内のボリュームとしてマウントされnginx
ます。