编辑:塔伦的回答完全符合我的要求。尤金的回答也是一个很好的解决办法。我最终接受了Tarun的答案是正确的,但使用Eugen的。如果您有类似的问题,并且担心其他容器访问nginx状态服务器,请使用Tarun的答案。如果你想要坚持码头的正常主机名计划,使用尤根的。
+++原始问题+++
我有一个应用程序,我构建与对接-撰写。我正在尝试通过DataDog集成监控。我正在使用DataDog的代理容器,到目前为止,一切都正常。我正在尝试通过适应本教程来启动和运行nginx监控。
我的应用程序是在如下所示的坞-撰写文件中定义的:
version: '2'
services:
flask:
restart: always
image: me/flask-app
command: /home/app/flask/start_app.sh
expose:
- "8080"
nginx:
restart: always
build: ./nginx
command: /runtime/start_nginx.sh
ports:
- "80:80"
- "443:443"
expose:
- "81"
volumes:
- app-static:/app-static:ro
links:
- flask:flask
datadog-agent:
image: me/datadog-agent
env_file: ./datadog-agent/dev.env
links:
- flask
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro根据本教程,我向nginx添加了一个服务器块,如下所示:
server {
listen 81;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}使用此配置,我可以从nginx容器中检查nginx状态。到现在为止还好。现在,我想更改位置块中的“允许”指令,以便只允许访问datadog服务。但是,我不知道数据代理的IP。在配置对Flask uwsgi服务器的访问时,我能够使用如下指令:
location / {
uwsgi_pass: flask:8080;
}但是,这似乎不适用于允许指令;如果我尝试:
location /nginx_status {
...
allow datadog-agent;
...
}我得到以下错误:
nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8如何向监视容器安全地公开nginx状态?
发布于 2017-07-27 19:38:08
因为我们是通过docker-compose运行服务的,我们的问题是我们不知道代理的IP。因此,简单的解决方案是在启动之前了解IP。这意味着给我们的代理分配一个特定的IP。
下面是一个更新的docker-compose来实现这一点
version: '2'
services:
flask:
restart: always
image: me/flask-app
command: /home/app/flask/start_app.sh
expose:
- "8080"
nginx:
restart: always
build: ./nginx
command: /runtime/start_nginx.sh
ports:
- "80:80"
- "443:443"
expose:
- "81"
volumes:
- app-static:/app-static:ro
links:
- flask:flask
networks:
agent:
ipv4_address: 172.25.0.101
default:
datadog-agent:
image: me/datadog-agent
env_file: ./datadog-agent/dev.env
links:
- flask
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
networks:
agent:
ipv4_address: 172.25.0.100
networks:
agent:
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24现在你可以做两件事
server {
listen 172.25.0.101:81;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 172.25.0.100;
deny all;
}
}您只能在172.25.0.101上侦听,因为它只能访问在代理网络上运行的容器。此外,还可以添加allow 172.25.0.100,以便只允许代理容器访问该容器。
发布于 2017-07-27 19:20:09
)不同的想法:)
在端口10080 上绑定一个nginx (vhost),另外还绑定-该服务器确实提供了状态位置和所需的内容。
80/443上的服务器也在那里,只有该服务器被绑定/暴露于主机(暴露于外部世界)。
由于datadog是您的坞-网络/服务网络的一部分,它仍然可以访问内部网络中的10080,但没有其他来自外部网络的访问。
防弹,容易-没有附加条件。
发布于 2020-04-17 17:27:04
有两种(更容易)的方法来解决这个问题。
第一个是docker-compose,但由于我已经运行了两年,不使用对接-撰写,我去了第二条路。
第二种方法是带有一系列is的Allow指令。
例:
location /stub_status {
stub_status;
allow 172.18.0.0/16; # This is my local docker IP range
allow 192.168.0.0/16; $ This is my production server IP range
deny all; # deny all other hosts
}我不是安全专家,但大多数情况下,192.168.* IP范围是针对本地网络的,但不确定172.18.*的范围。
要了解更多关于IP范围和CIDR内容的信息,请参阅下面的链接module.html
https://www.ripe.net/about-us/press-centre/understanding-ip-addressing
https://stackoverflow.com/questions/45358188
复制相似问题