2014-01-24 2 views
3

Я хочу настроить свою промежуточную среду в Elastic Beanstalk, чтобы всегда запрещать всех пауков. Директива Nginx будет выглядеть следующим образом:Как настроить .ebextensions для директивы размещения nginx?

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

Я понимаю, что я хотел бы создать файл под .ebextensions/папки, такие как 01_nginx.config, но я не уверен, как структурировать YAML внутри это так, что это сработает. Моя цель - добавить эту директиву местоположения в существующую конфигурацию, а не полностью заменить любые существующие файлы конфигурации, которые находятся на месте.

ответ

3

Mmmmm! .ebextensions!

Возможно, вам проще всего создать сценарий оболочки, чтобы изменить конфигурацию, а затем запустить ее. Не знаю 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 

I.e. сначала создайте скрипт Schell, который сделает то, что вам нужно, а затем запустите его.

О, и будьте осторожны, нет никаких вкладок в вашем YAML! Разрешены только пробелы ... Проверьте файл журнала /var/log/cfn_init.log на наличие ошибок ...

Удачи!

1

Это возможно с использованием конфигурационных файлов .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 
+0

На самом деле я пробовал это, и он полностью провалился. Из журналов: '' ' ------------------------------------- /var /log/nginx/error.log ------------------------------------- 2014/05/09 11:46:09 [emerg] 13740 # 0: директива "location" здесь не разрешена в /etc/nginx/conf.d/robots.conf:1 2014/05/09 11:46:11 [emerg ] 13746 # 0: директива «location» не разрешена здесь, в /etc/nginx/conf.d/robots.conf:1 '' ' – rgareth

+0

О, bugger. Да, хорошо, что, возможно, невозможно достичь во всем мире. Вам действительно нужно найти и заменить содержимое в самом файле конфигурации nginx. Это немного сложнее, но еще достижимо. – jufemaiz

3

Я хотел сделать то же самое. После того, как много копания, я нашел 2 способа сделать это:

Вариант 1. Используйте ebextension, чтобы заменить файл конфигурации Nginx с пользовательской конфигурации

Я использовал этот вариант, поскольку он является самым простым.

После пример, приведенный в Amazon Using the AWS Elastic Beanstalk Node.js Platform - Configuring the Proxy Server - Example .ebextensions/proxy.config, мы можем видеть, что они создают ebextension, который создает файл с именем /etc/nginx/conf.d/proxy.conf. Этот файл содержит тот же контент, что и исходный файл конфигурации nginx. Затем они удаляют исходный файл конфигурации nginx, используя container_commands.

Вам необходимо заменить пример Amazon на содержимое вашего текущего файла конфигурации nginx. Обратите внимание, что файлы конфигурации nginx, которые должны быть удалены в команде сдерживания, также должны быть обновлены. Те, которые я использовал являются:

  • файл конфигурации Nginx 1: /opt/elasticbeanstalk/support/conf/webapp_healthd.conf
  • конфигурации Nginx файл 2: /etc/nginx/conf.d/ webapp_healthd.конф

Поэтому окончательный 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. Вы можете подключиться к серверу, используя Е.Б. SSH-среда-имя вашей, а затем запустить Nginx службы SUDO перезагружать

Вариант 2. Используйте ebextension изменить генератор файлов конфигурации Nginx, так что она включает в себя пользовательские местоположения в конечной конфигурации Nginx файла

Второй вариант основан на этом посту: jabbermarky's answer in Amazon forums

Он объясняет этот метод очень хорошо в своем ответе, поэтому я рекомендую вам прочитать, если вы хотите реализовать. Если вы собираетесь реализовать этот ответ, вам необходимо обновить местоположение генератора конфигурации файла nginx.

Обратите внимание, что я не тестировал эту опцию.

Таким образом, он добавляет сценарий оболочки, который должен быть выполнен до создания файла конфигурации nginx. В этом сценарии оболочки он модифицирует генератор файлов конфигурации nginx, чтобы включить в него блок блоков сервера, который он хочет, в сгенерированном файле конфигурации nginx. Наконец, он добавляет файл, содержащий нужные ему местоположения в блоке сервера окончательного файла конфигурации nginx.

0

Кажется, что упомянутые подходы больше не работают. Новый подход заключается в размещении Nginx .conf файлов в подпапку в .ebextensions:

Теперь вы можете поместить файл nginx.conf в .ebextensions/Nginx папки для переопределения конфигурации Nginx. Вы также можете разместить файлы конфигурации в папке .ebextensions/nginx/conf.d, чтобы включить их в конфигурацию Nginx, предоставляемую платформой.

Source

Это не требует перезагрузки Nginx либо Elastic Beanstalk будет заботиться об этом.

+1

Это не работает для меня. – Pachonk

+0

Я где-то читал, что это работает только на некоторых платформах, возможно, на платформах Docker. Двойная проверка платформы, которую вы используете. –

Смежные вопросы