nginx 反向服务器上游名称语法

nginx 反向服务器上游名称语法

如果有人能给我一些帮助,我将不胜感激。我刚刚尝试学习 nginx 反向代理,但遇到了一些有关上游名称语法的问题。

请参考这张照片 图:nginx反向代理服务器结构

当我 curl 192.168.189.140 时,代理服务器显示

  1. [debug] vhost.c(811): [client 192.168.189.140] [strict] 主机名“bbs_server_pools”无效,问题靠近: _serve

  2. [调试] vhost.c(902): [客户端 192.168.189.140] 客户端发送了格式错误的主机头: bbs_server_pools

我将上游名称 bbs_server_pools 更改为 bbs 后,一切正常。这与 nginx 的版本有关还是其他原因?

  1. 错误的 Nginx.conf 文件

    worker_processes  1;
    error_log logs/error.log error;
    
    events {
    worker_connections  1024;
    }
    
    http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                    '$status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    server {
    listen       80;
    server_name  bbs.etiantian.org;
    location / {
         proxy_pass http://bbs_server_pools;   
       } 
    }    
    
    upstream bbs_server_pools {
    server 192.168.189.137:80;
    server 192.168.189.138:80 weight=3;
    }  
    
    
    }
    
  2. 将 bbs_server_pools 更改为 bbs 后,nginx.conf 文件就好了

    worker_processes  1;
    error_log logs/error.log error;
    
    events {
    worker_connections  1024;
    }
    
    http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                    '$status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    server {
    listen       80;
    server_name  bbs.etiantian.org;
    location / {
         proxy_pass http://bbs;   
       } 
    }    
    
    upstream bbs {
    server 192.168.189.137:80;
    server 192.168.189.138:80 weight=3;
    }  
    
    
    }
    

答案1

此错误与 nginx 本身无关(好吧,几乎无关)。它由您的上游后端返回。原因是两个 HTTP 请求标头(包括Host一个总是被重新定义,除非使用proxy_set_header指示:

默认情况下,仅重新定义两个字段:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

Host转发请求的标头值将在您的第一个配置和第二个配置中为。bbs_server_pools但是bbs,主机名的有效字符是从a到 的ASCII 字母、从到 的z数字和连字符 ( )。虽然下划线是 nginx 上游名称的有效字符,但它对主机名无效,这就是您从上游收到错误的原因。通常,最好使用以下方法保留原始请求的标头值09-Host

proxy_set_header Host $host;

(或者$http_host,你可以检查差异这里)。但是,有些情况下您不应该这样做;检查回答以了解有关该主题的更多信息。

相关内容