1. nginx反向代理
1.1 代理的分类
- 正向代理
- 反向代理
反向代理
(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务
正向代理
敏感,省略了
正向代理和反向代理的区别和区分:
从代理服务器的作用来看 ,正向代理的作用是代理客户端的请求 帮助客户端获取想要的内容。反向代理的作用是 代理企业内部的服务器 接收网络上的请求 并进行负载的分散 降低服务器压力。
1.2 nginx反向代理的算法和参数
1、轮询 rr 全称 round robin
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果
某个后端服务器down掉后,能自动剔除。
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
2、加权轮询(wrr weight round robin)
轮询的加强版,即可以指定轮询比率,weight与访问几率成正比,主要应用于后端服务器异
质的场景下。
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固
定访问一个后端服务器,可以解决session一致问题。
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端
服务器优先分配请求。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
5、url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务
器,主要应用于后端服务器为缓存时的场景下。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
hash $request_url;
hash_method crc32;
}
其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
关于反向代理的几个配置项
- server 负载均衡的真实节点服务器的IP,可以是域名,默认端口是80
- max_fails 定义失败的最大次数
- fail_timeout=10s 在max_fails定义的失败次数后,距离下一次检查的间隔时间,默认10s 检查后可用的话,下次还可以去这个节点
- backup 热备的配置,当前面的节点都失败后,会自动启用热备节点 备用的节点
- down 标志着这台服务器永远不用
- down和backup 都写在fail_timeout配置项后边
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 backup;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
反向代理的几个参数
- proxy_send_timeout表示代理后端服务器的数据回传时间,超过这个时间则断开
- proxy_read_timeout 设置nginx从代理的后端服务器获取信息的时间
- proxy_connect_timeout 表示反向代理与后端节点服务器连接的超时时间
- proxy_buffer_size 设置缓冲区的大小
- proxy_buffers 设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息会放到缓存区
- proxy_busy_buffers_size 64k; 高负荷下缓冲区的大小
- proxy_set_header 设置HTTP请求header项传给后端服务器节点
- proxy_set_header Host $host; 设置头部 添加Host 表示客户端请求的主机
- proxy_set_header Referer $http_referer; 设置头部 添加Referer 值是http_referer 记录当前请求从哪里跳转过来 一般用于防盗链
- proxy_set_header Real-IP $remote_addr; 记录客户端真是ip地址
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1.3 nginx反向代理实战操作
主机情况
角色 | ip |
---|---|
反向代理服务器 nginx | 192.168.20.129 |
web服务器1号 httpd | 192.168.20.133 |
web服务器2号 httpd | 192.168.20.128 |
思路: 使用反向代理服务器代理web1和web2 当有请求到达反向代理服务器时 请求会被分发到后端两个web服务器上 为了让效果更加明显 我们此处使用轮询的调度算法
修改反向代理服务器的配置
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
在server的上一行添加upstream
upstream webcluster {
server 192.168.20.133:80 max_fails=3 fail_timeout=20s;
server 192.168.20.128:80 max_fails=3 fail_timeout=20s;
}
修改默认的location的配置 修改完之后location如下
location / {
root html;
index index.html index.htm;
proxy_pass http://webcluster;
proxy_send_timeout 900s;
proxy_read_timeout 900s;
proxy_connect_timeout 900s;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
启动nginx(如果已经启动过 则reload)
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
^C
[root@localhost ~]# nginx -s reload
访问代理服务器的ip进行测试 可以出现轮询则证明实验成功
2. 动静分离
通过location的设置 可以实现访问资源的动静分离
主机情况
角色 | ip |
---|---|
反向代理服务器 nginx | 192.168.20.129 |
web服务器1号 lamp | 192.168.20.133 |
web服务器2号 nginx | 192.168.20.128 |
说明: 此处我们将基于lamp搭建的论坛 作为动态数据处理的服务器 而web2作为静态数据处理的服务器
web1的论坛的首页如下图
web2的首页如下图
修改代理服务器的配置
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
在默认的location上添加两个location
location ~ \.php$ {
proxy_pass http://192.168.20.133;
}
location ~ \.(html|htm|jpg|png|jpeg)$ {
proxy_pass http://192.168.20.128;
}
经过上述的设置 当代理服务器接收到对html等静态资源的请求时 会转发给20.128 接收到php页面的请求时 会转发给20.133
检测语法并重载nginx
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx -s reload
访问测试 分别访问两种页面 看是否会进行动静分离
http://192.168.20.129/index.html
http://192.168.20.129/index.php