2014-09-27 3 views
12

Я стараюсь следить за конфигурацией nginx на эластичном бобовом стебле, а некоторые вещи не складываются.эластичный beanstalk weird nginx конфигурация

  • Экземпляр открывает порт 80 в группах безопасности, поэтому я предполагаю, что весь входящий трафик, проходящий через этот порт

  • Конфигурация Nginx в кошки /etc/nginx/conf.d/00_elastic_beanstalk_proxy. conf:

    server { 
    listen 8080; 
    location/{ 
        proxy_pass http://nodejs; 
        proxy_set_header Connection ""; 
        proxy_http_version 1.1; 
        proxy_set_header  Host   $host; 
        proxy_set_header  X-Real-IP  $remote_addr; 
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
    gzip on; 
    } 
    

    Порт 8080? Откуда это пришло? Я пытался связать это, это фактическая директива, которая работает.

  • имя_сервера отсутствует, но tt не имеет значения, что вы вкладываете в него. Если я сам ввел значение в имя_сервера, это правило сервера будет по-прежнему соответствовать всем запросам, даже тем, которые не удаляют удаленно значение server_name.

  • При подключении к самому примеру кажется оба порта обслуживаются:

    [ec2 пользователь @ IP-172-31-45-222 ~] $ Sudo NetStat -lnptu

    ТСР 0 0 0.0.0.0:8080 0.0.0.0:* СЛУШАТЬ 22506/Nginx

    ТСР 0 0 0.0.0.0:80 0.0.0.0:* СЛУШАТЬ 22506/Nginx

Еще раз, 8080 никогда не открыт в этих так что эластичная балансировка нагрузки попадает внутрь через порт 80. Ли трафик магически идет от 80 до 8080? Любые идеи, что здесь происходит?

ответ

31

Вы забываете смотреть на одну часть этой Nginx конфигурации:

upstream nodejs { 
    server 127.0.0.1:8081; 
    keepalive 256; 
} 

Эта часть говорит Nginx, чтобы сделать группу серверов, называемых nodejs, как вы можете прочитать о here.

8081 - это порт, на котором работает NodeJS (если вы используете, например, sample application).

Вы можете убедиться в этом, посмотрев на бревнах Elastic Beanstalk:

------------------------------------- 
/var/log/nodejs/nodejs.log 
------------------------------------- 
Server running at http://127.0.0.1:8081/ 

Тогда, если мы продолжим в файле nginx.conf мы можем увидеть, что вы уже размещены:

server { 
    listen 8080; 

    location/{ 
     proxy_pass http://nodejs; 
     proxy_set_header Connection ""; 
     proxy_http_version 1.1; 
     proxy_set_header  Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 


} 

Это говорит nginx использовать proxy pass module, чтобы передать все из порта 8080 в нашу восходящую группу nodejs, которая работает на порту 8081. Это означает, что порт 8081 предназначен для доступа к нему локально, но порт 8080 - это то, что позволяют внешним сторонам общаться с nginx, который затем проходит на узлах.

Некоторые из причин, по которым не подвергается NodeJS, можно найти в this StackOverflow answer.

Порт 8080 используется, поскольку он является «HTTP alternate port», который «обычно используется для веб-прокси-сервера и кеширования или для запуска веб-сервера как пользователя без полномочий root."

Это объясняет порты. Теперь вопрос о УДР и, как все говорят друг с другом.

Поскольку группа безопасности только разрешающее доступ к порту 80, есть Iptables правило, которое настроено для пересылки порт 80 на порт 8080. Это позволяет некорневая привязку к порту 8080, потому что номера портов ниже требуют привилегий суперпользователя

Вы можете проверить это, выполнив следующие действия:.

[[email protected] ~]$ sudo iptables -t nat -L 
Chain PREROUTING (policy ACCEPT) 
target  prot opt source    destination   
REDIRECT tcp -- anywhere    anywhere    tcp dpt:http redir ports 8080 

Chain INPUT (policy ACCEPT) 
target  prot opt source    destination   

Chain OUTPUT (policy ACCEPT) 
target  prot opt source    destination   
REDIRECT tcp -- anywhere    anywhere    tcp dpt:http redir ports 8080 

Chain POSTROUTING (policy ACCEPT) 
target  prot opt source    destination   

Так что в итоге, когда вы загрузите CNAME, балансировку нагрузки er перенаправляет трафик на данный экземпляр на порт 80, который разрешен через группу безопасности, тогда iptables перенаправляет это на порт 8080, который является портом, который nginx использует прокси для передачи трафика на порт 8081, который является локальный порт NodeJS.

Надеюсь, это поможет.

+1

но nginx работает как root, и все примеры nginx всегда содержат 80 в конфигурациях, вот почему я был смущен, что особенно важно для среды beanstalk. –

+0

Ну, конечно, не все * конфигурации nginx работают на порту 80. Справедливо немного проще написать учебник с использованием порта 80, чем запустить его на другом порту с фильтром iptable. В Эластическом бобовом стебле нет ничего особенного, это именно то, что было выбрано. –

+0

Это отличное объяснение настройки ElginBeanstalk nginx для приложений nodejs, в частности, заключительный шаг iptables. – Jessedc