node.js - 使用 NGINX 创建反向代理。我错过了什么?

标签 node.js nginx ssl docker-compose reverse-proxy

帮助调试
我一直在尝试使用 NGINX 创建反向代理。现在我只是想让它重定向我本地网络上的流量。我想我已经接近了,但我被困住了。任何建议表示赞赏!
预期的行为是对 http://api.dev.tagnoo.com 的请求将流量路由到一个容器,而 http://app.dev.tagnoo.com将流量路由到另一个。
实际行为是,尽管我的容器正在运行并且 Nginx 似乎正在工作,但我无法访问任何东西。我不知道如何调试它。
重现我的痛苦
我使用以下命令启动容器:docker-compose pull --include-deps $@docker-compose up -d --remove-orphans --build $@我的 docker-compose.yaml 文件看起来像这样

services:
  lb:
    image: nginx:1.19.7-alpine
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./src/nginx.conf:/etc/nginx/nginx.conf
      - ./src/fullchain.pem:/etc/ssl/private/fullchain.pem
      - ./src/privkey.pem:/etc/ssl/private/privkey.pem
    networks:
      default:
        aliases:
          - api.dev.tagnoo.com
          - app.dev.tagnoo.com
          - dev.tagnoo.com

  postgres:
    image: postgres:13.3-alpine
    environment:
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
    volumes:
      - pg-data:/var/lib/postgresql/data
  
  api: &api
    image: 410ventures/tagnoo-api:latest
    environment: &api_environment
      TEST_VAR: 'test123'
      VERSION: development
      WATCH: 1
  
  api-test:
    <<: *api
    command: ["true"]
    environment:
      <<: *api_environment
      TAGNOO_API_URL: http://localhost
      POSTGRES_URL: pg://postgres:postgres@postgres/tagnooTest
      REDIS_KEY_PREFIX: 'api-test:'

  api-app-test:
    <<: *api
    command: ["true"]
    environment:
      <<: *api_environment
      TAGNOO_API_URL: http://api-app-test
      POSTGRES_URL: pg://postgres:postgres@postgres/tagnooAppTest
      WATCH: 1

  app: &app
    image: 410ventures/tagnoo-app:latest
    environment: &app_environment
      VERSION: development
      WATCH: 1
  
  app-build:
    <<: *app
    command: ["true"]

  app-livereload:
    <<: *app
    command: ["true"]

  app-test:
    <<: *app
    command: ["true"]
    environment:
      <<: *app_environment
      TAGNOO_APP_URL: http://localhost
      TAGNOO_API_URL: http://api-app-test

volumes:
  pg-data:
这按预期工作:
container info
我的 nginx.conf文件看起来像这样
events {}

http {   server_tokens off;

  map $http_upgrade $connection_upgrade {
    '' close;
    default upgrade;   }

  proxy_http_version 1.1;   proxy_set_header Connection $connection_upgrade;   proxy_set_header Host $host;   proxy_set_header Upgrade $http_upgrade;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   proxy_set_header X-Forwarded-Proto $scheme;   proxy_set_header X-Real-IP $remote_addr;

  ssl_certificate /etc/ssl/private/fullchain.pem;   ssl_certificate_key /etc/ssl/private/privkey.pem;

  proxy_read_timeout 24h;

  # proxy_pass directives are passed hosts via a $proxy_pass_host variable to   # allow nginx to start up before the hosts are actually available. Putting the   # hosts directly in the proxy_pass directive will fail start up unless all   # hosts are available. A resolver is required to use variables in proxy_pass   # directives, so use the docker internal DNS IP here.   resolver 127.0.0.11;

  server {
    return 301 https://$host$request_uri;   }

  server {
    listen 443 ssl http2;
    server_name app.dev.tagnoo.com;

    location /livereload {
      set $proxy_pass_host app-livereload:35729;
      proxy_pass http://$proxy_pass_host;
    }

    location / {
      set $proxy_pass_host app;
      proxy_pass http://$proxy_pass_host;
    }   }

  server {
    listen 443 ssl http2;
    server_name api.dev.tagnoo.com;

    location / {
      set $proxy_pass_host api;
      proxy_pass http://$proxy_pass_host;
    }   } }
我有 privkey.pemfullchain.pem我的根目录中的文件。我只是使用 openssl 对它们进行了自签名。但我认为如果我忽略 ssl,它仍然适用于我的本地网络。
我试过的
我尝试通过以下方式访问容器(无济于事):
  • http://api.dev.tagnoo.com
  • https://api.dev.tagnoo.com/healthz (我用来测试连接的端点)
  • https://api.dev.tagnoo.com
  • 本地主机:80
  • 0.0.0.0:80

  • 以下是我收到的回复的日志(排名不分先后)
    docker compose logs for lb
    我没有为我的域设置任何 DNS 记录,tagnoo.com ,但我认为这并不重要,因为目前这只是一个本地环境。但我不确定这是否属实。
    此时我找不到有关调试 NGINX 的更多信息。
    概括
    我主要担心我的 NGINX 配置文件没有做它应该做的事情。我也不确定我的 docker-compose 文件是否为反向代理正确设置。
    我的容器正在运行,但它们的反向代理以某种方式被破坏了。请求失败并显示 302301 getaddrinfo ENOTFOUND api.dev.tagnoo.com每当我尝试访问时。
    以下是我对此事的一些疑问:
  • 我还需要做些什么来设置这个反向代理吗?我错过了一步吗?
  • fullchain.pemprivkey.pem归档 NGINX 失败的原因?如果是这样 - 我如何创建这些?
  • docker-compose 配置是否正确?
  • 我该如何进一步调试呢?

  • 任何建议/提示将不胜感激!

    最佳答案

    问题是我还没有设置 A 和 AAAA 记录来将 *.dev 子域解析为 localhost。我添加了这些并为主机创建了一个有效的(非自签名的)证书。

    关于node.js - 使用 NGINX 创建反向代理。我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68218733/

    相关文章:

    javascript - Nestjs 无法解决依赖关系

    node.js - 如何使用Selenium chromedriver而不强制更新?

    ruby-on-rails - connect() 到 unix :/var/run/unicorn. 连接到上游时 sock 失败(111:连接被拒绝)

    ruby-on-rails - 在 Ubuntu 10.04 Lucid box 上使用 Nginx 实时发送 Rails 应用程序

    .htaccess - 显示 https 状态的域 "Masking"

    javascript - 使用 Kong 的安全 api

    javascript - 如何在javascript中将字符串对象转换为json对象

    nginx - 使用 docker 在 nginx 后面运行 Odoo

    python-3.x - 尝试通过 Python 发送电子邮件时出现问题

    perl - 创建新的 Net::SMTP::SSL 对象时无提示失败