Tôi đang cố gắng cấu hình một ứng dụng web php bằng docker. Ý tưởng là để chạy ứng dụng bằng cách sử dụng php-fpm
trong một container độc lập và có một container khác sẽ chạy nginx. Ý tưởng cho thiết lập này là sử dụng cùng một thùng chứa nginx cho các yêu cầu proxy đến các ứng dụng web khác đang hoạt động trên cùng một máy. Vấn đề là tôi không thể nginx
xử lý đúng các tệp tĩnh (js, css, v.v.), như các yêu cầu cho những người tiếp tục fpm
.
Đây là những gì hệ thống tập tin trông giống như:
/
├── Makefile
├── config
│ └── webapp.config
└── webapp
└── web
├── index.php
└── static.js
Tôi đang chạy toàn bộ bằng cách sử dụng một Makefile
cái trông như thế này (không quan tâm đến docker-compose
cái này):
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
Đây là những gì tôi config/webapp.conf
trông giống như.
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;
}
}
Bất cứ hành động nào cần được xử lý bằng index.php
tệp đó sẽ hoạt động. Tuy nhiên, các tệp tĩnh sẽ không được cung cấp, dẫn đến các 404
lỗi khó chịu (vì ứng dụng web php không thực sự có các tuyến được định cấu hình cho các tệp đó). Tôi tin rằng nginx cố tải những thứ đó từ hệ thống tập tin chứa của chính nó, khi chúng thực sự nằm trong webapp
container, không quay trở lại @webapp
.
Có cách nào tôi có thể định cấu hình nginx
để phục vụ các tệp nằm trong vùng chứa khác không?
nginx
các tệp yêu cầu trong ứng dụng php, tôi ủy quyền fpm
để làm như vậy và tôi cần nginx
phải truy cập các tệp không phải là php tĩnh.
webapp
container chứ không phải trong nginx
một khối.