1、location匹配
location匹配的就是后面的URI
location匹配的分类和优先级*
1.1精确匹配
location = /
对字符串进行完全匹配,必须完全符合
1.2正则匹配
^~ 前缀匹配,以什么为开头
~ 区分大小写的匹配
~* 不区分大小写的匹配
!~ 区分大小写的取反
!~* 不区分大小写的取反
1.3一般(通用)匹配
location /字符串
1.4优先级
优先级:精确>正则>一般
location=完整路径 > location ^~ > location ~ location ~* > location /部分起始位置 > location /
2、规则
2.1实际网站中的使用规则
网站的首页
location = / {root html;
index index.html index.htm index.php
}
2.2处理静态请求的页面
用来匹配静态页面
location ^~ /static/ {
root /web/static/;
index index.html index.htm;
}
访问图片或者是指定的后缀名
location ~*\.(jpg.gif|png|jpeg|css|php)${
root /web/pictures/;
index index.html index.htm;
}
2.3通用规则,用来转发.phg或者.js的动态请求到后端服务器(数据库)
转发后端请求和负载均衡
location / {
proxy_pass
}
3、rewrite重定向
3.1定义
rewrite就是把当前访问的页面跳转到其他页面
3.2rewrite的工作方式
通过nginx的全局变量或者自定义变量,结合正则表达式和标志位实现url的重定向
3.3nginx的变量
$uri:客户端请求的uri地址
$host:请求的主机名
$http_user_agent:客户端请求的浏览器和操作系统
$http_referer:请求头的referer信息,表示当前页面来源的url
$remote_addr:客户端的ip地址
$remote_port:客户端的端口号
$server_addr:服务端的ip地址
$server_port:服务端的端口号
$request_method:获取客户端请求的方法
$scheme:请求的协议,要么是http要么是https
x_forwarded_for:用来获取请求头当中客户端的真实ip地址。代理服务器添加,在代理服务器当中指示客户端的ip地址。
X-Real-IP:客户端真实的ip地址
nginx.conf
proxy_set_header X-Real-IP $remote_addr
加上这一字段,客户端的真实ip地址就会传递给后端
3.4标志位(flag)
permanent:永久重定向,返回码是301,浏览器地址栏会显示跳转后的URL地址
redirect:临时重定向,返回码是302,浏览器地址栏会显示跳转后的URL地址
break:永久重定向,返回码是301,但是它匹配到规则之后不会再向下匹配其他规则,URL也不会发生变化
last:重定向,但是会继续向下匹配其他的location规则
3.5rewrite的执行顺序
1、server模块的rewrite优先级最高
2、匹配location的规则
3、执行选定的location规则
3.6rewrite的语法
rewrite 正则表达式 跳转后的内容 标志位;
rewrite or internal redirection cycle while processing
在重定向的过程中,使用了last方式进行重定向,但是没有结束语,陷入了死循环,nginx会自动循环10次,last匹配最多只能执行10次,超过10次没有结束,就会停止,然后报错500。
4、实验
4.1基于域名进行跳转
老的不用了,但是依然能够访问,统统跳转到新的域名
server {
listen 80;
server_name www.xy102.com;charset utf-8;
location / {
root html;
if ( $host = 'www.xy102.com') {
rewrite ^/(.*)$ http://www.cj.com/$1 permanent;
}
index index.html;
}
地址的映射
vim /etc/hosts
192.168.230.10 www.xy102.com www.cj.com
输入内容
echo "this is new page" > index.html
访问www.xy102.com就是访问www.cj.com
4.2基于客户端的ip进行跳转
公司有新业务上线,处于测试阶段,其他的ip只能显示维护中,只有192.168.230.10能正常访问
set $rewrite true;
#设置一个变量名rewrite,值是true
#来进行判断ip是否是合法ip
if ( $remote_addr = "192.168.230.10" ) {
set $rewrite false;
}
if ( $rewrite = true) {
rewrite (.+) /error.html;
#重定向,192.168.230.10/error/html
}
location = /error/html {
root html;
}
输入内容
echo "网页维护中!" > error.html
192.168.230.10以外的地址无法访问
5、nginx的正向代理和反向代理
5.1正向代理以及缓存配置
代理:客户端不再是直接访问服务端,通过代理服务器访问服务端
正向代理:面向客户端,我们通过代理服务器的ip地址访问目标服务端
服务端只知道代理服务器的地址,真正的客户端ip可以隐藏
proxy_pass http://192.168.230.20:8080;
#配置代理地址
server {
listen 8888;
server_name localhost;
resolver 8.8.8.8 valid=300 ipv6=off;
#设置dns解析地址,解析器的缓存时间300秒,每300秒重新解析一次,关闭ipv6
resolver_timeout 3s;
#解析超时的时间3秒
proxy_read_timeout 30s;
#读取代理服务器的超时时间,30s,默认是60s.
proxy_send_timeout 30s;
#向服务端发送数据的超时时间是30s,默认是60s.
proxy_connect_timeout 30s;
#和服务器建立连接的超时时间,30s,默认也是60s
charset utf-8;#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass $scheme://$http_host$request_uri;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
#需要把客户端的真实ip,客户端的主机名,客户端的请求方式,服务端的端口,真实的ip地址添加在请求头当中
# 请求转发到$url的地址,通过代理服务器地址可以直接访问百度 http://$url:端口
#设置页面的缓存:
proxy_buffers 256 4k;
#设置缓冲区为256,大小是4k
proxy_max_temp_file_size 0;
#nginx服务器作为代理的时候暂时存放的响应数据的最大临时文件的大小为0,不使用临时文件
proxy_cache_valid 200 302 1m;
#当状态码是200和302时,缓存的有效期是1分钟
proxy_cache_valid 301 1h;
#当状态码是301时,缓存的有效期是1小时
proxy_cache_valid any 1m;
#除了上述的三个状态码。其他的缓存保存时间是1分钟
5.2反向代理
5.2.1定义
正向代理我们是知道代理服务器的地址,也知道我们访问的web服务器
反向代理,客户端还是访问的代理地址,但是具体的访问web服务器是哪一台,我们并不知道
5.2.2作用
请求分配到多个后台服务器上,可分担服务器的负载,提高系统的可用性和稳定性
缓存加速
安全保护
5.2.3四层代理和七层代理之间的区别
正向代理,配置在http模块的server和location
http模块配置的都是七层
七层是应用层,使用的是http协议,可以对请求进行解析和处理,七层代理走的是用户态,应用协议和程序功能。
七层处理速度相对比较慢,但是可以提供更高级的功能和更好的用户体验。
既可以是域名也可以是ip加端口
四层是传输层,ip加端口,请求转发到后端,无法对请求进行深入的解析和处理,只是对请求流量的转发。
四层转发是内核态,内核处理内核转发,所以速度较快
应用场景:
七层代理一般都是对外提供访问,需要对请求进行处理,包括安全、过滤、流量控制等
四层代理一般都是内部使用,不需要对流量、请求做特殊处理
6、配置方法以及负载均衡的算法
反向代理=负载均衡
6.1配置方法
七层只能写在http模块当中,命令upstream。只能在http的大模块中,不能写在server,也不能在location
upstream xy102 {
server 192.168.230.20;
server 192.168.230.30;
}
四次只能写在全局配置当中,不能写在http模块当中,命令stream
6.2负载均衡的算法
6.2.1轮询 round robin
rr:轮询算法是最简单也是最基础的苏娜发,也是默认速发,请求轮流分配到后端服务器
轮询算法适用于后端服务器处理能力相同的情况,访问量不大的情况。默认算法,可以不加
6.2.2加权轮询
在轮询的基础之上,给每个后台服务器设置不同的权重。流量的分配不一定是按照权重比来的。权重高的被转发的概率大,权重低的相对较小
后端服务器的性能有差异,性能高,权重相对更高;性能低,权重相对小一些
语法:weight
6.2.3最小连接数算法
语法:least_conn
会把请求发送到当前连接数较少的后端服务器上
后端服务器处理任务耗时不同的情况,可以避免请求集中在处理能力更强的服务器上
6.2.4ip_hash*
怎么做会话保持?
根据算法计算客户端的ip地址的hash值,然后将请求转发到相应的服务器。
在第一次访问网址时,就会计算出这个hash值,会把请求分到一个服务器,但是下一次客户端如果使用相同的ip地址再次访问,就不会再分配到其他的服务器。除非后台服务器的算法变更,或者后台服务器的数量发生了变化,这时才会更改访问的服务器。
适用场景:高并发,如果客户端进来之后,不停的轮换服务器,反而会加重服务器的负担,固定在一台服务器上,降低了代理服务器的压力,同时也节约了资源。
nginx当中怎么实现会话保持?
ip_hash可以实现会话保持
会话保持就是session,动态页面配置会话
6.2.5URL_hash
根据请求的URL地址来计算hash值,然后再转发。如果每次请求的URL都一样,就会被分配到同一个服务器
转发的地址发生变化,后台服务器清理缓存或者后台服务器的数量发生变化
以上都是在七层当中使用的,四层没有ip_hash和url_hash的算法
7、实验
基于域名实现负载均衡
8、四层代理
配置方式只能在全局模块,算法也比较少,只能是ip+端口
stream {
upstream test {
server 192.168.230.20:8081;
server 192.168.230.30:80;
}
server {
listen 81;
proxy_pass test;
}}