Docker 内的 Nginx 状态端点 运行

Nginx status endpoint running inside Docker

我是 Nginx 的新手,我 运行 在一个 Docker 容器中为一个简单的网站提供服务。我想添加一个 /health 端点,它只是 returns 状态 200 + 一些任意内容。

我通过添加

/etc/nginx/ 复制并调整了标准 nginx.conf
server {
    location /health {
        return 200 "alive";
    }
}

http 块内的底部。但是当我 运行 Docker 并尝试访问 localhost/health 时,我只得到 no such file or directory。在 localhost 访问网站工作正常。

我也试过复制其他代码块,例如这个:https://gist.github.com/dhrrgn/8650077 但后来我得到 conflicting server name "" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored.

我是否将 location 放在 nginx.conf 中的错误位置?我需要一些特殊的服务器配置吗?有什么问题吗?

问题出在我的 Nginx Docker setup/configuration:我正在使用 nginx:alpine,它的配置文件位于 /etc/nginx/conf.d/。其中,default.conf 定义了 Nginx 的默认配置。因此,我不得不删除 default.conf 并将我的配置复制到那里。在 Dockerfile:

COPY nginx.conf /etc/nginx/conf.d/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

当然我也得在nginx.conf中定义标准路由然后:

server {
    location / {
        root /usr/share/nginx/html;
    }

    location /health {
        return 200 'alive';
        add_header Content-Type text/plain;
    }
}

如果您想在一行中完成而不构建图像,您可以执行以下操作:

#1 创建Nginx.conf 文件

nano /tmp/nginx-tester/nginx.conf

并将以下内容放在那里:

events {}

http {
   server {
       location / {
           root /usr/share/nginx/html;
       }
   
       location /health {
           return 200 '{"status":"UP"}';
           add_header Content-Type application/json;
       }
   }
}

如果你看到,它所做的就是提供一个带有 json 的 http 状态 200,说明状态是 UP

#2 运行 NgInx 图片

只是为了让它在一行中,避免每次都重新创建图像,您可以像这样指定一个卷:

docker run -it --rm -d -p 8077:80 --name nginx-tester -v /tmp/nginx-tester/nginx.conf:/etc/nginx/nginx.conf:ro nginx
  • -it:交互式进程(如shell)
  • --rm: 容器退出时被移除
  • -p 8077:80: hostPort:containerPort
  • --name:容器名称
  • -v: 绑定挂载卷 (fileHost:fileContainer:ReadOnly)
  • nginx: 将要下载的图像 运行

#3 测试一下

您只需转到 server:8077 (这是您在步骤 #2 中指定的端口)

~ > curl http://myserver:8077/health
{"status":"UP"}

通过这种方式您可以更改配置文件,只需执行以下操作:

docker restart nginx-tester

您可以重新加载文件而无需重建映像。