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

Posted

技术标签:

【中文标题】更改 nginx - Docker 容器 nginx.conf 中的 client_max_body_size 调用包括 HTTP、服务器和位置部分; Drupal 导入【英文标题】:Changing nginx - client_max_body_size in Docker container nginx.conf calling include for HTTP, server, & location sections; Drupal Import 【发布时间】:2021-05-09 06:27:49 【问题描述】:

我正在使用 Drupal-fpm、mariadb 和 nginx 映像在 Docker 中运行 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',它是在我建立这个 'volumes: - ./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 新手,您可以使用 nginxconfig.io 作为起点。在发布问题之前进行谷歌搜索也有帮助。 显然我在发帖前做了几十次谷歌搜索;甚至包括其他关闭但不直接的 *** 问题链接作为帖子中的参考。帖子本身的内容被构建为提供大量链接术语元素,这些元素非常旨在让其他人不仅从响应中受益,而且从构建解决问题的相关部分的细节中受益。 【参考方案1】:

找到了基本答案,并认为它可能对其他人有所帮助,因此我将其发布。 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 像灯堆栈正在使用一样。

【讨论】:

以上是关于更改 nginx - Docker 容器 nginx.conf 中的 client_max_body_size 调用包括 HTTP、服务器和位置部分; Drupal 导入的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器之内网独立IP访问

Docker:proxy_pass 到另一个容器 - nginx:在上游找不到主机

如何修改docker的nginx容器的配置

docker nginx没有加载css样式

docker-compose 编排lnmp容器

Docker - Nginx + Php-fpm 开发环境