在AWS ElasticBeanstalk Nginx中使用gzip

10

我有一个运行在Amazon Linux 2/3.1.2上,使用Nginx作为代理服务器的Python 3.7 AWS EB环境。我正在尝试为我的应用程序添加gzip压缩。我尝试了网上的几个教程,但它们似乎都不适用于我的情况。另外,我对AWS也还不是很熟悉。

目前,我的目录结构如下:

-- .ebextensions
-- .platform
   -- nginx
     -- conf.d
        -- gzip.conf
-- (other files)

我尝试在.ebextensions中添加一个配置文件来创建.conf以启用gzip压缩,但似乎并没有起作用。我也尝试将代理切换到Apache,但没有成功。 这篇教程说,对于最新版本的Amazon Linux 2,nginx配置文件应该放置在.platform文件夹中,所以我按照说明做了。然而,我的gzip.conf文件仍然不起作用——文件仍然是以原始格式呈现。

目前我的gzip.conf文件:

gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/html text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";

编辑:我通过SSH登录了我的eb实例,发现这个文件位于/etc/nginx/conf.d/gzip.conf,并且内容与我上传的内容相同。这个路径是否正确以启用gzip?

非常感谢任何帮助!


1
如果您使用SSH进入EB实例,您可以手动设置Nginx使其工作吗?这样至少可以确认您想要使用的选项。 - Marcin
我遇到了类似的问题,并编写了一个要点摘要,介绍如何更改适用于Amazon Linux 2的nginx配置。您可以在这里找到它:https://gist.github.com/henhan/2943013c9064606425b0ee5bb1ca8c99 - Henrik Hansson
3个回答

10

核心思想: 要完全控制您的nginx配置,您需要覆盖项目目录中 .platform/nginx/nginx.conf 文件中的默认设置。

问题: 当我通过SSH登录到我的EB实例后,我发现文件/etc/nginx/nginx.conf仍包含默认设置gzip off。由于在Amazon Linux 2中,代理配置应该位于.platform/nginx 目录下,我想这是因为我的文件扩展没有覆盖该设置。

解决方案: 我使用SSH获取了 nginx.conf 的一份副本,将其添加到我的项目目录.platform/nginx中,注释掉原始的gzip设置,并添加新的gzip设置。以下是我更新后的nginx.conf文件的代码片段:

#Original Settings
#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;

#New Settings
gzip on;
gzip_static on;
gzip_comp_level 9;
gzip_proxied any;
gzip_types application/javascript application/rss+xml application/vnd.ms-fontobject application/x-font application/x-font-opentype application/x-font-otf application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml application/json font/opentype font/otf font/ttf image/svg+xml image/x-icon text/css text/html text/javascript text/plain text/xml;

部署后,终于成功了!希望这能帮助其他有同样问题的人。

感谢 @Marcin 的建议,让我通过SSH进入我的实例,并帮助我搞清楚了发生了什么。


5
不要在ElasticBeanstalk实例上进行任何操作。由于扩展和配置文件更改,这些实例不断上下运行,因此更改将会丢失。您应该使用.ebextentions来完成此操作。 - Peter
@Peter,Parzival 所做的是正确的。从 Amazon Linux 2 开始,.platform/ 目录也用于配置。 - pmoleri
@pmoleri 错了,他在谈论SSH到一个实例并在那里更改文件,这是非常不推荐的!您可以在项目文件夹中拥有一个.platform目录,EB将在部署期间使用它。 - Peter
3
@Peter 不,这不是我推荐的。我是在谈论如何通过ssh登录到我的实例来帮助我找到解决方案(并获取原始的nginx.conf文件的副本),而不是ssh更改文件。希望这可以澄清。 - Parzival
@Parzival,我无法确定你的意图,你的回答有误导性,最好编辑一下,而不是在评论中解释 :) - Peter
@Peter,我觉得这很清晰明了,即使他提到了“项目”和“部署后”,但可能是因为我已经熟悉了检索配置文件的概念。也许还有改进的空间,但肯定不是错误的。 - pmoleri

4
我使用一个小脚本解决了这个问题,并将其放在 .platform/hooks/predeploy 中。
以下是代码片段。
#!/usr/bin/env bash
set -e

echo Forcing gzip on.
sed -ri 's/gzip([ \t]+)off[ \t]*;/gzip\1 on;/' /var/proxy/staging/nginx/nginx.conf

请注意,上面的文本需要单独放在一个文件中,而/predeploy是一个文件夹,不是一个文件。因此,我添加了一个名为gzip.sh的文件,并添加了相关的文本,这样就可以正常工作了。 - undefined

2

与@Parzival提供的替代方案不同,您可以覆盖应用程序配置文件而不是根nginx配置。

要获取应用程序配置文件,请通过ssh登录实例,并从以下位置获取配置文件:/etc/nginx/conf.d/elasticbeanstalk/00_application.conf

我的看起来像这样:

location / {
    proxy_pass          http://127.0.0.1:8080;
    proxy_http_version  1.1;

    proxy_set_header    Connection          $connection_upgrade;
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Host                $host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
}

我把它保存到我的项目中:

.platform/nginx/conf.d/elasticbeanstalk/00_application.conf

然后编辑它,添加我需要的内容:

location / {
    # Base config from elasticbeanstalk:
    proxy_pass          http://127.0.0.1:8080;
    proxy_http_version  1.1;

    proxy_set_header    Connection          $connection_upgrade;
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Host                $host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

    # Add forwarded protocol and port details
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-Port $http_x_forwarded_port;

    # Override gzip directive in server block
    gzip on;
    gzip_comp_level 5;
    gzip_types text/* application/json application/javascript application/x-javascript application/xml application/xml+rss;
}

接下来,创建一个新的bundle并部署它。Beanstalk将使用您自定义的00_application.conf而不是默认的配置文件。

注意事项:

  • I added protocol and port forwarding, unrelated to this question but still worth sharing
  • I edited gzip_types setting text/*, the default config in the root file was:
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    

对于任何阅读此文的人来说,这是正确的答案并且有效。我已经测试过了。它也适用于AWS Linux 2023。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接