nginx负载均衡-upstream和proxy模块(1)

Cloud研习社 Cloud研习社 2023-01-10 07:31 发表于北京

收录于合集

#一站式教程195个

#云计算148个

#计算机137个

#nginx37个

#负载均衡8个

nginx部署的yaml文件 nginx dyups_nginx

nginx部署的yaml文件 nginx dyups_负载均衡_02

教程每周二、四、六更新

nginx部署的yaml文件 nginx dyups_nginx_03

前面完成了负载均衡的搭建,但是只是实现了简单的功能。接下来我们就来详细了解和负载均衡相关的两个模块:ngx_http_upstream_module和ngx_http_proxy_module。

带host字段转发

我们先调整web01和lnmp(10.0.0.31)主机的环境(可以参考“基于域名的虚拟主机”章节):

# 修改配置文件
[root@web01 nginx]# cat /etc/nginx/conf.d/domainsite.conf
server {
    listen 80;
    server_name domainsite01.a.com;
    location / {
        root /data/webpage/domainsite01;
        access_log /var/log/nginx/domainsite01.access.log main;
        error_log /var/log/nginx/domainsite01.error.log warn;
    }
}
server {
    listen 80;
    server_name domainsite02.a.com;
    location / {
        root /data/webpage/domainsite02;
        access_log /var/log/nginx/domainsite02.access.log main;
        error_log /var/log/nginx/domainsite02.error.log warn;
    }
}

# 重启nginx以后测试一下效果:
[root@web01 log]# curl domainsite01.a.com
domainsite01 for blog
[root@web01 log]# curl domainsite02.a.com
domainsite02 for news
[root@web01 log]# curl 10.0.0.14
web01

我们再改一下lnmp(10.0.0.31)服务器的nginx配置:

[root@localhost ~]# mkdir -p /data/webpage/domainsite01
[root@localhost ~]# mkdir -p /data/webpage/domainsite02

[root@localhost ~]# echo "domainsite01 for blog" > /data/webpage/domainsite01/index.html
[root@localhost ~]# echo "domainsite02 for news" > /data/webpage/domainsite02/index.html

[root@localhost ~]# cat /etc/nginx/conf.d/domainsite.conf
server {
    listen 80;
    server_name domainsite01.a.com;
    location / {
        root /data/webpage/domainsite01;
        access_log /var/log/nginx/domainsite01.access.log main;
        error_log /var/log/nginx/domainsite01.error.log warn;
    }
}
server {
    listen 80;
    server_name domainsite02.a.com;
    location / {
        root /data/webpage/domainsite02;
        access_log /var/log/nginx/domainsite02.access.log main;
        error_log /var/log/nginx/domainsite02.error.log warn;
    }
    
    
[root@localhost conf.d]# mv default.conf wordpress.conf.bak

# 修改主配置文件
[root@localhost ~]# cat /etc/nginx/nginx.conf
......
http {
......
    include /etc/nginx/conf.d/*.conf; # 修改这一行
}

[root@localhost conf.d]# mv default.conf.bak default.conf
[root@localhost conf.d]# mv lb.conf lb.conf.bak

# 重启nginx以后测试一下效果:
[root@localhost conf.d]# curl domainsite01.a.com
domainsite01 for blog
[root@localhost conf.d]# curl domainsite02.a.com
domainsite02 for news
[root@localhost conf.d]# curl 10.0.0.31
lnmp

接下来修改负载均衡服务器的配置:

[root@lb01 ~]# cat /etc/nginx/conf.d/lb01.conf
upstream backend {
    server 10.0.0.14    weight=1;
    server 10.0.0.31    weight=1;
}

server {
    listen 80;
    server_name domainsite01.a.com;
    location / {
        proxy_pass http://backend;
    }
}

server {
    listen 80;
    server_name domainsite02.a.com;
    location / {
        proxy_pass http://backend;
    }
}

重启nginx后:

[root@lb01 ~]# curl domainsite01.a.com
web01
[root@lb01 ~]# curl domainsite01.a.com
lnmp
[root@lb01 ~]# curl domainsite02.a.com
web01

我们发现,无论怎么请求,返回的结果都和直接使用IP地址请求的结果一样。这是有因为负载均衡收到请求再去后端服务器请求数据的时候,没有把我们请求的域名带过去,而只是用IP地址去请求,如果希望负载均衡通过使用我们提供的域名请求后端服务的话,需要加入proxy_set_header 选项:

[root@lb01 ~]# cat /etc/nginx/conf.d/lb01.conf
upstream backend {
    server 10.0.0.14    weight=1;
    server 10.0.0.31    weight=1;
}

server {
    listen 80;
    server_name domainsite01.a.com;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host; # $host就是请求报文头中host字段的值
    }
}

server {
    listen 80;
    server_name domainsite02.a.com;
    location / {
        proxy_pass http://backend;
      proxy_set_header Host $host; # $host就是请求报文头中host字段的值
    }
}

[root@lb01 ~]# systemctl restart nginx
[root@lb01 ~]# curl domainsite01.a.com
domainsite01 for blog # 我们看到返回了对应的内容
[root@lb01 ~]# curl domainsite02.a.com
domainsite02 for news # 我们看到返回了对应的内容