在AWS Elastic Beanstalk中增加Nginx conf中的client_max_body_size

当我们在AWS Elastic Beanstalk上运行的API发布大于10MB的文件时,我遇到了“413 Request Entity Too Large”错误。

我做了相当多的研究,并相信我需要为Nginx的client_max_body_size ,但我似乎无法find任何有关如何使用Elastic Beanstalk做到这一点的文档。 我的猜测是,它需要使用ebetension文件进行修改。

任何人都有想法,我怎样才能达到极限? 10MB是相当薄弱的,必须有一种方法来手动。

经过大量的研究和数小时的精彩的AWS支持团队的工作后,我在.ebextensions内部创build了一个configuration文件来修改nginxconfiguration。 这种改变允许更大的post主体大小。

.ebextensions目录中,我创build了一个名为01_files.config的文件, 01_files.config包含以下内容:

 files: "/etc/nginx/conf.d/proxy.conf" : mode: "000755" owner: root group: root content: | client_max_body_size 20M; 

这将在/etc/nginx/conf.d目录中生成一个proxy.conf文件。 proxy.conf文件只包含一行client_max_body_size 20M; 这是诀窍。

您可以指定Nginx文档中列出的其他指令。

http://wiki.nginx.org/Configuration

希望这可以帮助别人!

 files: "/etc/nginx/conf.d/proxy.conf" : mode: "000755" owner: root group: root content: | client_max_body_size 20M; 

为了安全起见修改了上面的答案(语法错了,请参阅YAML中的两个'owner:'条目),请大家不要设置任何777权限。 除非你喜欢被黑客入侵,并将Nginxconfiguration文件的所有者设置为root。

编辑:您已经部署了由尼克·帕森斯接受的答案中的说明生成后,您可能需要重新启动nginx服务器来接受更改。

要做到这一点,ssh到实例,并做到这一点

sudo service nginx reload

要了解有关重新加载的更多信息,请参阅http://nginx.org/en/docs/beginners_guide.html

在以前的Elastic Beanstalk版本中,我能够添加一个container_command来完成这个任务,但现在我发现像@cdmckay这样会导致部署失败。 如果你重build你的环境,它会接受client_max_body_size设置,以及只要你的configuration文件中的指令。

接受的答案不适合我,因为我有一个基于JVM的应用程序,它似乎做NGINXconfiguration不同。 我会看到一个proxy.conf文件是使用我的设置创build的,但由于某种原因它会自动删除。 我按照本页底部的说明操作: https : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-platform.html

并创build一个.ebextensions/nginx/conf.d/proxy.conf文件,其中包含以下行: client_max_body_size 40M;

或者,您可以将代理服务器更改为Apache。 为此,请转到configuration和编辑软件configuration。 这里的第一个选项是“代理服务器”,select“apache”。

接下来从接受的答案,您需要可能需要重新加载nginxconfiguration文件。

为了做到这一点,添加以下命令

  container_commands: 01_reload_nginx: command: "service nginx reload" 

这将是更好的实践比ssh'ing你的eb实例和手动做一个命令。

这与接受的答案相结合解决了同样的问题对我来说。 (Rails,Puma,NGINX)

对于没有Docker的Golang,我遵循aws doc中的这些说明:

configuration反向代理

如果您想要包含nginx.conf http块中的指令以外的指令,还可以在源包的.ebextensions/nginx/conf.d/目录中提供其他configuration文件。 此目录中的所有文件必须具有.conf扩展名。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

我在我的项目的根目录的.ebextensions/nginx/conf.d/文件中创build了proxy.conf文件,里面只有一行:

 client_max_body_size 20M; 

如果仍然不起作用,请确保.ebextensions文件夹和子文件夹包含在您的部署zip中。 无需手动重启Nginx。

接受的答案不适合我,所以相反,我用我自己的覆盖nginxconfiguration。

我在目录下创build了一个名为nginx.conf的文件.ebextensions/nginx/

我SSH进入我的Beanstalk应用程序的运行实例,并复制nginx.conf文件的内容,使用cat /etc/nginx/nginx.conf和从terminal复制。

我将内容粘贴到之前在.ebextensions/nginx/创build的nginx.conf文件中,并修改了http指令以包含client_max_body_size 50M; 。 我终于重新部署我的应用程序使用eb deploy ,它的工作。 您应该在部署过程中收到以下消息:

INFO:在'.ebextensions / nginx'目录中检测到的Nginxconfiguration。 AWS Elastic Beanstalk将不再pipe理此环境的Nginxconfiguration。

这些是我的.ebextensions/nginx/nginx.conf文件的内容:

 # Elastic Beanstalk Nginx Configuration File user nginx; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 33193; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include conf.d/*.conf; map $http_upgrade $connection_upgrade { default "upgrade"; } server { listen 80 default_server; access_log /var/log/nginx/access.log main; client_header_timeout 60; client_body_timeout 60; keepalive_timeout 60; gzip off; gzip_comp_level 4; gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; # Include the Elastic Beanstalk generated locations include conf.d/elasticbeanstalk/*.conf; } client_max_body_size 50M; } 

我不必重新启动nginx服务或环境。

注意 :确保.ebextensions是在部署期间创build并上传到Beanstalk的.zip文件的一部分(如果您正在使用它,则不会在.gitignore.ebignore忽略)。