【问题标题】:docker-compose nginx not found route for symfony assetsdocker-compose nginx 找不到 symfony 资产的路由
【发布时间】:2018-06-08 09:44:01
【问题描述】:

SO 中有类似的问题,但不是针对这个特定问题。

工具:docker-compose 1.21.2; symfony 3.4; nginx 1.10.3

我有几个分离的容器(“每个容器应该只有一个关注点”)。除了在浏览器中获取 symfony (3.4) 应用程序的资产外,一切正常。 定义的路线有效,模板正确呈现,只有资产是问题。除了使用相同的设置但在本地(没有容器)的开发机器中提供服务之外,没有任何问题。

它可以工作,但我希望将它们用于生产,因此文档指出 https://docs.docker.com/compose/production/#modify-your-compose-file-for-production 您可能需要进行更改:

  • 删除应用程序代码的所有卷绑定,以便代码保留在容器内并且不能从外部更改

事实:

  • 在 nginx 容器日志中报告 404 次访问但没有错误。
  • 在 php-symfony 容器内,prod 日志显示类似 request.ERROR: Uncaught .... NotFoundException for "GET /css/main.css" at ...RouterListener.php {"exception": ".../NotFoundHttpException(code: 0) ... ResourceNotFoundException"} [] 的行
  • 在浏览器中检查开发http://<host>:<port>/app_dev.php/css/main.cssnginx 返回 404。(我使开发环境在外部可用)
  • 在浏览器中检查 dev 的路由,例如 http://<host>:<port>/app_dev.php/css 出现 Symfony 异常页面 No route found for "GET /css" 具有相同的信息 ResourceNotFoundException > NotFoundHttpException
  • 修改对容器chmod -R a+rwx .../webweb 文件夹的访问权限不会产生影响。

相关部分docker-compose.yml

version: "2"
services:
    site:
        ...
        working_dir:
            /var/www/html/site
    site_webserver:
        ...
        ports:
           - <port>:80
        depends_on:
           - site
        links:
           - site

相关部分nginx.conf

server {
    listen 80;
    server_name "";
    root /var/www/html/site/web;

    location / {
        try_files $uri /app.php$is_args$args;
    }  

    location ~ ^.*/(app_dev|config)\.php(/|$) {
        fastcgi_pass lockate_site:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $document_root;
    }
}

【问题讨论】:

    标签: php symfony docker nginx docker-compose


    【解决方案1】:

    您应该有现有文件 /var/www/html/site/web/css/main.css!你有吗?

    Nginx 配置不应将此请求 /css/main.css 传递给 PHP 代码。它应该简单地将现有文件发送到浏览器。 我想你有这个文件,但在另一个路径上。

    您应该为其配置正确的 nginx 配置,或者将资产文件放在 /var/www/html/site/web/ 目录中

    【讨论】:

    • 哎呀!也许您忘记将资产目录挂载到 nginx 容器中?
    • 是的,文件存在“在本地的开发机器中服务(没有容器)没有问题。”;为什么要挂载资产目录? (删除应用程序代码的任何卷绑定,以便代码保留在容器内并且不能从外部更改docs.docker.com/compose/production/…
    【解决方案2】:

    可以说更多,但是:资产在 php-fpm(symfony 的)容器中被阻止。

    在容器的文件 www.conf (在我的情况下为 /usr/local/etc/php-fpm.d/www.conf )检查指令@987654321 @ 并保持这样的状态

    security.limit_extensions = 
    

    注意:我发现它是这样评论的 ;security.limit_extensions = .php .php3 .php4 .php5

    【讨论】:

      【解决方案3】:

      您的主要问题是,nginx 正在搜索 nginx 容器中的资产文件。使用 (app/console assets:install) 安装资产后,它们将复制到您的 php (symfony) 容器中。您必须在容器之间链接资产。有一个答案:https://stackoverflow.com/a/44284993/6279901

      【讨论】:

        猜你喜欢
        • 2018-05-09
        • 1970-01-01
        • 2017-12-29
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        相关资源
        最近更新 更多