0

我无法弄清楚启动该站点的 NGINX 配置。

我自己也想不通,还是没有足够的理论依据。也许你可以建议。

env BACKEND_API;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_processes 4;
events {
   worker_connections  1024;
}
   http {
      include mime.types;
      default_type application/octet-stream;
      upstream backend {
         server backend;
      }
   server {
       set_by_lua $backend_url 'return os.getenv("BACKEND_API")';
       listen 80;
       server_name _;
       server_tokens off;
       client_max_body_size 100M; 

       location / {
           root   /www/html;
           index  index.html index.htm;
           try_files $uri $uri/ /index.html;
       }

       location /api {
           try_files $uri @proxy_api;
       }

       location @proxy_api {
           proxy_set_header X-Forwarded-Proto https;
           proxy_set_header X-Url-Scheme $scheme;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $http_host;
           proxy_redirect off;
           proxy_pass $backend_url;   
       } 
   }
  }

我收到一个错误:

frontend        | 2022/02/21 08:29:58 [error] 28#28: *2 no resolver defined to resolve backend, client: 31.176.83.92, server: _, request: "POST /api/auth HTTP/1.1", host: "194.86.154.183", referrer: "http://194.86.154.183/"

你能告诉我在哪里看吗?欢迎任何建议和帮助。

4

2 回答 2

0

当您将后端服务器域名定义为常量字符串时,nginx 会在启动期间解析其 IP 地址。但是当您在后端服务器域名中使用变量时,nginx 在启动时无法解析它,需要进行 DNS 查找以找出它的 IP 地址是什么。为了进行这种查找,它需要一个工作resolver地址。这是一些博客文章的引述:

Linux、POSIX 等仅提供一种从名称获取 IP 的方法:gethostbyname. 如果您花时间阅读手册页(这样做总是安全的... ;))您会意识到解析名称需要做很多事情:打开文件,询问 NIS 或 YP 他们对此有何看法,询问 DNS 服务器(可能有几种不同的方式)。而这一切都是同步的。现在你已经习惯了 nginx 的方式,你知道这有多糟糕,你不想走丑陋的同步方式。因此,忠于自己的 Igor 重新实现了 DNS 查找(请注意,使用内存缓存)只是为了避免调用这种丑陋的阻塞gethostbyname......这就是我们有这个额外resolver指令的原因。是的,编写最快的网络服务器是有代价的……

于 2022-02-21T10:02:09.980 回答
0

在您的 http 块中,以下配置:

upstream backend {
     server backend;
  }

正在引发错误,因为它无法将服务器值解析为backend.

这是文档中上游模块的基本用法

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    
    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
于 2022-02-21T09:34:59.047 回答