Как изменить маршрутизацию NGINX в Elastic Beanstalk AWS?

Поэтому у меня был очень длинный пост, связанный с развертыванием приложения elixir в Elastic Beanstalk (здесь: HTTP 500 Развертывание Elixir/Phoenix в AWS Elastic Beanstalk).

Я наконец-то сварил проблему с тем, что мой NGINX неправильно настроен для маршрутизации трафика. Это отправляет это:

2017/11/18 00:52:45 [error] 2811#0: *15 connect() failed (113: No route to host) 
while connecting to upstream, client: 172.31.25.36, server: ,
request: "GET / HTTP/1.1",
upstream: "http://172.17.0.2:4000/", host: "172.31.17.239"

Я искал в Интернете возможные решения и нашел (мне также нужно добавить возможность использовать веб-сокеты, которые этот фрагмент кода выглядит ближе всего: https://scopestar.com/blog/aws/elasticbeanstalk/websockets/2016/10/21/enable-websockets-on-elasticbeanstalk-nginx-proxy.html

До сих пор я получил следующее - он удаляет предыдущий конфиг, пишет новый с веб-сокетами.

files:
  "/etc/nginx/conf.d/01_nginx_websocket.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:8081;
        keepalive 256;
      }

      server {
        listen 8080;

        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/healthd/application.log.$year-$month-$day-$hour healthd;


        location / {
          proxy_pass  http://nodejs;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          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;
      gzip_comp_level 4;
      gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

      }

container_commands:
 removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

Но я немного застрял на том, как я делаю фактическую маршрутизацию. Есть хороший пример того, как изменить восходящий и серверный маршруты, чтобы они корректно связывались и устраняли полученную ошибку?

РЕДАКТИРОВАТЬ:

Этот веб-сайт: https://dennisreimann.de/articles/phoenix-nginx-config.html

Предложил, чтобы я сделал что-то вроде того, чтобы взять мой образ в Dockerfile и направить весь трафик на localhost:myport, а затем направить его на AWSEB:80, что казалось достаточно простым.

Я сделал что-то вроде следующего в моих.ebextensions как.conf:

files:
  "/etc/nginx/conf.d/01_nginx_websocket.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server localhost:4000;
        keepalive 256;
      }

      server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name newslyproduction3.us-west-2.elasticbeanstalk.com;

        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/healthd/application.log.$year-$month-$day-$hour healthd;


        location / {
          proxy_pass  http://nodejs;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          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;
      gzip_comp_level 4;
      gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

      }

container_commands:
 removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

Однако это приводит к другим ошибкам, и я не уверен, что подхожу ближе или ухожу дальше.

INFO: Successfully built aws_beanstalk/staging-app
ERROR: Failed to start nginx, abort deployment
ERROR: [Instance: i-0c48e103c226ca0a9] Command failed on instance. Return code: 1 Output: (TRUNCATED)...enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
nginx: configuration file /etc/nginx/nginx.conf test failed
Failed to start nginx, abort deployment. 

В этом сообщении об ошибке Nginx, связанной с определенным доменным именем, предполагается, что мне нужно увеличить размер имени в блоке http, но я не знаю, где это находится в nginx AWS EB.

РЕДАКТИРОВАТЬ:

Следующие фрагменты кода, которые я нашел здесь https://dennisreimann.de/articles/phoenix-nginx-config.html (и в другом месте я переделал свой файл, чтобы он выглядел следующим образом):

files:
  "/etc/nginx/conf.d/01_nginx_websocket.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server localhost:4000;
        keepalive 256;
      }

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

      server {
        listen 80;
        server_name _ localhost;

        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/healthd/application.log.$year-$month-$day-$hour healthd;

        access_log    /var/log/nginx/access.log;


        location / {
          proxy_pass http://newslyproduction3.us-west-2.elasticbeanstalk.com;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          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;
      gzip_comp_level 4;
      gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

      }

container_commands:
 removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

Так что теперь он ссылается на localhost на док-машине и направляет мой экземпляр. Или я так думал.

Это загружает нормально, но затем терпит неудачу со следующими журналами для NGINX:

-------------------------------------
/var/log/nginx/access.log
-------------------------------------
172.31.35.70 - - [18/Nov/2017:04:12:30 +0000] "GET / HTTP/1.1" 463 0 "-" "ELB-HealthChecker/2.0"
172.31.6.206 - - [18/Nov/2017:04:12:30 +0000] "GET / HTTP/1.1" 463 0 "-" "ELB-HealthChecker/2.0"
172.31.35.70 - - [18/Nov/2017:04:12:30 +0000] "GET / HTTP/1.1" 463 0 "-" "ELB-HealthChecker/2.0"
172.31.6.206 - - [18/Nov/2017:04:12:30 +0000] "GET / HTTP/1.1" 463 0 "-" "ELB-HealthChecker/2.0"

и мое приложение начинает работать на велосипеде

-------------------------------------
/var/log/eb-docker/containers/eb-current-app/20c6293b969d-stdouterr.log
-------------------------------------

** (exit) exited in: :gen_server.call(#PID<0.221.0>, {:checkout, #Reference<0.0.1.3329>, true, :infinity}, 5000)
    ** (EXIT) time out
    (db_connection) lib/db_connection/poolboy.ex:112: DBConnection.Poolboy.checkout/3
    (db_connection) lib/db_connection.ex:920: DBConnection.checkout/2
    (db_connection) lib/db_connection.ex:742: DBConnection.run/3
    (db_connection) lib/db_connection.ex:1133: DBConnection.run_meter/3
    (db_connection) lib/db_connection.ex:584: DBConnection.prepare_execute/4

** (exit) exited in: :gen_server.call(#PID<0.221.0>, {:checkout, #Reference<0.0.1.3329>, true, :infinity}, 5000)
    ** (EXIT) time out
    (db_connection) lib/db_connection/poolboy.ex:112: DBConnection.Poolboy.checkout/3
    (db_connection) lib/db_connection.ex:920: DBConnection.checkout/2
    (db_connection) lib/db_connection.ex:742: DBConnection.run/3
    (db_connection) lib/db_connection.ex:1133: DBConnection.run_meter/3
    (db_connection) lib/db_connection.ex:584: DBConnection.prepare_execute/4

Dockerfile компилируется и запускается локально (с непроизводственными конфигами), и у меня есть производственные конфиги и dockerfile, о которых говорится в учебнике, с которым я работаю ( https://robots.thoughtbot.com/deploying-elixir-to-aws-elastic-beanstalk-with-docker), так что единственное, что я могу думать, это то, что это должна быть какая-то ошибка NGINX.

Я чувствую, что я немного ближе, и попытка перенаправить локальный хост к конечной точке AWS EB - правильное направление.

РЕДАКТИРОВАТЬ:

Я также задал вопрос о ServerFault, поскольку они могут быть более целенаправленным сообществом и иметь некоторые идеи. https://serverfault.com/questions/884036/how-do-i-modify-nginx-routing-on-elastic-beanstalk-aws-so-x-post.

0 ответов

Другие вопросы по тегам