NGINX 反向代理 + ngx_upstream_resolveMK - 尝试从 ECS 服务发现 Route53 自动命名解析 SRV
NGINX Reverse Proxy + ngx_upstream_resolveMK - Trying to resolve SRV from ECS Service Discovery Route53 Auto Naming
我目前遇到 ECS 服务发现和 Route53 自动命名问题。
我已将服务注册表添加到服务中,所有托管区域记录都将自动填充。
但我似乎无法弄清楚如何使用 NGINX + ngx_upstream_resolveMK.
解析 DNS SRV 记录
# DNS RESOLVER
resolver ns-x.awsdns-xx.com valid=10s;
# UPSTREAMS
upstream kibana {
resolveMK servicediscovery.ecs service=kibana;
}
# HOST - kibana.example.com
server {
server_name kibana.example.com;
listen 80;
location / {
proxy_pass https://kibana/;
rewrite ^/(.*)$ / break;
}
}
错误:nginx: [emerg] host not found in upstream "servicediscovery.ecs" in /usr/local/nginx/sites-enabled/kibana.conf:3
看来缺少 A 记录需要解析 "servicediscovery.ecs" 到 Route 53 私有区域。
我需要手动添加吗?或者有没有办法动态添加这条A记录?
我认为这就是问题的原因,但我仍在学习,可能还有很长的路要走。
更新:
我读到你也可以使用 xxx.xxx.xxx.2 通过 AWS VPC 访问 DNS
我已经使用新的解析器进行了测试,但运气不佳。
# DNS RESOLVER
resolver xxx.xxx.0.2 valid=10s;
我们通过切换到 HAProxy 解决了这个问题。
另一个问题是使用正确的服务发现格式。
创建一个名为 _ip.xxxxxxx.ecs
的新私有命名空间,并将服务发现名称命名为 _prometheus
。当您在 ecs
.
中创建新服务时,两者都可以实现
当您想在 ECS 中使用内部 DNS 时,Nginx 会出现问题。
我使用HA-Proxy后成功了
它使用 Docker 的 "links" 选项,HA-Proxy 支持使用 /etc/hosts
文件。
首先,使用Docker的"links"选项并设置"environment variables"(例如LINK_APP
、LINK_PORT
)。
其次,将这些"environment variables"填入haproxy.cfg
。
此外,我建议您使用 "dynamic port mapping" 进行 ALB。它使工作更灵活。
taskdef.json:
{
"executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<APP_NAME>_ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "<APP_NAME>-rp",
"image": "gnokoheat/ecs-reverse-proxy:latest",
"essential": true,
"memoryReservation": <MEMORY_RESV>,
"portMappings": [
{
"hostPort": 0,
"containerPort": 80,
"protocol": "tcp"
}
],
"links": [
"<APP_NAME>"
],
"environment": [
{
"name": "LINK_PORT",
"value": "<SERVICE_PORT>"
},
{
"name": "LINK_APP",
"value": "<APP_NAME>"
}
]
},
{
"name": "<APP_NAME>",
"image": "<IMAGE_NAME>",
"essential": true,
"memoryReservation": <MEMORY_RESV>,
"portMappings": [
{
"protocol": "tcp",
"containerPort": <SERVICE_PORT>
}
],
"environment": [
{
"name": "PORT",
"value": "<SERVICE_PORT>"
},
{
"name": "APP_NAME",
"value": "<APP_NAME>"
}
]
}
],
"requiresCompatibilities": [
"EC2"
],
"networkMode": "bridge",
"family": "<APP_NAME>"
}
haproxy.cfg:
global
daemon
pidfile /var/run/haproxy.pid
defaults
log global
mode http
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
bind *:80
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
compression algo gzip
compression type text/css text/javascript text/plain application/json application/xml
default_backend app
backend app
server static "${LINK_APP}":"${LINK_PORT}"
See :
Github : https://github.com/gnokoheat/ecs-reverse-proxy
Docker image : gnokoheat/ecs-reverse-proxy:latest
这里有更多详细信息a solution!
我目前遇到 ECS 服务发现和 Route53 自动命名问题。
我已将服务注册表添加到服务中,所有托管区域记录都将自动填充。 但我似乎无法弄清楚如何使用 NGINX + ngx_upstream_resolveMK.
解析 DNS SRV 记录# DNS RESOLVER
resolver ns-x.awsdns-xx.com valid=10s;
# UPSTREAMS
upstream kibana {
resolveMK servicediscovery.ecs service=kibana;
}
# HOST - kibana.example.com
server {
server_name kibana.example.com;
listen 80;
location / {
proxy_pass https://kibana/;
rewrite ^/(.*)$ / break;
}
}
错误:nginx: [emerg] host not found in upstream "servicediscovery.ecs" in /usr/local/nginx/sites-enabled/kibana.conf:3
看来缺少 A 记录需要解析 "servicediscovery.ecs" 到 Route 53 私有区域。
我需要手动添加吗?或者有没有办法动态添加这条A记录?
我认为这就是问题的原因,但我仍在学习,可能还有很长的路要走。
更新:
我读到你也可以使用 xxx.xxx.xxx.2 通过 AWS VPC 访问 DNS 我已经使用新的解析器进行了测试,但运气不佳。
# DNS RESOLVER
resolver xxx.xxx.0.2 valid=10s;
我们通过切换到 HAProxy 解决了这个问题。
另一个问题是使用正确的服务发现格式。
创建一个名为 _ip.xxxxxxx.ecs
的新私有命名空间,并将服务发现名称命名为 _prometheus
。当您在 ecs
.
当您想在 ECS 中使用内部 DNS 时,Nginx 会出现问题。
我使用HA-Proxy后成功了
它使用 Docker 的 "links" 选项,HA-Proxy 支持使用 /etc/hosts
文件。
首先,使用Docker的"links"选项并设置"environment variables"(例如
LINK_APP
、LINK_PORT
)。其次,将这些"environment variables"填入
haproxy.cfg
。
此外,我建议您使用 "dynamic port mapping" 进行 ALB。它使工作更灵活。
taskdef.json:
{
"executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<APP_NAME>_ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "<APP_NAME>-rp",
"image": "gnokoheat/ecs-reverse-proxy:latest",
"essential": true,
"memoryReservation": <MEMORY_RESV>,
"portMappings": [
{
"hostPort": 0,
"containerPort": 80,
"protocol": "tcp"
}
],
"links": [
"<APP_NAME>"
],
"environment": [
{
"name": "LINK_PORT",
"value": "<SERVICE_PORT>"
},
{
"name": "LINK_APP",
"value": "<APP_NAME>"
}
]
},
{
"name": "<APP_NAME>",
"image": "<IMAGE_NAME>",
"essential": true,
"memoryReservation": <MEMORY_RESV>,
"portMappings": [
{
"protocol": "tcp",
"containerPort": <SERVICE_PORT>
}
],
"environment": [
{
"name": "PORT",
"value": "<SERVICE_PORT>"
},
{
"name": "APP_NAME",
"value": "<APP_NAME>"
}
]
}
],
"requiresCompatibilities": [
"EC2"
],
"networkMode": "bridge",
"family": "<APP_NAME>"
}
haproxy.cfg:
global
daemon
pidfile /var/run/haproxy.pid
defaults
log global
mode http
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
bind *:80
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
compression algo gzip
compression type text/css text/javascript text/plain application/json application/xml
default_backend app
backend app
server static "${LINK_APP}":"${LINK_PORT}"
See :
Github : https://github.com/gnokoheat/ecs-reverse-proxy
Docker image : gnokoheat/ecs-reverse-proxy:latest
这里有更多详细信息a solution!