NGINX反向代理和负载均衡
1、nginx简介
Nginx 是⼀个⾼性能的HTTP和反向代理web服务器,核⼼特点是占有内存少,并发能⼒强。
Nginx的应用场景:
●Http服务器(Web服务器)
1、性能⾮常⾼,⾮常注重效率,能够经受⾼负载的考验。
2、⽀持50000个并发连接数,不仅如此,CPU和内存的占⽤也⾮常的低,10000个没有活动的连接才占⽤2.5M的内存。
●反向代理服务器
2、实验规划
角色 | 主机 | ip | 服务 |
反向代理/负载均衡 | lb01 | 61.160.221.186/192.168.122.60 | nginx |
web服务器 | web01 | 192.168.122.56 | nginx |
web服务器 | web02 | 192.168.122.65 | nginx |
测试服务器 | test01 | 连接公网的电脑 | win系统 |
3、反向代理配置
3.1、安装lb01、web03分别安装nginx(默认1.20版本)
yum install -y nginx
3.2、配置web服务器
systemctl start nginx.service
systemctl enable nginx.service
cat > /etc/nginx/conf.d/01.www.oldni.com.conf<<EOF
server {
listen 80;
server_name www.oldni.com;
root /app/code/www;
location / {
index index.html;
}
access_log /var/log/nginx/www_access.log main;
error_log /var/log/nginx/www_error.log notice;
}
EOF
mkdir -p /app/code/www
nginx -t
nginx -s reload
echo "122.60-nginx-proxy-122.56" >/app/code/www/index.html
3.3、配置lb服务器
systemctl start nginx.service
systemctl enable nginx.service
cat > /etc/nginx/conf.d/01.www.oldni.com.conf<<EOF
server {
listen 80;
server_name www.oldni.com;
location / {
proxy_pass http://192.168.122.56:80;
}
access_log /var/log/nginx/www_access.log main;
error_log /var/log/nginx/www_error.log notice;
}
EOF
nginx -t
nginx -s reload
4、测试机上测试
4.1、编辑hosts文件:
4.2、浏览器访问测试:
5、说明:
1、需要关闭防火墙,防止访问不成功
2、反向代理实则是代理访问,就是用户请求反向代理服务器后,反向代理服务器再向web服务器请求,并不是负载均衡的转发请求!!
3、web服务器上的访问日志都是反向代理的访问记录,真正的外网访问日志都要反向代理服务器上
6、需要解决的问题
6.1web服务器上的访问日志全是反向代理服务器的记录,如何能让web服务器就能获取真实用户的访问日志呢?
思路:
1、用户的请求到达反向代理服务器后,反向代理服务器把用户的ip地址保存下来,代理再向web端发请求的时候带上这个ip。
2、到达web端后,web取出请求中的ip并把ip写到日志里
流程:
用户请求访问时数据包里有个请求头,请求头包含:
客户端ip地址:公网IP
Host:www.oldni.com
Uer-Agent:浏览器信息
请求到达反向代理服务器后会添加:X-Forwarded-For信息(通过“proxy_set_header X-Forwarded-For $remote_addr;”实现)[$remote_addr是nginx里的一个变量]后再发给web服务器请求。
客户端ip地址:192.168.122.60(注意变成了lb的ip地址)
Host:www.oldni.com
Uer-Agent:浏览器信息
X-Forwarded-For:用户的IP(这才是重点)
web服务器在nginx日志模块修改(其实nginx日志就是向请求头里取数据):
log_format $http_x_forwarded_for;
操作:
1、修改反向代理服务器的网站配置文件并重启nginx
nginx -t
nginx -s reload
2、测试机访问测试并查看web服务器的访问日志
3、分析访问用户的ip
awk '{print $NF}' /var/log/nginx/www_access.log |sort|uniq -c|sort -nr
6.2、当web端启用了默认的站点(多虚拟机),我们再访问网站就会跳转到默认站点的页面,如何让代理端把正确的请求发给web端?
因为反向代理到的是web服务器的ip地址:“proxy_pass http://192.168.122.56:80;”所以访问的到默认页面。
在反向代理服务器上添加:”proxy_set_header Host $http_host;” 即可解决。
6.3、最终反向代理的最终配置:
7、负载均衡
在web02上配置成和web01一样。只是html文件内容变成
echo "122.60-nginx-proxy-122.65" >/app/code/www/index.html
lb上负载均衡的配置(upstream模块):
优化:因为每个站点配置文件都会这么写,我们可以使用include简化
修改成:
cat /etc/nginx/proxy_params
重启nginx再测试
测试机上测试
因为两台web服务器的权重一样,刷新一次,各访问一次。