首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有码头负载平衡的nginx反向代理

具有码头负载平衡的nginx反向代理
EN

Stack Overflow用户
提问于 2017-05-26 07:53:09
回答 1查看 653关注 0票数 1

我想做一个简单的配置,使用Docker技术将nginx作为反向代理。我正在考虑使用以下解决方案:https://hub.docker.com/r/jwilder/nginx-proxy/

我需要实现以下行为:

www.example.com,收到->when请求--它将转到容器A

www.example.com/part,收到->when请求它将转到容器B (不同的容器)

我不太擅长Nginx服务器配置。我知道,在运行我需要代理的其他容器时,我需要传递VIRTUAL_HOST、VIRTUAL_PORT变量,但是我不知道该调整什么,或者传递什么,以便迫使nginx服务器根据位置切换流量。这是Nginx服务器及其位置指令的问题,还是需要调整的其他东西?

提前感谢你在这里花费的宝贵时间和精力。

这里是这个问题的更新--希望我能更准确地描述我的问题所在。嗯,我已经花了很多时间在这个问题上,另外一件事是,我只能在没有人使用系统的晚上才能使用配置。

在我们的环境中,Docker守护进程在RHEL7上运行(Maipo7.3)。我们有两个码头容器,其中一个是基于映像mkodockx/ docker代理的容器:稳定的。请参见下面的配置文件--基本思想是使用开关-e VIRTUAL_HOST=some_host运行每个映像。

我认为我需要找到一种方法来传递另一个环境变量,以获得正确的位置指令;我正在图像中的/app目录中调整/app。

请参见配置文件:

代码语言:javascript
复制
# Generated nginx site conf                        
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
  default $http_x_forwarded_proto;
  ''      $scheme;
}
map $http_upgrade $proxy_connection {
  default upgrade;
  '' close;
}

gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
log_format vhost '$host $remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent"';
access_log off;
error_log /proc/self/fd/2;
client_max_body_size 10m;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

server {
        listen 80 default_server;
        server_name _;
        return 503;
}      
upstream A.B.C.com {    
    server 172.17.0.7:8080;    
}        
server {
    limit_conn perip 50;
    limit_req zone=persec burst=80 nodelay;
    server_name A.B.C.com; 
    location / {
            proxy_pass http://A.B.C.com; 
    }
}        
upstream D.E.F.com {    
    server 172.17.0.16:8080;    
}        
server {
    limit_conn perip 50;
    limit_req zone=persec burst=80 nodelay;
    server_name D.E.F.com; 
    location / {
            proxy_pass http://D.E.F.com; 
    }
}        
upstream G.H.I.com {    
    server 172.17.0.8:80;    
}        
server {
    limit_conn perip 50;
    limit_req zone=persec burst=80 nodelay;
    server_name G.H.I.com; 
    location / {
            proxy_pass http://G.H.I.com; 
    }
}        
upstream J.K.L.com {    
    server 172.17.0.5:80;    
}        
server {
    limit_conn perip 50;
    limit_req zone=persec burst=80 nodelay;
    server_name J.K.L.com; 
    location / {
            proxy_pass http://J.K.L.com; 
    }
}        
upstream M.N.O.com {    
    server 172.17.0.6:80;    
}        
server {
    limit_conn perip 50;
    limit_req zone=persec burst=80 nodelay;
    server_name M.N.O.com; 
    location / {
            proxy_pass http://M.N.O.com; 
    }
}   

以下是我的步骤:

1)我使用docker exec -it代理bash登录容器。

2)然后我使用vim调整了nginx.tmpl文件。

3)然后在容器中运行forego start -r命令

4)然后我检查了生成的default.conf文件- Nginx被自动重新启动。

5)然后我试图验证URL

我的问题是,我需要有另一个容器,它将从URL中为其内容提供服务,假设D.E.F.com/schedule;当前的nginx.tmpl模板只会添加内部容器的IP (172.x.x.x:80),并创建另一个服务器块/部件;我无法指定位置部分。

因此,我提出了我的解决方案(新的nginx模板),它允许指定(传递)另一个变量。但是,最终发生的情况是,新容器的所有内容都是从根("/")而不是从/schedule部件提供的。然而,服务于URL D.E.F.com的现有容器实际上在URD.E.F.com/ content上有它的内容,但是您可能会看到,这个位置并不是在生成的nginx配置中指定的。两个服务器都会自动添加到相同的上游部分。但这意味着,至少根据文件,将有一种负载平衡,而这不是我们所期望的。我在这里感到迷茫。

所以我在这里忽略了什么或者有什么不对?

再次,非常感谢您在这方面花费时间和精力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 13:10:03

它与Nginx配置有很大关系。对于正式的Nginx Docker映像,您需要添加Nginx配置如下:

代码语言:javascript
复制
server {
   listen 80 default_server;
   listen [::]:80 default_server;

   server_name www.example.com;

   location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;

            proxy_pass http://container_A:80;
    }
}

代码语言:javascript
复制
server {
   listen 80 default_server;
   listen [::]:80 default_server;

   server_name www.example.com;

   location /part {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;

            proxy_pass http://container_B:80;
    }
}

这里更棘手的一点是主机container_Acontainer_B。这些是由--name container_A--name container_B标志表示的2个容器,您的必须在用户定义的网络中运行它们,首先通过docker network create <name-of-the-network>创建Docker网络,然后通过指定以下方式在同一个Docker网络中运行每个容器:

docker run .... --network=<name-of-the-network> ....

Docker中的服务发现功能将在用户定义的网络中发现主机container_Acontainer_B这里就是一个例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44196413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档