【问题标题】:Nginx in docker-container does not serve static content from Symfony3-appdocker-container 中的 Nginx 不提供来自 Symfony3-app 的静态内容
【发布时间】:2017-10-15 23:14:41
【问题描述】:

在一个“小”问题上浪费了几乎整个星期天之后,我想寻求一些帮助。也许是我发现了一个小错误。

我想开发一个基于 Symfony 3 的应用程序。为了拥有一个苗条的开发环境,我将 docker 与这三个容器一起使用:

  • mysql(工作正常)
  • php-fpm(在我的 docker-compose.yml 中定义为“app”)
  • nginx

这是 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:

我的 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;
}

我的 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"]

文档根目录的“ls”:

app.php         
apple-touch-icon.png    
config.php      
image.png       
robots.txt
app_dev.php     
bundles         
favicon.ico     
navigation.css

此配置存在以下问题:

当我在浏览器中打开“http://localhost:8080/”时:(几乎)一切都很好:PHP 正在运行并显示页面(没有可见错误)。 但什么不起作用:通过 nginx 提供静态文件,如“navigation.css”。 Chrome 的 webdeveloper-toolbar,在 Network-Tab 中,我总是收到“navigation.css”的“404 Not Found”消息。

当我直接在浏览器中调用 http://localhost:8080/navigation.css 时,我从 Symfony 收到错误消息:“No route found for "GET /navigation.css"”。

当我正确解释时,这意味着 nginx 无法找到“navigation.css”并将此参数提供给 Symfony(给 app_dev.php),并且框架正在寻找名为“navigation.css”的路由",它不存在。

所以我的主要问题是:为什么 nginx 看不到静态文件?我的意思是,静态文件和 php 文件(提供)在同一个目录中。我真的不明白这个......希望有人能够看到我的错误。

【问题讨论】:

    标签: symfony docker nginx


    【解决方案1】:

    这是正确的行为。

    您的 Nginx 容器将无法在本地找到文件。您可以仅将静态文件挂载到 Nginx 容器中,也可以挂载 Symfony 和 Nginx 容器之间的共享目录。

    要对此进行测试,请尝试添加文件 /var/www/html/web 看看会发生什么。

    【讨论】:

    • 不客气 :) 我很高兴它成功了,您能否接受答案并点击向上箭头? @User5518
    • 非常感谢!使用“docker-compose.yml”中 nginx 的这个新的附加卷配置,它正在工作:- ./web/static:/var/www/html/web/static
    • (我也将我的静态文件移动到“web/static”)
    • 不要忘记先删除您的卷 docker-compose down -v。否则您仍然无法访问您的文件。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2017-09-25
    • 2019-01-29
    • 2012-04-18
    • 1970-01-01
    • 2016-01-22
    • 2014-07-30
    相关资源
    最近更新 更多