Use*_*518 2 nginx symfony docker
在一个“小”问题上浪费了几乎整个星期天之后,我想寻求一些帮助。也许是我监督了一个小错误。
我想开发一个基于 Symfony 3 的应用程序。为了拥有一个纤薄的开发环境,我将 docker 与这三个容器一起使用:
这是 docker/nginx/mysql 配置:
我的 docker-compose.yml:
version: '3.0'
services:
nginx:
image: nginx:latest
depends_on:
- app
ports:
- '8080:80'
volumes:
- ./app/config/docker/nginx.conf:/etc/nginx/conf.d/default.conf
app:
build: .
depends_on:
- mysql
volumes:
- .:/var/www/html
- vendor:/var/www/html/vendor
mysql:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
- ./app/config/docker/mysql_character_set.cnf:/etc/mysql/conf.d/character_set.cnf
restart: always
ports:
- '6603:3306'
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "test"
MYSQL_USER: "test"
MYSQL_PASSWORD: "test"
volumes:
db_data:
vendor:
Run Code Online (Sandbox Code Playgroud)
我的 nginx.conf:
server {
listen 80 default_server;
root /var/www/html/web;
index app_dev.php app.php;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /app_dev.php$is_args$args;
}
# DEV
# This rule should only be placed on your development environment
# In production, don't include this and don't deploy app_dev.php or config.php
location ~ ^/(app_dev|config)\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
# 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.
location ~ \.php$ {
return 404;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
}
Run Code Online (Sandbox Code Playgroud)
我的 Dockerfile:
FROM php:7.1-fpm
MAINTAINER dev@mydomain.com
ENV DEBIAN_FRONTEND=noninteractive
ENV PHP_DEPS="pdo pdo_mysql"
ADD . /var/www/html
# php extensions
RUN docker-php-ext-install $PHP_DEPS
# composer
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/local/bin --filename=composer && \
composer --version
# copy php-conf
COPY app/config/docker/fpm.conf /etc/php-fpm.d/autotrader.conf
CMD ["php-fpm"]
Run Code Online (Sandbox Code Playgroud)
文档根目录的“ls”:
app.php
apple-touch-icon.png
config.php
image.png
robots.txt
app_dev.php
bundles
favicon.ico
navigation.css
Run Code Online (Sandbox Code Playgroud)
这个配置有以下问题:
当我在浏览器中打开“ http://localhost:8080/ ”时:(几乎)一切正常:PHP 正在运行并显示页面(没有错误可见)。但是什么不起作用:通过 nginx 提供像“navigation.css”这样的静态文件。Chrome 的 webdeveloper-toolbar,在 Network-Tab 中,我总是收到“navigation.css”的“404 Not Found”消息。
当我直接在浏览器中调用http://localhost:8080/navigation.css 时,我收到来自 Symfony 的错误消息:“找不到用于“GET /navigation.css”的路由”。
当我正确解释这一点时,这意味着 nginx 无法找到“navigation.css”并将此参数提供给 Symfony(给 app_dev.php),并且框架正在寻找名为“navigation.css”的路由不存在。
所以我的主要问题是:为什么 nginx 看不到静态文件?我的意思是,静态文件和 php 文件(提供)在同一目录中。我真的不明白这个......希望有人能够看到我的错误。
这是正确的行为。
您的 Nginx 容器将无法在本地找到这些文件。您可以只将静态文件挂载到 Nginx 容器中,也可以挂载 Symfony 和 Nginx 容器之间的共享目录。
要对此进行测试,请尝试添加文件 /var/www/html/web 并查看会发生什么。