一:反向代理
1.1 什么是反向代理
在互联网请求里,如果外网用户直接对后端的服务器进行访问是非常不安全的;这里使用反向代理,客户将请求发送带代理服务器上,通过代理服务器向后端的服务器完成资源的请求,并且从后端服务器上得到的结果返回给外网用户,就是反向代理
二:正向代理
2.1 什么是正向代理
正向一般是指内网访问外网使用的.例如我们国内访问不了谷歌,我们可以通过一个正向代理服务器,请求发到代理服务器上,代理服务器能访问谷歌,这样由代理去谷歌获取数据,在返回给我们
三:Nginx反向代理配置
3.1 nginx代理配置参数说明
3.1.1 proxy_pass
Syntax: proxy_pass URL; ##将后端web的内网ip+端口填在这个模块里
Default: —
Context: location, if in location, limit_except
http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/
3.1.2 传递给后端服务器的请求头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 用户请求的时候 HOST 的值是 www.cxy.com, 那么代理服务会像后端传递请求的还是 www.cxy.com,为什么要传递这个模板,应该如果一台后端服务器上有多个虚拟站点,而且站点的端口都一样;这样代理服务器只会通过ip+端口访问在后端服务器里/etc/nginx/conf.d/里配置文件排在最前面的那个站点服务;如果加上请求头部信息,就可以代理服务器就可以通过域名去区分虚拟站点
proxy_set_header Host $http_host;
# 将$remote_addr 的值放进变量 X-Real-IP 中, $remote_addr 的值为客户端的 ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3.1.3 代理到后端的TCP连接数,响应,返回等超时时间
#nginx 代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#nginx 代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
#后端服务器数据回传给 nginx 代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
3.1.4 代理缓冲区
#nignx 会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
#设置 nginx 代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
#proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
3.2 Nginx反向代理服务器常用配置
可以直接将配置写入到/etc/nginx/proxy_params里,直接调用
[root@lb01 ~]# cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
然后直接在location配置代理时,调用这个proxy_params
location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}
四:反向代理测试
4.1 配置web01-7上的nginx站点服务
[root@web01-7 conf.d]# cat /etc/nginx/conf.d/www.conf
server {
listen 172.16.1.7:80;
server_name test.cxy.com;
location / {
root /code/test/;
index index.html;
}
}
[root@web01-7 conf.d]# cat /etc/nginx/conf.d/vvv.conf
server {
listen 172.16.1.7:80;
server_name vvv.cxy.com;
location / {
root /code/vvv/;
index index.html;
}
}
[root@web01-7 conf.d]# cat /code/test/index.html
test 01
[root@web01-7 conf.d]# cat /code/vvv/index.html
vvv test
4.2 配置代理服务器lb01上的代理服务
4.2.1 安装nginx
4.2.2 代理lb01的配置
[root@lb01-5 ~]# cat /etc/nginx/conf.d/proxy_web.conf
server {
listen 80;
server_name test.cxy.com;
location / {
proxy_pass http://172.16.1.7:80;
}
}
server {
listen 80;
server_name vvv.cxy.com;
location / {
proxy_pass http://172.16.1.7:80;
}
}
如果只按上述配置之后,当访问test.cxy.com和vvv.cxy.com的时候,访问的都是vvv这个站点,这里没有设置请求头不信息转递,所以代理不知道访问的是哪个,只能通过ip+端口去访问,而这个2个站点目录的端口和ip都是一样的,就是以/etc/nginx/conf.d/下的配置文件谁排在前面谁就优先访问
完整的配置如下
#先创建调用代理参数
[root@lb01-5 ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
#直接在代理配置文件里面调用
[root@lb01-5 ~]# vim /etc/nginx/conf.d/proxy_web.conf
server {
listen 80;
server_name test.cxy.com;
location / {
proxy_pass http://172.16.1.7:80;
include proxy_params; #直接调用参数文件
}
}
server {
listen 80;
server_name vvv.cxy.com;
location / {
proxy_pass http://172.16.1.7:80;
include proxy_params; #直接调用参数文件
}
检查语法,重载nginx
[root@lb01-5 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01-5 ~]# systemctl reload nginx
4.2.3 测试访问
修改window hosts文件 : 10.0.0.5 test.cxy.com vvv.cxy.com
查看web07服务器nginx访问日志
因为代理参数里有设置请求头信息,所以访问日志里面会记录真实访问的ip地址
五:反向负载均衡
5.1 什么是负载均衡
当用户大量访问web服务器的时候,单台服务器肯定难以负荷,我们就会使用多台web服务器组成集群,前端使用Nginx负载均衡,将请求分散打到我们的后端服务器集群中,实现负载的分发,那么会大大提升系统的吞吐率、请求性能、高容灾
5.2 四层负载均衡和七层负载均衡
四层负载均衡指的就是OSI七层模型中的传输层,只需要对客户端请求进行TCP/IP协议的包转发就可以实现负载均衡,通俗的讲就是通过匹配ip地址+端口去分发;
七层负载均衡指的是OSI七层中的应用层,可以通过访问的内容去做负载均衡,可以支持http,https,ftp等协议,现在常用的都是七层负载,因为它可以做很多访问规则,例如可以实现 http 信息的改写、头信息的改写、安全应用规则控制、 URL 匹配规则控制、以及转发、 rewrite等
5.3 反向负载均衡配置语法
Nginx实现负载均衡需要使用到proxy_pass代理模块;通过将客户端的请求代理转发至一组upstream虚拟服务池中
Nginx upstream虚拟配置语法
Syntax: upstream name { ... }
Default: —
Context: http
//upstream例子
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
server {
location / {
proxy_pass http://backend
include proxy_params;
}
}
5.4 配置测试
web01上配置
[root@web01-7 test]# cat /etc/nginx/conf.d/www.conf
server {
listen 172.16.1.7:80;
server_name test.cxy.com;
location / {
root /code/test/;
index index.html;
}
}
web02上配置
[root@web02-8 test]# cat /etc/nginx/conf.d/www.conf
server {
listen 172.16.1.8:80;
server_name test.cxy.com;
location / {
root /code/test/;
index index.html;
}
}
web03上配置
[root@web02-8 test]# cat /etc/nginx/conf.d/www.conf
server {
listen 172.16.1.9:80;
server_name test.cxy.com;
location / {
root /code/test/;
index index.html;
}
}
lb01上的配置
[root@lb01-5 conf.d]# cat /etc/nginx/conf.d/proxy_web.conf
upstream cxy {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name test.cxy.com;
location / {
proxy_pass http://cxy;
include proxy_params;
}
}
测试访问:
修改window hosts文件:10.0.0.5 test.cxy.com
每刷新一次,页面都会轮询到后面三台web服务器
5.5 Nginx负载均衡后端状态
down 当前server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后,服务暂停时间
max_conns 限制最大的接收连接数
配置用法
[root@lb01-5 conf.d]# vim /etc/nginx/conf.d/proxy_web.conf
upstream cxy {
server 172.16.1.7:80 down; #这台服务器不参与服务调度
server 172.16.1.8:80 backup; #这台服务器做为备份服务器,常规不参与调度,当其他服务器出现故障时,参与服务
server 172.16.1.9:80 max_fails=1 fail_timeout=10s; #当请求这台服务器出现1次失败之后,等待10s之后在继续请求
server 172.16.1.10:80 max_conns=1; #只允许一个tcp请求
}
5.6 Nginx负载均衡调度算法
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高
ip_hash 每个请求按访问ip的hash结果分配,这样来自同一个ip固定访问一个后端服务器
url_hash 按照访问url的hash结果来分配请求,是每个url定向到同一个后端服务器
least_conn 最少连接数,哪个机器连接数少就分发那个
weight配置实例
upstream cxy {
server 172.16.1.7:80 ;
server 172.16.1.8:80 ;
server 172.16.1.9:80 weight=5;
}
ip_hash配置实例
upstream cxy {
ip_hash;
server 172.16.1.7:80 ;
server 172.16.1.8:80 ;
server 172.16.1.9:80 ;
}