nginx是俄罗斯的一个站点开发的,是一个轻量级的web服务软件,还可以做反向代理,负载均衡器,是一个非常强大的软件,下面,我将实现nginx的反向代理以及负载均衡的效果
实验:两台服务器,一台nginx做反向代理,一台做后端web服务器
在后端的web服务器上,搭建LAMP环境
[root@node1 ~]# yum install php php-mysql mysql-server
将web服务器配置为另一个网段地址,且同时给nginx服务器添加一块与web服务器位于同一个网段的网卡
实验拓扑如下所
其中nginx server上的eth1应该作为211.70.160.0这个网段的网关
为我们的web服务器提供主页,并启动httpd服务
[root@node1 ~]# cat /var/www/html/index.html <h1>this is node1 web test page</h1>
在前端的nginx服务器上,再定义一个server,反向代理到后端
server { listen 80; server_name blog.365lsy.com; location / { #location的路径要与下面的web服务器一致 proxy_pass http://211.70.160.15; } }
首先,还得在当前windows客户端的hosts文件添加如下映射
172.16.30.20 blog.365lsy.com
重新加载nginx配置文件,在浏览器中访问
[root@localhost ~]# service nginx restart
我们查看后端的访问日志,可以发现,都是代理服务器的地址,那么,我们该如何将真正的客户端的ip地址记录到日志中呢?
我们可以在代理服务器向后端发起请求的报文首部中添加客户端真实的ip地址
查看后端服务器记录的日志
从上面的日志可以看出,记录的是nginx服务器的eth1的网卡上的地址
修改配置文件
server { listen 80; server_name blog.365lsy.com; location / { proxy_pass http://211.70.160.15; proxy_set_header X-Real-IP $remote_addr; #添加头部信息 } }
修改httpd服务的日志格式
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 指定X-Real-IP这个头部,并且重启http服务 [root@node1 ~]# service httpd restart
重新加载配置文件后,访问,在查看日志
此时,客户端真实的ip已经记录到上游的httpd服务器的访问日志中去了
如果,此时,前端的请求并发量很大的时候,那我们如何做呢?
后端加一个web服务器,前端做负载均衡,这也是比较好的做法,那,如何实现呢?
我们可以将两个web服务器定义成一个组,拓扑如下所示
我们为后端的服务器提供主页
[root@node2 ~]# cat /var/www/html/index.html <h1>Welcome to web2</h1>
同时修改日志记录格式,将客户端的地址记录到日志文件中
[root@node2 ~]# vim /etc/httpd/conf/httpd.conf #修改如下 LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
重启httpd服务
[root@node2 ~]# service httpd restart
在nginx服务器中定义一个组,在http中定义
upstream webs { server 211.70.160.15; server 211.70.160.16; }
upstream使用的注意事项:
1、只能用于http上下文
2、各server只能直接使用IP或主机名,不要加协议
访问blog.365lsy.com这个域的网页时,调用上面定义的webs组
server { listen 80; server_name blog.365lsy.com; location / { proxy_pass http://webs; #此处进行调用 proxy_set_header X-Real-IP $remote_addr; } }
重新加载配置文件,浏览器中访问
[root@localhost ~]# service nginx reload
刷新后,两个轮询的方式显示
在浏览器中访问时,web1会出现3次,web2会出现2次,node2的web服务下线后,出现的web网页只有node1提供的页面了
如果,此时,后端的两个web都宕机了,那么,用户的访问就没有了,此时,我们要定义sorry server
upstream webs { server 211.70.160.15 ; server 211.70.160.16 ; server 127.0.0.1:8088 backup; #添加本机使用场景 } server { listen 8088; #监听在8088端口上 server_name 127.0.0.1; root /web/sorry; #站点目录 }
为sorry server提供主页面
[root@localhost ~]# mkdir /web/sorry [root@localhost ~]# echo "Sorry, The site is sleep" > /web/sorry/index.html
将后端的两个web服务器停掉
[root@node1 ~]service httpd stop [root@node2 ~]service httpd stop
重新加载配置文件,访问
[root@localhost ~]# service nginx reload
ip_hash:相对于lvs 的sh算法,实现session绑定功能
源地址hash,实现session绑定
修改nginx的配置文件,只修改upstream部分
upstream webs { server 211.70.160.15; server 211.70.160.16; server 127.0.0.1:8088 backup; ip_hash; #添加此处选项 }
加载配置文件,访问,别忘记启动后端的web服务器咯
此时,无论怎么刷新,你的浏览器页面都停止node2的web2服务上,实现了session绑定
只有当node1这个web服务下线,访问的网页才会访问node1上的web服务