文章目录
- 1 location重定向
- 1.1 概述
- 1.2 rewrite跳转
- 1.3 用例
- 1.4 实验
- 1.4.1 基于域名的跳转
- 1.4.2 基于ip的跳转
- 1.4.3 基于后缀名的跳转
- 2 nginx的代理
- 2.1 nginx内置变量
- 2.2 正向代理
- 2.2.1 固定正向代理
- 2.2.2 自动代理
- 2.3 反向代理
- 2.3.1 负载均衡的算法
- 2.3.2 负载均衡的特点
- 2.3.3 负载均衡的语法
- 2.3.3.1 七层代理
- 2.3.3.2 四层代理
1 location重定向
1.1 概述
重定向:就是输入的网站之后会跳转到设定的目标网址。
使用场景:
1、更换域名
2、特殊情况,比如页面需要维护,但是不想中断服务,可以实现url的跳转,访问正常的服务器。
3、防盗链
1.2 rewrite跳转
rewrite:使用nginx提供的全局变量或者是自定义设置的变量,结合正则表达式和标志位实现url/uri重定向。
-
前提:编译安装时需配置有
ngx_http_rewrite_module
支持url重定向支持条件判断:if语句(没有else)
-
语法配置:
rewrite 正则表达式 跳转后的内容 标志位
-
标志位的类型:
-
permanent
:返回码是301,永久重定向 -
redirect
:返回码302,临时重定向 -
break
:跳转时不会改变urlbreak是按照location的规则进行匹配的,匹配到即终止。返回码是200,不属于3**开头的重定向范围之内。
-
last
:本条规则匹配完毕之后,继续向下匹配新的location规则last一旦陷入死循环,内部循环10次就会停止,然后报错500。
break
和last
没有跳转的返回码,属于匹配location的机制 -
-
500(内部服务器错误)排错:
一、服务器故障
二、防火墙屏蔽
三、应用的端口没有启动
1、配置文件写错了
2、有其他应用占用了本服务的端口
3、服务器资源不够,应用无法启动
4、磁盘空间不足
四、last匹配机制导致陷入死循环,10次之后就会报错500
五、检查网络
1.3 用例
rewrite /test/(.*)/xy104/$1 redirect;
-
(.*)
:正则表达式匹配的内容进行捕获 -
$1
:前面正则表达式捕获的内容/usr/local/nginx/html/test/index.html --------------> /usr/local/nginx/html/xy104/index.html
-
301和302:
- 301永久重定向:永久性的变更url,搜索引擎的排名和权重会转移到新的url,客户端会保留新的url。
- 302临时重定向:短期的url变更,一般用在维护时,搜索引擎的排名和权重不会转移到新的url。客户端会继续访问原始的url。
1.4 实验
1.4.1 基于域名的跳转
http://www.xy105.com --------------> http://www.xy104.com
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;location / {if ($host = 'www.xy105.com') {rewrite ^/(.*)$ http://www.xy104.com/$1 permanent;}root html;index index.html index.htm;}
}nginx -t
systemctl restart nginx.servicevim /etc/hosts
# 本地添加ip域名映射
192.168.159.210 www.xy105.com www.xy104.com
rewrite ^/(.*)$ http://www.xy104.com/$1 permanent;
匹配$host
的路径,即将http://www.xy105.com/(.*) 重定向至http://www.xy104.com/$1
1.4.2 基于ip的跳转
192.168.159.210服务器的网页正在维护,只有本机可以访问,其他主机访问统一显示正在维护中
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;set $rewrite true;#set 设置变量的值,$rewrite的值设置布尔类型的trueif ($remote_addr = '192.168.159.210') {#$remote_addr获取客户端请求的ip地址set $rewrite false;#重新定义rewrite的值是false,不进行重定向}if ($rewrite = true) {rewrite (.+) /error.html;#非192.168.159.210的ip地址,统一跳转到/error.html的页面内容}location = /error.html {root html;}location / {root html;index index.html index.htm;}
}echo "正在维护中" > html/error.html
echo "testing" > html/index.html
systemctl restart nginx.service
1.4.3 基于后缀名的跳转
http://www.xy105.com/test1/index.php
http://www.xy104.com
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;location ~* \.php$ {rewrite ^/(.*)(\.php)$ http://www.xy104.com;root html;index index.html;}
}
2 nginx的代理
常见的代理有VPN
在内网环境中,只有特定的ip地址才可能访问内网的服务(ssh,网页):堡垒机(跳板机)
nginx代理
-
正向代理(七层代理)
- 正向代理的原理:访问一个代理的地址--------------> 目标访问的网页
-
反向代理(四层代理、七层代理)
- 四层(传输层):ip+端口
- 七层(应用层):http协议
四层代理和七层代理之间的区别:
-
四层代理是基于tcp/ip协议层的代理转发方式,只是基于ip+端口号的形式实现代理。四层代理无法获取http请求中的url信息,只是对数据包进行转发。
- 四层转发数据包,是由内核进行转发,速度更快。
-
七层代理是通过http协议进行代理转发的方式
-
处理http的请求和响应,当收到http请求之后,根据代理的方式,把http请求转发到指定的服务器。
-
可以对http请求进行深入的分析和处理的。可以对请求内容做路由,流量控制,可以内容过滤等等。
-
七层代理是由应用层处理,用户态来处理,速度相对较慢,但是更安全,更可靠
-
同时能做四层代理和七层代理的:nginx、Haproxy
LVS:只能做四层转发
2.1 nginx内置变量
-
$uri
:可以获取客户端请求的地址,不包含主机和查询的参数 -
$request_uri
:获取客户端的请求地址,包含主机和查询参数 -
$host
:请求的主机名,客户端----发送请求的url地址 -
$http_user_agent
:获取客户端请求的浏览器和操作系统 -
$remote_addr
:客户端的ip地址(可以隐藏) -
$remote_port
:客户端请求的端口 -
$server_addr
:可以查询到服务端的ip地址 -
$server_port
:服务端的端口号 -
$request_method
:获取客户端的请求方式,get/post -
$scheme
:获取请求的协议 http协议 https -
$request_filename
:获取客户端请求的文件名 -
$document_root
:当前请求的根目录
nginx在配置location匹配时,会使用两个获取头部的内置变量:
-
X-Real-IP
:直接向服务端发送客户端访问的真实ip地址proxy_set_header X-Real-IP $remote_addr;
-
X-Forwarded-For
:传递完整的代理链,只要数据包经过代理,都会被传送nginx,记录所有的代理地址和客户端的真实ip。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
实验:查看nginx内置变量
location / {root html;index index.html index.htm;default_type text/plain;return 200 "test1:$uri\ntest2:$request_uri\ntest3:$host\ntest4:$http_user_agent\ntest5:$remote_addr\ntest6:$remote_port\ntest7:$server_addr\ntest8:$server_port\ntest9:$request_method\ntest10:$scheme\ntest11:$request_filename\ntest12:$document_root";
}
2.2 正向代理
2.2.1 固定正向代理
mkdir /usr/local/nginx/conf.d
vim /usr/local/nginx/conf/nginx.confhttp {include mime.types;default_type application/octet-stream;include /usr/local/nginx/conf.d/*.conf;#添加了这一段之后,可以在conf.d这个目录里面,配置多个conf文件,也可以有其他的配置文件,作为服务的配置文件
}#因为是写在主配置文件nginx.conf的http模块中,所以直接写server模块
server {listen 8888;server_name localhost;resolver 218.2.135.1 valid=300 ipv6=off;#设置dns的解析地址,解析的缓存时间是300秒,每隔300秒重新解析一次resolver_timeout 3s;#设置解析服务的超时3秒proxy_read_timeout 30s;#设置代理服务器读取的超时时间proxy_send_timeout 30s;#代理服务器向后端服务器发送数据的超时时间proxy_connect_timeout 30s;#代理服务器和后端服务器连接的超时时间#固定代理地址set $url "www.baidu.com";location / {proxy_pass http://$url;#请求转发的语句 只要你访问nginx 192.168.233.61------->> www.baidu.com ip+端口 url:8080#正向代理的缓存配置proxy_buffers 256 4k;#设置后端缓存影响的缓冲区为256个,每个大小为4k。proxy_max_temp_file_size 0;#nginx不保存响应数据的临时文件,防止文件过多,占用硬盘空间proxy_cache_valid 200 302 1m;#针对响应码是200和302,缓存的有效期是1分钟proxy_cache_valid 301 1h;#针对响应码是301,缓存的有效期是1小时proxy_cache_valid any 1m;#除了200,301,302以外,其他的响应码都缓存1分钟}
}
2.2.2 自动代理
vim /usr/local/nginx/conf.d/auto_proxy.conf
server {listen 8889;location / {proxy_pass $scheme://$http_host$request_uri;#请求代理的地址自动设置 自动选择协议 http https $http_host 目标主机 $request_uri包含完整的请求的路径proxy_set_header Host $http_host;#在请求头当中传递客户端的host信息proxy_set_header X-Real-IP $remote_addr;#设置客户端的请求当中包含真实的ip地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#传递客户端经过的代理地址proxy_set_header X-Forwarded-Proto $scheme;#传递客户端的请求的协议信息http httpsproxy_set_header X-Forwarded-Host $host;#传递客户端的主机名(IP地址)proxy_set_header X-Forwarded-Port $server_port;#传递给服务端,客户端请求服务端的端口resolver 218.2.135.1;#设置dns地址resolver_timeout 10s;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_cache_valid 200 302 1m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;}
}curl -x http://192.168.159.210:8889 http://www.sina.com
#自动代理只能通过命令行的命令实现
2.3 反向代理
2.3.1 负载均衡的算法
-
轮询:round robin(rr)负载均衡的默认算法,请求轮流分配给后端服务器。
轮询算法适用于后端服务器处理能力相近的情况,默认的算法,可以不加。
-
加权轮询:weight round robin 轮询的升级版,给每个后端服务器赋予不同的权重。
处理能力更强的服务器设置更高的权重。处理能力的低的,设置低权重。
高峰时间可以通过这个方法进行流量的优化。适用于服务器处理能力差异比较大的情况。
-
ip_Hash:当访问后端服务器,根据客户端的ip地址,使用hash算法计算出ip地址的hash值,然后再把请求发送到相应的后端服务器。
如果客户端访问的ip地址相同,通过hash算法,再一次的请求会被分配到上一次访问的服务器。保证会话的稳定。
负载均衡的会话保持通过ip_hash实现。会话保持到期之后,会话中断,重新请求会重新计算hash值。
-
最小连接数:最少连接数的算法可以将请求发送到当前连接比较少的后端服务器。(通常配合加权轮询一块使用)
这种算法适用后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。
-
URL_HASH:根据请求当中url地址来计算hash值,如果客户端请求的url请求相同,客户端的请求会被分配到同一个服务器上。
如果后台服务器的数量发生变化,会影响结果。
2.3.2 负载均衡的特点
- 根据算法把请求分发到不同的服务器。
- 客户端访问的是代理地址,响应也是代理服务器响应。
- 客户端并不了解后端服务器的情况。
- 可以提高安全性,后端服务器是隐藏的。
- 负载均衡是有缓存的,可以直接访问缓存,提高响应速度。
2.3.3 负载均衡的语法
实验架构如下:
nginx1—192.168.159.200—代理服务器
nginx2—192.168.159.210—后端服务器1
nginx3—192.168.159.220—后端服务器2
客户端:浏览器
配置流量分发,主要是依靠代理服务器完成的,主要配置在代理服务器完成,配置算法。
2.3.3.1 七层代理
upstream
:模块仅支持http协议,用来处理http的请求和响应
语法:upstream只能写在http模块当中。不能在server也不在全局。
- 轮询
http {upstream kc {server 192.168.159.210;server 192.168.159.220;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- 加权轮询
http {upstream kc {server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- ip_Hash
http {upstream kc {ip_hash;server 192.168.159.210;server 192.168.159.220;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- 最小连接数
http {upstream kc {least_conn;server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- URL_HASH
http {upstream kc {hash $request_uri consistent;server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
2.3.3.2 四层代理
四层代理必须在nginx安装时配置stream模块
stream
:不支持http协议,仅支持tcp和udp,处理数据包的流量分发
语法:四层代理需要写在全局模块当中
- 轮询
stream {upstream kc {server 192.168.159.210:80;#需要写明端口号server 192.168.159.220:80;}server {listen 81;#需要修改端口号,否则会和http模块中的server模块监听端口冲突proxy_pass kc;}
}
- 加权轮询
stream {upstream kc {server 192.168.159.210:80 weight=100;server 192.168.159.220:80 weight=50;}server {listen 81;proxy_pass kc;}
}
- 最小连接数
stream {upstream kc {least_conn;server 192.168.159.210:80;#需要写明端口号server 192.168.159.220:80;}server {listen 81;#需要修改端口号,否则会和http模块中的server模块监听端口冲突proxy_pass kc;}
}
ip_hash和url_hash不能在四层代理当中使用的。