AWS ECS Docker - nginx: [emerg] 在上游找不到主机
AWS ECS Docker - nginx: [emerg] host not found in upstream
我正在尝试 运行 php + mysql 应用程序与 AWS ECS 使用 docker。
应用程序堆栈由 mysql、elk、php-fpm 和 nginx docker 容器组成。这些容器都 运行 在同一台 docker 机器上。当任务启动时,nginx 容器退出并出现以下错误: nginx: [emerg] host not found in upstream "php:9001" in /etc/nginx/conf.d/upstream.conf:1 .
Nginx Dockerfile:
FROM alpine:3.4
RUN apk add --update nginx
#Clear Cache and Temp Data
RUN rm -rf /var/cache/apk/* && rm -rf /tmp/*
ADD nginx.conf /etc/nginx/
ADD symfony.conf /etc/nginx/conf.d/
RUN echo "upstream php-upstream { server php:9001; }" > /etc/nginx/conf.d/upstream.conf
RUN adduser -D -g '' -G www-data www-data
CMD ["nginx"]
EXPOSE 80
EXPOSE 443
RUN echo "upstream php-upstream { server php:9001; }" >
/etc/nginx/conf.d/upstream.conf
php:9001
部分引用了在 AWS ECS 任务定义中定义的 php 容器。
nginx.conf:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log off;
error_log off;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
open_file_cache max=100;
}
daemon off;
symfony.conf:
server {
server_name _;
root /var/www/symfony/web;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/ last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
error_log /var/log/nginx/symfony_error.log;
access_log /var/log/nginx/symfony_access.log;
}
/etc/php7/php-fpm.conf:
[symfony]
user = nobody
group = nobody
listen = 0.0.0.0:9001
pm = dynamic
pm.max_children = 1000
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
env[DB_1_ENV_MYSQL_DATABASE] = $DB_1_ENV_MYSQL_DATABASE
env[DB_1_ENV_MYSQL_USER] = $DB_1_ENV_MYSQL_USER
env[DB_1_ENV_MYSQL_PASSWORD] = $DB_1_ENV_MYSQL_PASSWORD
catch_workers_output = yes
我还尝试根据对 nginx 配置的更改来更改监听 listen = /var/run/php-fpm/php-fpm.sock
或 listen = 127.0.0.1:9001
,但这导致了其他各种错误消息。
我没有在 php
和 nginx
容器之间的 AWS ECS 任务定义中设置 links。
要为容器设置 link,请转到 NETWORK SETTINGS
,然后在 Links
字段中输入 link。
正如@OnurDemir 所说,当您的网络模式为 awsvpc
- "networkMode": "awsvpc",
.
时,您不能使用 links
使用这种网络模式,您可以仅使用名称来调用容器。
任务-definition.json
{
"family": "app-backend",
"containerDefinitions": [
{
"name": "nginx",
"image": "my-url-to-the-docker-image",
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"dependsOn": [
{
"containerName": "php-fpm",
"condition": "START"
}
],
"essential": true
},
{
"name": "php-fpm",
"image": "my-url-to-the-docker-image",
"portMappings": [
{
"containerPort": 9000
}
],
"essential": true
}
],
"executionRoleArn": "ecsTaskExecutionRole",
"cpu": "1024",
"memory": "2048",
"networkMode": "awsvpc"
}
在这里你可以看到:
nginx
容器dependsOn
php-fpm
容器。
- 当你想引用
php-fpm
中的容器时,f.前任。 nginx
中的一个 vhost 文件,你可以通过它的名字来调用它 php-fpm
.
示例 1:fastcgi_pass php-fpm:9000;
另一种方法,当使用 AWS Fargate 时,您可以只调用环回 127.0.0.1
或 localhost
。
Described in some AWS blog 当使用 awsvpc
时,容器间连接就像所有容器都在同一台机器上一样,即使它们是单独的容器。
示例 2:fastcgi_pass 127.0.0.1:9000;
我正在尝试 运行 php + mysql 应用程序与 AWS ECS 使用 docker。 应用程序堆栈由 mysql、elk、php-fpm 和 nginx docker 容器组成。这些容器都 运行 在同一台 docker 机器上。当任务启动时,nginx 容器退出并出现以下错误: nginx: [emerg] host not found in upstream "php:9001" in /etc/nginx/conf.d/upstream.conf:1 .
Nginx Dockerfile:
FROM alpine:3.4
RUN apk add --update nginx
#Clear Cache and Temp Data
RUN rm -rf /var/cache/apk/* && rm -rf /tmp/*
ADD nginx.conf /etc/nginx/
ADD symfony.conf /etc/nginx/conf.d/
RUN echo "upstream php-upstream { server php:9001; }" > /etc/nginx/conf.d/upstream.conf
RUN adduser -D -g '' -G www-data www-data
CMD ["nginx"]
EXPOSE 80
EXPOSE 443
RUN echo "upstream php-upstream { server php:9001; }" > /etc/nginx/conf.d/upstream.conf
php:9001
部分引用了在 AWS ECS 任务定义中定义的 php 容器。
nginx.conf:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log off;
error_log off;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
open_file_cache max=100;
}
daemon off;
symfony.conf:
server {
server_name _;
root /var/www/symfony/web;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/ last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
error_log /var/log/nginx/symfony_error.log;
access_log /var/log/nginx/symfony_access.log;
}
/etc/php7/php-fpm.conf:
[symfony]
user = nobody
group = nobody
listen = 0.0.0.0:9001
pm = dynamic
pm.max_children = 1000
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
env[DB_1_ENV_MYSQL_DATABASE] = $DB_1_ENV_MYSQL_DATABASE
env[DB_1_ENV_MYSQL_USER] = $DB_1_ENV_MYSQL_USER
env[DB_1_ENV_MYSQL_PASSWORD] = $DB_1_ENV_MYSQL_PASSWORD
catch_workers_output = yes
我还尝试根据对 nginx 配置的更改来更改监听 listen = /var/run/php-fpm/php-fpm.sock
或 listen = 127.0.0.1:9001
,但这导致了其他各种错误消息。
我没有在 php
和 nginx
容器之间的 AWS ECS 任务定义中设置 links。
要为容器设置 link,请转到 NETWORK SETTINGS
,然后在 Links
字段中输入 link。
正如@OnurDemir 所说,当您的网络模式为 awsvpc
- "networkMode": "awsvpc",
.
links
使用这种网络模式,您可以仅使用名称来调用容器。
任务-definition.json
{
"family": "app-backend",
"containerDefinitions": [
{
"name": "nginx",
"image": "my-url-to-the-docker-image",
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"dependsOn": [
{
"containerName": "php-fpm",
"condition": "START"
}
],
"essential": true
},
{
"name": "php-fpm",
"image": "my-url-to-the-docker-image",
"portMappings": [
{
"containerPort": 9000
}
],
"essential": true
}
],
"executionRoleArn": "ecsTaskExecutionRole",
"cpu": "1024",
"memory": "2048",
"networkMode": "awsvpc"
}
在这里你可以看到:
nginx
容器dependsOn
php-fpm
容器。- 当你想引用
php-fpm
中的容器时,f.前任。nginx
中的一个 vhost 文件,你可以通过它的名字来调用它php-fpm
.
示例 1:fastcgi_pass php-fpm:9000;
另一种方法,当使用 AWS Fargate 时,您可以只调用环回 127.0.0.1
或 localhost
。
Described in some AWS blog 当使用 awsvpc
时,容器间连接就像所有容器都在同一台机器上一样,即使它们是单独的容器。
示例 2:fastcgi_pass 127.0.0.1:9000;