nginx:具有多个服务器指令的上游?

nginx:具有多个服务器指令的上游?

我正在尝试打包 2 个使用 nginx 作为代理的应用程序并将每个配置文件传递到/etc/nginx/conf.d/.

在一个文件中执行此操作(combined.conf)效果很好:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

但是,当拆分成两个文件时,其中一个重定向系统地失败:

  • backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

所以我的问题是:一个http节点可以有两个不同的server子节点吗?

Nginx文档对此只字未提。

其他人似乎成功但这种架构却

Nginx版本是1.1.19-1ubuntu0.1。

谢谢您的建议!

答案1

经过如此反复尝试和测试后,我找到了一种使其工作的方法,并能够为每个应用程序发送一个配置文件。

以下是每个应用程序分发的一个公共文件和一对上游/位置文件:

  • /etc/nginx/conf.d/common-proxies.conf

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    

答案2

一个 http 块可以有多个服务器子块。但是,nginx 选择一个服务器块来处理请求。因此,请求永远不会“看到” backend2 位置,因为它与第一个服务器块匹配。

答案3

这是一个适用于我的基本身份验证的解决方案。

安装所需的软件包以使用 htpasswd 生成密码

sudo yum install httpd-tools        [RHEL/CentOS]
sudo apt install apache2-utils      [Debian/Ubuntu]

使用以下命令创建密码文件

htpasswd -c /home/osboxes/nginx1-auth.htpasswd  admin
htpasswd -c /home/osboxes/nginx2-auth.htpasswd  sysadmin
htpasswd -c /home/osboxes/glances-auth.htpasswd devopsadmin

nginx.conf 文件

    ###############Start-of-Nginx-Config-file #########
    
    events {}
    
    http {
    upstream backend_nginx1 {
        server nginx1;
    }
    upstream backend_nginx2 {
        server nginx2;
    }
    
    upstream backend_glances {
        server glances:61208;
    }
    
    
    
    server {
        listen 7070;
        server_name _;
        location / {
            #//turn on auth for this location
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/nginx1-auth.htpasswd;
            proxy_pass http://backend_nginx1;
        }
    }
    
    server {
        listen 8080;
        server_name _;
        location / {
            #//turn on auth for this location
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/nginx2-auth.htpasswd;
            proxy_pass http://backend_nginx2;
        }
    }
    
    server {
        listen 9090;
        server_name _;
        location / {
            #//turn on auth for this location
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/glances-auth.htpasswd;
            proxy_pass http://backend_glances;
        }
    }
    
    
    }
#Proxy on nginx tcp port
stream {
  upstream postgres {
    server pdb3:5432;
  }
  server {
    listen 5432;
    proxy_pass postgres;
  }
}

现在部署后端 docker 容器,由前端 nginx 负载均衡器提供服务

sudo docker run -d  --name nginx1  nginx

sudo docker run -d  --name nginx2  nginx

Glances 容器是 top/htop 的组合,用于在控制台或 Web 浏览器上获取系统/docker 资源。

sudo docker run -d --restart="always"  -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --name glances docker.io/nicolargo/glances

部署前端 nginx 负载均衡器来为后端服务/容器提供服务

sudo docker run -d --name nginx-reverseProxy  -p 7070:7070 -p 8080:8080 -p 9090:9090 --link nginx1:nginx1 --link nginx2:nginx2 --link glances:glances -v /home/osboxes/nginx.conf:/etc/nginx/nginx.conf -v  /home/osboxes/nginx1-auth.htpasswd:/etc/nginx/nginx1-auth.htpasswd  -v /home/osboxes/nginx2-auth.htpasswd:/etc/nginx/nginx2-auth.htpasswd -v /home/osboxes/glances-auth.htpasswd:/etc/nginx/glances-auth.htpasswd  nginx

相关内容