我正在尝试使用docker配置php webapp。这个想法是php-fpm
在一个独立的容器中运行应用程序,并让另一个容器运行nginx。此设置的想法是使用相同的nginx容器将请求代理到已经在同一台机器上运行的其他Web应用程序。问题是我无法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
一个容器安装。