nginx 反向代理未返回正确的应用端点

nginx reversre proxy not returning the correct app endpoint

我正在 docker 撰写文件上安装 nginx 反向代理以及一些应用程序(网络数据、文件浏览器等)。

我的想法是从我网络之外的计算机调用 url 类似 http://netdata.myserver.com 并指向网络数据。目前它在我执行 http://myserver.com:19999/ 时有效(最终目标是删除子域的端口)。

我在 hosts 文件中有下一个配置:

127.0.0.1 myserver.com # thats not the ip, but you get the idea

所以我在 docker 撰写文件上有 netdata、filebrowser 和 nginx,如下所示:

version: '3'
services:
  netdata:
    image: netdata/netdata
    ports:
      - 19999:19999
    cap_add:
      - SYS_PTRACE
    security_opt:
      - apparmor:unconfined
  filebrowser:
    image: filebrowser/filebrowser
    user: 501:501
    ports:
      - 20001:80
    volumes:
      - volumes and things go here
    restart: unless-stopped

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - default.conf:/etc/nginx/conf.d/default.conf:ro
    environment:
      - NGINX_HOST=myserver.com
      

然后在default.conf我有下一个配置

server {
    server_name netdata.myserver.com;
    location / {
        proxy_pass         http://netdata:19999;
       }
    listen 80;
}

但它没有按预期工作,当我转到 http://netdata.myserver.com 时,我收到“无法访问此站点”但是,如果我转到 http://myserver.com,它会 return netdata为了我;我也不明白为什么。

有人可以帮我解决这个问题吗?谢谢。

我认为这里可能存在几个问题。首先,如果您希望在 Nginx 后面托管两个基于名称的虚拟主机,您将需要两个 server 块(每个块一个)。所以你的 default.conf 文件应该是这样的:

server {
    listen 80;
    server_name myserver.com;
    location / {
        proxy_pass         http://filebrowser:2001
       }
}
server {
    listen 80;
    server_name netdata.myserver.com;
    location / {
        proxy_pass         http://netdata:19999;
       }
}

您还需要能够解析两个主机名,这意味着 您缺少示例 hosts 文件中的一个条目。你需要 类似于:

127.0.0.1 myserver.com netdata.myserver.com

使用此配置,请求 其他 netdata.myserver.com 将由您的 filebrowser 提供服务 容器。 netdata.myserver.com 的请求将由 netdata 容器。

我整理了一个可运行的例子 here 如果有帮助的话。 这将需要一个类似于以下内容的本地 hosts 文件:

127.0.0.1 myserver.com netdata.myserver.com