nginx反向代理
Nginx反向代理
使用Nginx实现Web反向代理功能,实现如下功能:
后端Web服务器两台,可以使用httpd实现
Nginx采用轮询的方式调用后端Web服务器
两台Web服务器的权重要求设置为不同的值
最大失败次数为1,失败超时时间为30秒
方案
使用4台RHEL7虚拟机,其中一台作为Nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.4.5和192.168.2.5,两台Web服务器IP地址分别为192.168.2.100和192.168.2.200。客户端测试主机IP地址为192.168.4.10。
部署实施后端Web服务器
1)部署后端Web1服务器
2台后端服务器web1和web2都装httpd,并提供不同页面来测试,看proxy是否能代理分配成功。
web1
# yum -y install httpd
# echo "192.168.2.100" > /var/www/html/index.html
# systemctl restart httpd
防火墙改为trusted。(克隆的虚拟机默认不开启防火墙,所以不用写)
# firewall-cmd --set-default-zone=trusted
# setenforce 0
web2
# yum -y install httpd
# echo "192.168.2.200" > /var/www/html/index.html
# systemctl restart httpd
防火墙改为trusted。(克隆的虚拟机默认不开启防火墙,所以不用写)
# firewall-cmd --set-default-zone=trusted
# setenforce 0
-------------------------------------------------------------------------------------------------------------
配置Nginx服务器,添加服务器池,实现反向代理功能
1)修改/usr/local/nginx/conf/nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
注意:先注释掉所有的重写地址rewrite,包括if判断!!!
#if ($http_user_agent ~* firefox) {
#rewrite ^/(.*) /firefox/$1;
#}
一定要写在server的上面,没有模版,需要手动敲。
而且不要动原来的括号!!!不能删,而且自己加的括号一定要是偶数!!!
括号{ }如果少了,系统不会报错,只会报错其他的,你根本排查不出来。
... ...
http {
... ...
#gzip on;
upstream webs { #使用upstream定义后端服务器集群,集群名称任意(如webs),一共4行
server 192.168.2.100:80; #使用server定义集群中的具体服务器和端口
server 192.168.2.200:80; #加这行
} #加这行
... ...
server {
listen 80;
server_name www.a.com;
#auth_basic "Input Password:";
#auth_basic_user_file "/usr/local/nginx/pass";
#charset koi8-r;
#access_log logs/host.access.log main;
#rewrite ^/(.*) http://www.tmooc.cn/$1;
location / {
proxy_pass http://webs; #加这行
#要在location括号里加上这句话,且加在root那句话的上面!通过proxy_pass将用户的请求转发给webserver集群!
root html;
index index.html index.htm;
}
#rewrite /a.html /b.html redirect;
}
#if ($http_user_agent ~* firefox) {
#rewrite ^/(.*) /firefox/$1;
# }
}
2)重启nginx服务
# nginx -s reload
-----------------------------------------------------------------------------------------------
3)客户端使用浏览器访问代理服务器测试轮询效果。客户端多次测试访问,可以看到分别是100和200的不同网页。
# curl http://192.168.4.5 #使用该命令多次访问查看效果
192.168.2.200
# curl http://192.168.4.5 #使用该命令多次访问查看效果
192.168.2.100
web1关闭httpd
[root@web1 ~]# systemctl stop httpd
这个时候客户端再测试访问,可以看到是web2的页面200
[root@client ~]# curl http://192.168.4.5
192.168.2.200
[root@client ~]# curl http://192.168.4.5
192.168.2.200
web1再打开httpd
[root@web1 ~]# systemctl start httpd
客户端访问代理服务器测试轮询效果,又可以重新看到分别是100和200的不同网页
# curl http://192.168.4.5
192.168.2.200
# curl http://192.168.4.5
192.168.2.100
----------------------------------------------------------------------------------------------------
配置upstream服务器集群池属性
1)设置失败次数,超时时间,权重。
weight可以设置后台服务器的权重,max_fails可以设置后台服务器的失败次数,fail_timeout可以设置后台服务器的失败超时时间。
# vim /usr/local/nginx/conf/nginx.conf
... ...
http {
... ...
upstream webs {
server 192.168.2.100:80;
server 192.168.2.200:80 weight=2; #weight设置服务器权重值,默认值为1
}
2)重启nginx服务
# nginx -s reload
客户端访问,可以看到显示2次web2提供的页面,1次web1的页面。因为web2的权重是2,就是提供2次服务的意思。
# curl http://192.168.4.5
192.168.2.200
# curl http://192.168.4.5
192.168.2.200
# curl http://192.168.4.5
192.168.2.100
------------------------------------------------------------------------------------------------
(1):配置upstream服务器集群的调度算法
1)设置相同客户端访问相同Web服务器
... ...
http {
... ...
upstream webs {
server 192.168.2.100:80 max_fails=1 fail_timeout=20;
#max_fails设置最大失败次数1,fail_timeout设置失败超时时间,单位为秒,20秒
server 192.168.2.200:80; #weight设置服务器权重值,默认值为1
}
2)重启nginx服务
# nginx -s reload
客户端测试访问,还是正常。
[root@client ~]# curl http://192.168.4.5
web1关闭httpd
[root@web1 ~]# systemctl stop httpd
这个时候客户端再测试访问,可以看到是一直都是web2的页面200
[root@client ~]# curl http://192.168.4.5
192.168.2.200
web1再打开httpd
[root@web1 ~]# systemctl start httpd
客户端访问代理服务器测试轮询效果,20秒后才重新看到分别是100和200的不同网页
# curl http://192.168.4.5
192.168.2.200
# curl http://192.168.4.5
192.168.2.100
---------------------------------------------------------------------------------------------------
(2):配置upstream服务器集群的调度算法
设置相同客户端访问相同Web服务器
upstream webs {
ip_hash; #在括号里添加这句话。通过ip_hash设置调度规则为:相同客户端访问相同服务器。
server 192.168.2.100:80 max_fails=1 fail_timeout=20;
server 192.168.2.200:80;
}
客户端多次访问:可以看到一直是同一个页面。
[root@client ~]# curl http://192.168.4.5