Nginx负载均衡与代理
一、代理概述
代理:外卖/中介/中间商 用户无法直接做某些事情,通过中介进行处理,这个中介就是代理
用户--->代理--->web节点,后面只有一个节点,一般使用的是nginx代理功能即可,后面如果有多个节点(也就是集群)的话,需要使用nginx负载均衡功能
二、代理分类
代理分类 | 方向 | 应用 |
---|---|---|
正向代理 | 用户(服务器)--->代理--->外部(某网站) | 服务器通过代理实现共享上网/访问某个网站 |
反向代理 | 用户(app/浏览器)--->代理--->网站服务器(WEB) | 给网站设置个统一入口,后面是网站集群 |
三、极速上手指南
1.环境概述
角色 | 主机名 | ip |
---|---|---|
代理 | lb01 | 10.0.0.5/172.16.1.5 |
web | web01 | 10.0.0.7/172.16.1.7 |
域名 | proxy.cn | |
站点目录 | /app/code/proxy/index.html |
#配置nginx源
[root@lb01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
#安装nginx
[root@lb01 ~]# yum -y install nginx
2.环境准备
2.1 web服务器
#配置代理使用的子配置文件
[root@web01 ~]# cat /etc/nginx/conf.d/proxy.cn.conf
server{
listen 80;
server_name proxy.cn;
root /app/code/proxy;
error_log /var/log/nginx/proxy.cn-error.log notice;
access_log /var/log/nginx/proxy.cn-access.log main;
location /{
index index.html;
}
}
#配置首页文件
[root@web01 ~]# cat /app/code/proxy/index.html
web01.proxy.cn
#测试web服务器
[root@web01 ~]# curl -H Host:proxy.cn http://10.0.0.7
web01.proxy.cn
2.2 lb01代理服务器
不需要配置站点目录,仅仅配置转发即可proxy_pass
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy.cn.conf
server{
listen 80;
server_name proxy.cn;
error_log /var/log/nginx/proxy.cn-error.log notice;
access_log /var/log/nginx/proxy.cn-access.log main;
location / {
proxy_pass http://10.0.0.7;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
#测试代理
[root@lb01 ~]# curl -H Host:proxy.cn http://10.0.0.5
web01.proxy.cn
补充
proxy_pass指令: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
四、代理案例
4.1 web有多个虚拟主机故障案例
故障现象:
web服务器有多个虚拟主机的时候,通过代理访问web出现异常,访问的不是我们想要的虚拟主机
原因:
代理向后端web节点发出请求的时候,请求头中的Host,呗修改成ip地址形式
相当于代理通过ip地址访问web服务器,只显示默认的虚拟主机了
解决:
修改代理到web的请求头,Host部分
proxy_set_header Host $http_host;
server{
listen 80;
server_name proxy.cn;
error_log /var/log/nginx/proxy.cn-error.log notice;
access_log /var/log/nginx/proxy.cn-access.log main;
location / {
proxy_pass http://10.0.0.7; #这一行的作用是,请求传递给指定的节点
proxy_set_header Host $http_host; #加了这一行,就会修改Host,不加的话,传过去就是ip
}
}
补充:
$http_host 是nginx的变量之一,用于取出Host的内容(域名)
4.2 web记录用户真实的ip地址
现象:用户请求经过代理,然后访问web,web服务器没有记录真实的客户端的ip地址,而是记录了代理的ip
解决:
在代理上面修改请求头,最后在web服务器上记录真实的ip地址
proxy_set_header X-Forwarded-For $remote_addr;
server{
listen 80;
server_name proxy.cn;
error_log /var/log/nginx/proxy.cn-error.log notice;
access_log /var/log/nginx/proxy.cn-access.log main;
location / {
proxy_pass http://10.0.0.7;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr; #加了这一行用来记录真实的ip
}
}
补充:
$proxy_add_x_forwarded_for 变量相当于$remote_addr 客户ip地址. 多层代理的时候,会记录每个代理的ip地址.相当于记录了多个$remote_addr XFF头的内容需要通过$http_x_forwarded_for变量获取并写入到日志中. #实际应用: server{ listen 80; server_name nginxconf.cn; error_log /var/log/nginx/nginxconf.cn-error.log notice; access_log /var/log/nginx/nginxconf.cn-access.log main; location / { proxy_pass http://1