HTTP 500 Развертывание эликсира / феникса на эластичном бобовом стебле AWS
У меня проблемы с конфигурацией elixir/phoenix, которая мне нужна для развертывания в AWS/Elastic Beanstalk. (Следуя инструкциям, найденным здесь: https://robots.thoughtbot.com/deploying-elixir-to-aws-elastic-beanstalk-with-docker - мой Dockerfile выглядит аналогично, за исключением обновленных библиотек).
Я могу бежать в eb local run
Затрудняюсь подтолкнуть к производству.
Однако, когда я пытаюсь выполнить развертывание на EB, я получаю следующее предупреждение, и оно вылетает:
Environment health has transitioned from Degraded to Severe.
100.0 % of the requests are failing with HTTP 5xx.
Command failed on all instances.
Incorrect application version found on all instances. Expected version "app-8412-171116_115503" (deployment 5).
ELB processes are not healthy on all instances.
100.0 % of the requests to the ELB are erroring with HTTP 4xx.
Insufficient request rate (0.5 requests/min) to determine application health (5 minutes ago).
ELB health is failing or not available for all instances.
Мне было интересно, если кто-нибудь может дать мне знать, если мои конфиги выглядят правильно.
Я пробовал кучу вещей, но думаю, что запутался, как я только догадываюсь на данный момент.
config.exs
use Mix.Config
config :newsly,
ecto_repos: [Newsly.Repo]
config :logger, :console,
format: "$time $metadata[$level] $message\n",
metadata: [:request_id]
import_config "#{Mix.env}.exs"
prod.exs
use Mix.Config
config :logger, :console, format: "[$level] $message\n"
config :phoenix, :stacktrace_depth, 5
import_config "prod.secret.exs"
prod.secret.exs
use Mix.Config
config :ex_aws,
access_key_id: System.get_env("AWS_ACCESS_KEY_ID"),
secret_access_key: System.get_env("AWS_SECRET_ACCESS_KEY"),
bucket_name: System.get_env("BUCKET_NAME"),
s3: [
scheme: "https://",
host: System.get_env("BUCKET_NAME"),
region: "us-west-2"
]
config :newsly, Newsly.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env("USERNAME"),
password: System.get_env("PASSWORD"),
database: System.get_env("DATABASE"),
hostname: System.get_env("DBHOST"),
# sometimes hostname is db (like in the docker-compose method - play with this one)
pool_size: 10
config :newsly, Newsly.Endpoint,
http: [port: 4000],
debug_errors: true,
code_reloader: false,
url: [scheme: "http", host: System.get_env("HOST"), port: 4000],
secret_key_base: System.get_env("SECRET_KEY_BASE"),
pubsub: [adapter: Phoenix.PubSub.PG2, pool_size: 5, name: Newsly.PubSub],
check_origin: false,
watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
cd: Path.expand("../", __DIR__)]]
И в моем Dockerfile я установил переменные среды следующим образом:
ENV AWS_ACCESS_KEY_ID=nottelling
ENV AWS_SECRET_ACCESS_KEY=nottelling
ENV BUCKET_NAME=s3 storage bucket (not eb related)
ENV SECRET_KEY_BASE=nottelling
ENV HOST=host name of my eb instance im uploading to
ENV DBHOST=AWS rds host that holds postgres
ENV USERNAME=nottelling
ENV PASSWORD=nottelling
Мой отчет о работоспособности экземпляра не отображается красным цветом со следующим предупреждением:
Environment health has transitioned from Warning to Severe. 100.0 % of the requests are failing with HTTP 5xx. ELB processes are not healthy on all instances. ELB health is failing or not available for all instances.
NGINX, кажется, задыхается от линий
2017/11/16 17:59:46 [error] 28815#0: *99 connect() failed (113: No route to host) while connecting to upstream, client: 172.31.20.108, server: , request: "GET / HTTP/1.1", upstream: "http://172.17.0.2:4000/", host: "172.31.38.244"
в логах nginx.
Если я смотрю на журнал активности eb, у меня есть
duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
который, кажется, убивает nginx
[2017-11-16T18:02:33.927Z] INFO [29355] - [Application update app-8412-171116_115503@5/AppDeployStage1/AppDeployEnactHook/01flip.sh] : Completed activity. Result:
nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
Stopping nginx: [ OK ]
Starting nginx: nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
[ OK ]
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
Stopping current app container: e0161742ee69...
Error response from daemon: No such image: aws_beanstalk/current-app:latest
Making STAGING app container current...
Untagged: aws_beanstalk/staging-app:latest
eb-docker start/running, process 1398
Docker container e25f2b562f4f is running aws_beanstalk/current-app.
У кого-нибудь есть какие-либо идеи?
РЕДАКТИРОВАТЬ:
Копаясь в логах для nginx я нашел
map $http_upgrade $connection_upgrade {
default "upgrade";
"" "";
}
server {
listen 80;
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;
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://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Так,
duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
Кажется, имеет в виду эту строку:
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
Но в этот момент я нахожу удивительным, если nginx задыхается просто потому, что определяет text/html
дважды. Так что теперь я не уверен....
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: я должен упомянуть, что мои nginx/error.logs выглядят следующим образом (последние строки повторяют ad-infinum):
2017/11/16 17:19:22 [warn] 18445#0: duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
2017/11/16 17:19:22 [warn] 18460#0: duplicate MIME type "text/html" in /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf:11
2017/11/16 17:20:06 [error] 18467#0: *11 connect() failed (113: No route to host) while connecting to upstream, client: 172.31.32.139, server: , request: "GET / HTTP/1.1", upstream: "http://172.17.0.2:4000/", host: "172.31.38.244"
2017/11/16 17:20:15 [error] 18467#0: *13 connect() failed (113: No route to host) while connecting to upstream, client: 172.31.20.108, server: , request: "GET / HTTP/1.1", upstream: "http://172.17.0.2:4000/", host: "172.31.38.244"
2017/11/16 17:20:21 [error] 18467#0: *15 connect() failed (113: No route to host) while connecting to upstream, client: 172.31.32.139, server: , request: "GET / HTTP/1.1", upstream: "http://172.17.0.2:4000/", host: "172.31.38.244"
2017/11/16 17:20:30 [error] 18467#0: *17 connect() failed (113: No route to host) while connecting to upstream, client: 172.31.20.108, server: , request: "GET / HTTP/1.1", upstream:
ЭТО СЕРДЦЕ ПРОБЛЕМЫ
NGINX принципиально не может подключить точку входа к приложению, и я не знаю почему!
ОБНОВИТЬ:
Используя рекомендации Кевина Джонсона, я успешно отправил в AWS ECR свой Dockerfile, и он правильно скомпилировался, когда я eb deploy
с хорошим приложением Dockerrun.aws.json
, Это на самом деле предпочтительный способ сделать это. ОДНАКО, я все еще получаю ту же ошибку! Я не знаю, что происходит, но я могу с уверенностью сказать, что мой Dockerfile успешно компилируется.
Я думаю, что что-то сломалось в AWS, и я не уверен, что.
ОБНОВИТЬ
Проблема связана с проблемой маршрутизации NGINX. Более подробная информация здесь, в чистом вопросе: Как изменить маршрутизацию NGINX в Elastic Beanstalk AWS?
1 ответ
Я очень подозреваю, что проблема, с которой вы имеете дело, это либо:
Ваш
Dockerrun.aws.config
файл указывает на несуществующий образ докера наECS Repository
, На это указывает сообщение об ошибке:Error response from daemon: No such image: aws_beanstalk/current-app:latest Making STAGING app container current...
Когда EB не сможет заменить экземпляр последней конфигурацией, он вернется к старой, которая может бытьHello World
приложение AWS, которое вы, возможно, использовали для настройки EB. Этот контейнер не имеет веб-службы, работающей на порту 4000, тогда как вашDockerrun.aws.config
указывает порт 4000. (Я был бы удивлен, хотя, что вашDockerrun.aws.config
также не заменяется EB на предыдущую рабочую версию)Dockerrun.aws.config
и убедитесь, что указанная конечная точка изображения действительно существует. Попробуйте потянуть его на месте и запустить его соответственно. Сначала очистите вашу локальную среду от всех образов и запустите докер-контейнеры, если это необходимо.Ваше приложение, запущенное в Docker, сразу же падает при запуске. Опять же, EB обнаружит это и заменит разбившийся контейнер на предыдущий контейнер, который снова не имеет порта
4000
открыть.