Эластичная фасоль

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

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

  • Конфигурация nginx в cat/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-user @ip-172-31-45-222 ~] $sudo netstat -lnptu

    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 22506/nginx

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22506/nginx

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

Ответ 1

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

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

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

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

Вы можете проверить это, посмотрев журналы эластичных бобовых стволов:

-------------------------------------
/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 использовать модуль прокси-сервера, чтобы передать все из порта 8080 в нашу восходящую группу nodejs, которая работает на порту 8081 Это означает, что порт 8081 предназначен для доступа к нему локально, но порт 8080 - это то, что позволяют внешним объектам разговаривать с nginx, который затем передает материал на nodejs.

Некоторые аргументы в пользу того, что NodeJS не подвергаются напрямую, можно найти в fooobar.com/info/11837/....

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

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

Так как группа безопасности разрешает доступ только к порту 80, существует правило iptables, которое настраивается для перенаправления порта 80 на порт 8080. Это позволяет привязывать к корневому файлу не-root к порту 8080, поскольку для более низких номеров портов требуются привилегии root.

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

[[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, балансировщик нагрузки перенаправляет трафик на данный экземпляр на порт 80, который разрешен через группу безопасности, тогда iptables перенаправляет это на порт 8080, который является портом, который nginx использует прокси для передачи трафика на порт 8081, который является локальным портом NodeJS.

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