我正在尝试构建一个Docker镜像来运行我的Symfony3应用程序。
我有docker-composer.yml
和site.conf
在我的docker-composer中,我定义了两个容器web
和php
并链接这些容器:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./code/test:/var/www/test
- ./site.conf:/etc/nginx/conf.d/default.conf
links:
- php
php:
image: php:7-fpm
volumes:
- ./code/test:/var/www/test
我找到了关于如何设置我的site.conf的正式nginx docs:
我的site.conf:
server {
server_name test-docker.local;
root /code/test/web;
location / {
try_files $uri /app.php$is_args$args;
}
# DEV
location ~ ^/(app_dev|config)\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
# PROD
location ~ ^/app\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
# return 404 for all other php files not matching the front controller
# this prevents access to other php files you don't want to be accessible.
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
在我的docker.compose.yml和site.conf的同一个目录中,我有一个代码目录,代码dir里面有测试目录,内部测试就是我的php应用程序。
我遇到的问题是当我去根网址test-docker.local/
我得到File Not Found
我进入了php容器,看看代码是否被复制到正确的路径中,它是/ var / www / test /
当我输入我的web容器时,代码id在同一路径/ var / www / test下,但是nginx容器的正确路径是nginx从...加载代码?即使这样,为什么nginx容器必须有一个代码的副本,如果在理论上代码应该从php容器加载?
答案 0 :(得分:1)
您的Nginx配置指向root /code/test/web;
根,但在我看来,该路径仅在您的docker主机上可用,而不是在docker容器中。您的docker-compose.yml文件在./code/test
的容器中挂载/var/www/test
,因此请尝试在您的nginx配置中使用root /var/www/test/web;
。
答案 1 :(得分:0)
您不需要在两个容器中重复:
volumes:
- ./code/test:/var/www/test
所以在nginx容器中你可以省略这个卷
替换你的site.conf:
location / {
try_files $uri /app.php$is_args$args;
}
带
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app_dev.php/$1 last; # dev mode
# rewrite ^(.*)$ /app.php/$1 last; # prod mode
}