nginx负载均衡-upstream和proxy模块(1)
Cloud研习社 Cloud研习社 2023-01-10 07:31 发表于北京
收录于合集
#一站式教程195个
#云计算148个
#计算机137个
#nginx37个
#负载均衡8个
教程每周二、四、六更新
前面完成了负载均衡的搭建,但是只是实现了简单的功能。接下来我们就来详细了解和负载均衡相关的两个模块: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 # 我们看到返回了对应的内容