如何为nginx位置指令配置.ebextensions?

时间:2014-01-24 14:48:38

标签: nginx elastic-beanstalk

我想在Elastic Beanstalk中配置我的暂存环境,以便始终禁止所有蜘蛛。 nginx指令看起来像这样:

location /robots.txt {
    return 200 "User-agent: *\nDisallow: /";
}

据我所知,我想在.ebextensions /文件夹下创建一个文件,例如01_nginx.config,但我不知道如何在其中构建YAML以便它可以工作。我的目标是将此位置指令添加到现有配置中,而不必完全替换现有的任何现有配置文件。

6 个答案:

答案 0 :(得分:9)

我想做同样的事情。经过大量挖掘后,我找到了两种方法:

选项1.使用ebextension将nginx配置文件替换为自定义配置

我使用此选项是因为它是最简单的选项。

按照亚马逊在Using the AWS Elastic Beanstalk Node.js Platform - Configuring the Proxy Server - Example .ebextensions/proxy.config中给出的示例,我们可以看到他们创建了一个ebextension,创建了一个名为 /etc/nginx/conf.d/proxy.conf 的文件。此文件包含与原始nginx配置文件相同的内容。然后,他们使用 container_commands 删除原始的nginx配置文件。

您需要将Amazon示例替换为当前nginx配置文件的内容。请注意,必须更新要在containter命令中删除的nginx配置文件。我使用的是:

  • nginx配置文件1 :/opt/elasticbeanstalk/support/conf/webapp_healthd.conf
  • nginx配置文件2 :/etc/nginx/conf.d/webapp_healthd.conf

因此,对我有用的最终ebextension如下:

<强> /。ebextensions / nginx_custom.config

# Remove the default nginx configuration generated by elastic beanstalk and
# add a custom configuration to include the custom location in the server block.
# Note that the entire nginx configuration was taken from the generated /etc/nginx/conf.d/webapp_healthd.conf file
# and then, we just added the extra location we needed.

files:
  /etc/nginx/conf.d/proxy_custom.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream my_app {
        server unix:///var/run/puma/my_app.sock;
      }

      log_format healthd '$msec"$uri"'
                      '$status"$request_time"$upstream_response_time"'
                      '$http_x_forwarded_for';

      server {
        listen 80;
        server_name _ localhost; # need to listen to localhost for worker tier

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
          set $year $1;
          set $month $2;
          set $day $3;
          set $hour $4;
        }

        access_log  /var/log/nginx/access.log  main;
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

        location / {
          proxy_pass http://my_app; # match the name of upstream directive which is defined above
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /assets {
          alias /var/app/current/public/assets;
          gzip_static on;
          gzip on;
          expires max;
          add_header Cache-Control public;
        }

        location /public {
          alias /var/app/current/public;
          gzip_static on;
          gzip on;
          expires max;
          add_header Cache-Control public;
        }

        location /robots.txt {
          return 200 "User-agent: *\nDisallow: /";
        }
      }

container_commands:
  # Remove the default nginx configuration generated by elastic beanstalk
 removeconfig:
    command: "rm -f /opt/elasticbeanstalk/support/conf/webapp_healthd.conf /etc/nginx/conf.d/webapp_healthd.conf"

部署此更改后,您必须重新加载nginx服务器。您可以使用 eb ssh your-environment-name 连接到您的服务器,然后运行 sudo service nginx reload

选项2.使用ebextension修改nginx配置文件生成器,以便它在最终的nginx配置文件中包含您的自定义位置

第二个选项基于这篇文章:jabbermarky's answer in Amazon forums

他在答案中很好地解释了这个方法,所以如果你想实现它,我鼓励你阅读它。如果要实现此答案,则需要更新nginx文件配置生成器的位置。

请注意,我尚未测试此选项。

总之,他添加了一个在生成nginx配置文件之前执行的shell脚本。在这个shell脚本中,他修改了nginx配置文件生成器,以在生成的nginx配置文件中包含他想要的服务器块位置。最后,他在最终的nginx配置文件的服务器块中添加了一个包含他想要的位置的文件。

答案 1 :(得分:4)

似乎所提到的方法不再适用。新方法是将nginx .conf文件放入.ebextensions:

中的子文件夹中
  

您现在可以将nginx.conf文件放在 .ebextensions / nginx 文件夹中以覆盖Nginx配置。您还可以将配置文件放在 .ebextensions / nginx / conf.d 文件夹中,以便将它们包含在平台提供的Nginx配置中。

Source

这不需要重新启动nginx,因为Elastic Beanstalk会处理这个问题。

答案 2 :(得分:3)

MMMMM! .ebextensions

您最简单的方法是创建一个shell脚本来更改配置,然后再运行它。不太了解nginx,但尝试了以下几点:

files:
    "/root/setup_nginx.sh" :
    mode: "000750"
    owner: root
    group: root
    content: |
        #!/bin/sh
        #  Configure for NGINX
        grep robots.txt <your_config_file> > /dev/null 2>&1
        if [ $? -eq 1 ] ; then
            echo < EOF >> <your_config_file>
            location /robots.txt {
                return 200 "User-agent: *\nDisallow: /";
            }
            EOF
        # Restart any services you need restarting
        fi

container_commands:
    000-setup-nginx:
        command: /root/setup_nginx.sh

即。首先创建一个执行所需操作的schell脚本,然后运行它。

哦,小心你的YAML没有标签!只允许使用空格...检查日志文件/var/log/cfn_init.log是否有错误......

祝你好运!

答案 3 :(得分:3)

There is an approach,该版本在Amazon Linux 2上使用了最新的.platform/nginx配置扩展(相对于较早的AMI)。

默认nginx.conf在整个nginx.conf文件的两个位置包括配置部分。其中一个紧邻http块内,因此您不能在此处放置其他location块,因为从语法上讲这是不合法的。第二个是在server块中,这就是我们需要的。

第二个位置的部分文件包含在特殊的子目录.platform/nginx/conf.d/elasticbeanstalk中。将您的位置片段放在此处以添加位置块,如下所示:

# .platform/nginx/conf.d/elasticbeanstalk/packs.conf
location /packs {
    alias /var/app/current/public/packs;
    gzip_static on;
    gzip on;
    expires max;
    add_header Cache-Control public;
}

答案 4 :(得分:1)

对于 Amazon Linux 2 版本,请在您的捆绑包中使用此路径并将其压缩在一起

.platform/nginx/conf.d/elasticbeanstalk/000_my_custom.conf

答案 5 :(得分:0)

使用.ebextension配置文件可以实现这一点,但是在更改配置文件后,我很难将nginx重新启动。

# .ebextensions/nginx.config
files:
  "/etc/nginx/conf.d/robots.conf":
    mode: "000544"
    owner: root
    group: root
    content: |
      location /robots.txt {
        return 200 "User-agent: *\nDisallow: /";
      }
    encoding: plain

现在,我已经做了类似的添加文件来踢nginx轮胎,但是由于一些奇怪的原因它没有执行:

"/opt/elasticbeanstalk/hooks/appdeploy/enact/03_restart_nginx.sh":
  mode: "000755"
  owner: root
  group: root
  content: |
    #!/usr/bin/env bash
    . /opt/elasticbeanstalk/containerfiles/envvars
    sudo service nginx restart
    ps aux | grep nginx > /home/ec2-user/nginx.times.log
    true
  encoding: plain