location匹配的规则和优先级
在nginx当中,匹配的对象一般是URI来匹配
http://192.168.233.62/usr/local/nginx/html/index.html
182.168.233.61/
location匹配的分类:
多个location一旦匹配其中之一,不在匹配其他location
1、精确匹配 location=/{...}
=: 完全相同,一个字错都匹配不到
2、正则匹配 location-/{..}
^- 表示普通字符的前缀匹配,如果匹配成功,不在匹配其他的location
~ 区分大小写的字符匹配
~* 不区分大小写进行匹配
!~ 区分大小写,匹配的取非
!~* 不区分大小写,匹配取非
3、一般匹配 location /
location匹配的优先级:
location= > location ^- > location ~ ~* > location /test1 > location/
分别创建三个目录并放入图片
/data/nginx/static1 /data/nginx/static2 /data/nginx/static3
配置文件
网站配置location的规则怎么做:
1、location = / {}
直接匹配网站的根目录,也就是网站的首页。首页一般都是一个静态的页面,直接匹配可以提高访问速度。
2、处理静态文件的请求,通过前缀或者后缀进行匹配的规则:
location ^- /static {}
location ~* .{jpg|gif|png|jsp|html|php}$ {}
3、通用匹配:一般用来转发包含.php或者.jsp为结尾的动态请求:
location /
proxy_pass http://
重定向
重定向:就是输入的网站之后会跳转到设定的目标网址
rewrite:使用nginx提供的全局变量或者是自己设置的变量,结合正则表达式和标志位实现url/uri重定向
1、更换域名
2、特殊情况,比方说页面需要维护,但是我不想中断服务,可以实现url的跳转,访问正常的服务器。
3、防盗链
www.baidu.com -----------------> www.sina.com
www.baidu.com/test1 ------------------->www.sina.com/test2
rewrite跳转:
1、ngx_http_rewrite_module 支持url重定向
支持条件判断:
if语句,没有else
2、语法配置:
rewrite正则表达式 跳转后的内容 标志位
标志位的类型:
1、permanent:返回码是301,永久重定向
2、redirect: 返回码302,临时重定向
3、break 跳转时不会改变url
break是按照location的规则进行匹配的,匹配到即终止。不属于3**开头的重定向范围之内。
4、last 本条规则匹配完毕之后,继续向下匹配到新的location规则
break和last没有跳转的返回码,属于匹配location的机制。
last一旦陷入死循环,内部循环10次就会停止,然后报错500
500:
一、服务器故障
二、防火墙屏蔽
三、应用的端口没有启动:
1、配置文件写错了
2、有其他应用占用了本服务的端口
3、服务器资源不够,应用无法启动
4、磁盘空间不足
四、last匹配机制导致陷入死循环,10次之后就会报错500
五、检查网络
rewrite /test/(.*)/xy104/$1 redirect
(.*) : 正则表达式匹配的内容进行捕获
/usr/local/nginx/html/test/index.thml
/usr/local/nginx/html/xy104/index.thml
301和302:
301永久重定向:永久性的变更url,搜索引擎的排名和权重会转移到新的url,客户端会保留新的url
302 临时重定向,短期的url变更,一般用在维护时,搜索引擎的排名和权重不会转移到新的url,客户端会继续访问原始的url
1、基于域名的跳转:
www.xy105.com--------------->www.xy104.com
2、基于ip的跳转:
192.168.233.61,这个服务器的网页正在维护,只有本机可以访问,其他主机访问统一显示正在维护中
rewrite ^/(.*)$ http://www.xy104.com/$1 permanent;
匹配$host的路径 www.xy105.com/(.*) -------------> www.xy104.com/$1
3、基于后缀名的跳转:
www.xy105.com/test1/index.php
www.xy104.com
nginx的正向代理,反向代理和nginx内置变量的介绍
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的代理
正向代理:
代理:
访问一个代理的地址---------------> 目标访问的网页
代理:VPN 科学上网
加速
七层代理
反向代理
四层代理
七层代理
四层代理:传输层 ip+端口
七层代理:应用层 http协议
四层代理和七层代理之间的区别:
1、四层代理是基于tcp/ip协议层的代理转发方式,只是基于ip+端口号的形式实现代理
四层代理无法获取http请求中的url信息,只是对数据包进行转发。
四层转发数据包,是有内核进行转发,速度更快。
2、七层代理是通过http协议进行代理转发的方式
处理http的请求和响应
当收到http请求之后,根据代理的方式,把http请求转发到指定的服务器。
可以对http请求进行深入的分析和处理的。可以对请求内容做路由,流量控制,可以内容过滤等等。
七层代理是由应用层处理,用户态来处理,速度相对较慢,但是更安全,更可靠
同时能做四层代理和七层代理的 nginx Haproxy
lvs:只能四层转发
正向代理:
正向代理都是需要对请求进行处理,属于七层代理。
正向代理是面向客户端的,客户端想要访问web服务器,但是客户端的ip地址禁止访问,通过代理的ip地址访问目标的服务器。
服务端只会知道代理服务器的地址,但是不知道客户端的ip地址。
正向代理的特点:
1、代理的ip地址和访问的服务器对客户端来说是已知的
2、后端服务器不知道客户端的ip地址
固定代理
vim /usr/local/nginx/conf/nginx.conf
自动代理
vim zddl.conf
反向代理--------》负载均衡
负载均衡:将四层或者七层的请求分配到多台后端的服务器上。
从而负担整个业务的负载。提高系统的稳定性,也可以提供高可用 (备灾,其中一台后端服务器如果发生故障不影响整体业务)
负载均衡的算法:
round robin 轮询 rr:负载均衡的默认算法,请求轮流分配给后端服务器。
轮询算法适用于后端服务器处理能力相近的情况,默认的算法,可以不加。
加权轮询:weight round robin 轮询的升级版,给每个后端服务器赋予不同的权重
处理能力更强的服务器设置更高的权重
处理能力低的,设置低权重。
高峰时间可以通过这个方法进行流量的优化。
适用于服务器处理能力差异比较大的情况
weight=3
ip_Hash:
当我们访问后端服务器,根据客户端的ip地址,使用hash算法算出ip地址的hash值,然后再把请求发送到相应的后端服务器。
如果客户端访问的ip地址相同,通过hash算法,再一次的请求会被分配到上一次访问的服务器。保证会话的稳定。
负载均衡的会话保持----------》ip_hash
会话保持到期之后,会话中断,重新请求会重新计算hash值。
ip_hasp;
最小连接数(配合加权轮询一块使用):最少链接数的算法可以将请求发送到当前链接比较少的后端服务器。
这种算法适用后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。
least_conn;
weight=3;
URL_HASH: 根据请求当中url地址来计算hash值,如果客户端请求的url相同,客户端的请求就会被分配到同一个服务器上。
后台服务器的数量发生变化,会影响结果(这个讨论无意义)
hash $request_uri consistent;
weight=3;
负载均衡的特点:
1、根据算法把请求分发到不同的服务器
2、客户端访问的是代理地址,响应也是代理服务器响应
3、客户端并不了解后端服务器的情况
4、可以提高安全性,后端服务器是隐藏的
5、负载均衡是有缓存的,可以直接访问缓存提高响应速度
负载均衡的架构:
nginx1 192.168.233.61 代理服务器
nginx2 192.168.233.62 后端1
nginx3 192.168.233.63 后端2
客户端:谷歌浏览器
配置流量分发,主要依靠代理服务器完成的,主要配置在代理服务器完成,配置算法。
七层代理:
upstream:模块仅支持http协议,用来处理http的请求和响应
upstream 只能写在http模块当中。不能在server也不在全局
轮询
http中
location中
加权轮询
http中
ip_hash
最少链接数
URL_HASH
四层代理:
stream:不支持http响应,仅支持tcp和udp,处理数据包的流量分发。
四层代理需要写在全局模块当中
支持 轮询(rr) 加权轮询(weight) 最少链接数(least_conn;)
不支持hash hash不能在四层算法当中使用的