更改 nginx - Docker 容器 nginx.conf 中的 client_max_body_size 调用包括 HTTP、服务器和位置部分; Drupal 导入

问题描述

我在 Docker 中使用 Drupal-fpm、mariadb 和 Nginx 映像运行 Drupal。它适用于干净的标准安装,如我在 https://github.com/RightsandWrongsgit/12-factor-demo 的存储库的快速入门部分所述。我现在试图通过在 Drupal 的管理菜单下同步配置来“导入”一个大约 4M 大小的现有站点 Tar.gz 文件。我在 PHP.ini 文件中进行了修改以处理大于认 2M 的大小; (如果您想查看该点的详细信息,请在我的 repo README.md 中的注释中详细说明。)然而,我被挂断的是处理关于 client_max_body_size 的 Ngnix 限制。在尝试导入期间,经过短暂的运行时间后,Ngnix 会抛出文件大小过大的错误并停止。 Ngnix 上传文件过大的情况是此处解决的现有问题nginx - client_max_body_size has no effect

我遇到障碍的地方是在 Docker 容器环境中的所有三个位置增加 client_max_body_size 的语法。我在 Docker-compose.yml 文件中的拉取是为了 'Nginx:latest' 来自本地或来自 dockerhub 如果图像尚未加载。此映像会关闭其 'Nginx.conf' 文件,我可以在干净的标准快速启动安装中在正在运行的容器中查看它。 'Nginx.conf' 的关键是它包含一个 http 部分,它的最后一条语句是 'include /etc/Nginx/conf.d/*.conf'(换句话说,它从容器内的那个目录)。

而且,是的,容器中的该目录中还有另一个 *.conf,因为我可以看到它并将其列出以供审查。那个额外的 *.conf 文件实际上是“default.conf”,它是在我建立这个“卷:- ./config/Nginx/site.conf:/etc/Nginx/conf.d/default.conf”期间放置在那里的: ro' 通过我的 docker-compose.yml 服务建立 Nginx。我还可以确认运行“default.conf”文件的容器的内容与本地主机 site.conf 文件完全匹配。所以 'docker-compose.yml up' 将它放入容器中,我认为没有理由不使用 'Nginx.conf' 包含语句。所有这些似乎都按照此处描述的方式工作How to overwrite nginx default config with docker file?

这是我的问题,“site.conf”似乎接受服务器 {} 上下文中的 client_max_body_size 语句,但我似乎无法弄清楚两件事 - 首先,哪个位置{}上下文将它添加到或我应该使用的其他位置部分语法以及如何将 client_max_body_size 添加到 http{} 上下文。我所做的每一次尝试似乎都导致抛出错误并且 Nginx 服务器映像未加载到容器中。

以下代码在标准快速入门期间运行良好,但并没有真正扩展允许的文件大小上传并导致 Nginx 文件大小出现大错误

server
{
    listen   80;
    root /var/www/web;
    index index.PHP;
    client_max_body_size 100M;

    location / {
        error_page 404 = @drupal;
    }

    location @drupal {
        rewrite ^(.*)$ /index.PHP?q=$1 last;
    }
    location ~ \.PHP$ {
        fastcgi_pass   PHP:9000;
        fastcgi_index  index.PHP;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

我如何将这个 client_max_body_size 语句添加到 http 和 location 上下文中?根据此处注明的需要 - nginx - client_max_body_size has no effect

如果您能建议对上述代码进行特定编辑,我将不胜感激,因为我是一个相对新手,可以使用非常明确的帮助来实际完成这项工作!谢谢

解决方法

找到基本答案并认为它可能对其他人有帮助,所以我发布了它。 NGINX Docker 映像包括用于基本配置的“nginx.conf”文件的拉取。 'nginx.conf' 文件中有一个 http 上下文,并且在该部分的末尾但在该部分中包含一个 'include' 语句,该语句引用下面 'nginx.conf' 文件所在的子目录(包括 /etc/nginx/ conf.d/*.conf;)。通配符选取您放置在那里的“.conf”扩展名的任何其他配置文件。我的容器包含名为“site.conf”的附加配置文件,该文件在构建期间移至该子目录。

这是通过与 NGINX 映像拉取相关联的“nginx.conf”末尾的 include 语句拉取的“site.conf”文件。关键是 http 上下文已经建立,因此第一个 'client_max_body_size' 语句已经具有 http 上下文,不需要在 include 调用的 'site.conf' 中重新声明。

`client_max_body_size 0; # within http context via the 'include'

server
{
    listen   80;
    root /var/www/web;
    index index.php;
    client_max_body_size 0; # within server context

    location / {
        error_page 404 = @drupal;
    }

    location @drupal {
        rewrite ^(.*)$ /index.php?q=$1 last;
    }
    location ~ \.php$ {
        client_max_body_size 0; # within location context  
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PHP_VALUE   "memory_limit = 500M; post_max_size = 400M; upload_max_filesize = 300M;";
        include        fastcgi_params;
    }
}`

所有这一切真正开始是因为尝试将 Drupal 站点从 LAMP 堆栈迁移到 NGINX 容器。修复文件大小允许移动更大的站点。如果这不能完全解决迁移问题,请额外提醒一下,还将容器构建更改为与原始站点一致的 php 版本。我发现在迁移到 php 7.4.x 时不推荐使用的一些代码行也导致迁移“挂起”,并且还需要使容器 php7.3.4 像灯堆栈使用的那样。