nginx反向代理服务器
概述
nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件服务器,同时提供了IMAP、POP3、SMTP协议服务。由C语言编写,在BSD-like协议下发行。其特点是占有内存少,并发能力强。中国大陆使用的有:百度京东淘宝等。
反向代理和前向代理服务器的区别:
- 前向代理针对于服务端,代理的是客户端,他使得客户端对服务端不可见。客户端发送请求,被正向代理转发到服务器,服务器回复响应到正想代理(服务器以为响应发送了客户端)
- 反向代理针对于客户端,代理的是服务端,他使得服务端对客户不可见。客户端发送请求,这样做的好处是用户请求过多,服务器会有一个处理的极限。所以使用反向代理服务器接受请求,再用均衡负载将请求分布给多个真实的服务器。既能提高效率还有一定的安全性。
nginx的文件目录
- conf:保存nginx配置文件的目录,修改nginx.conf
- easymall:保存了所有easymall的静态文件
- logs:access.log记录访问nginx的请求,error.log记录启动运行各种错误的日志
负载均衡
负载均衡意义
- 负责调度客户端请求,使其按照最优方式分配到不同的服务器上执行,避免其中某台服务器过载。
- 消除单点失败,这个比较好理解,因为我们有多台服务器,如果其中某一台发生了错误,可以由其他服务器完成请求。
- 通过减少错误返回结果提升用户体验,因为负载均衡可以检查某一台服务器是否存在问题,如果发现存在问题,它就会将请求安排到其他运行良好的服务器上执行,所以用户很少会接到返回失败的错误。
- session持久化( session persistence),这个名词的意思就是在一个session有效期内,将某一个客户端的所有请求都交给同一个服务器执行。这有什么意义呢?假设我们在淘宝上购物,好不容易花了两小时选了两件心仪的宝贝放到了购物车里面,发现添加第三件的时候前两件不见了,那你是不是想问候一下阿里程序员?为什么会这样,因为Http是无状态的,我们使用session维护状态,那假设前两件商品的操作是在Server1上完成的,而第三件商品是在Server2上完成的,那么这种糟糕的情况就出现了,因为Server2第一次接到这个session。
原则
轮询(默认配置)
在配置文件中
upstream nginx中使用的虚拟域名(字符串) {//代表维护的一颗服务器集群的列表
server 服务器1的ip:端口
server 服务器2的ip:端口
server 服务器3的ip:端口
}
server {
linsten 拦截的端口;
server_name 拦截的域名;
location /(/的意思是匹配请求地址过滤掉域名端口后的字符串内容){
proxy_pass:http://楼上的虚拟域名或者不需要重新定义直接写出服务器真实地址;
}
}
权重
配置方式:关键字:down(宕机不访问),weight(权重值)
upstream roundbin{
server 10.9.104.184:8091 weight = 5;
server 10.9.104.184:8092 weight = 1;
server 10.9.104.184:8093 down;
}
其他插件的负载均衡(iphash)=解决session黏着问题
在集群中,客户端访问一旦使用集群tomcat结点的session,会由于nginx这种代理技术的出现,导致每次访问都无法使用上次访问中使用的session对象–session共享引出的问题。也就是说假设你在第一次登陆访问的是购物车模块,采用Server1服务器,第二次的需要访问订单模块,采用Server2服务器,你在Server1登录过但是Server2却不识别Server1的session。
upstream roundbin{
ip_hash;
server 10.9.104.184:8091 weight = 5;
server 10.9.104.184:8092 weight = 1;
server 10.9.104.184:8093 down;
}
根据用户的ip地址,做hash计算(10982),只要ip地址不变hash结果不变,结果转化的二进制进行取余(tomcat个数)%3 [0,1,2];如果0表示t1,1表示t2,2表示t3,ip_hash黏着的意思就是:客户端ip不变,永远访问同一个tomcat;虽然可以解决问题,但是却偏离了负载均衡的本质,使得同一Session访问同一个服务器,降低效率。
nginx的配置详解
location匹配规则
根据location的匹配,具有优先级关系的逻辑,从上到下优先级从高到低
- 精确匹配 location =/images;域名端口后的字符串必须完全等于location匹配路径;
- 有修饰的字符串前缀匹配 location ^~/images;所有字符串路径以images开始的都能匹配
- 无修饰的字符串前缀(匹配一级,不能匹配多级路径)location /images
- 正则匹配,location ~正则表达式;
- 通配,location /
对于包含关系优先级:有修饰的字符串前缀匹配,如果有包含关系的location同时存在,以匹配最大长度的请求url最优先级最高;正则包含关系,location在上的正则表达式优先级比在下配置的高
练习:
server{
80
localhost
location =/images{return 200;}
location ^~/images{return 201;}
location /images{return 202;}
location ^~/images/test{return 203;}
location ~.png$ {return 204;}
location ~.(png|jpg|gif)${return 205;}
location /{return 206;}
}
当输入对应的请求地址后
http://localhost 返回:206
http://localhost/images 返回:200
http://localhost/images/e.png 返回:201
http://localhost/images/test.png 返回:203
http://localhost/user/p.png 返回204
拦截过滤逻辑,将会把匹配的字符串,同域名和端口一起过滤
server{
listen 80;
server_name www.easymall.com;
location /user{
proxy_pass http://127.0.0.1:8090/haha;
}
}
当请求url www.easymall.com/user/query/point;域名端口过滤 /user/query/point,location 匹配上/user /query/point,然后转向服务器 http://127.0.0.1:8090/haha/query/point
动静分离–nginx只处理静态文件
动静分离:主要指的是前后端分离,前端的静态页面文件,交给独立运行服务器处理,后端的tomcat只处理请求的动态数据,没有页面的访问处理逻辑;**nginx作为http服务器,不能处理jsp,但是可以处理所有静态文件访问;可以利用nginx的这个特点将所有静态文件存放到nginx保存,提供访问的响应,**如果有动态的路径需要服务器处理,交给后端服务器tomcat
配置静态文件的管理服务器server
server {
listen 80;
server_name www.staticfile.com;
location / {
#proxy_pass 转发,root可以指向nginx服务器中任意
#的文件地址,配置d://html,所有静态文件访问都可以
#从d盘的html文件夹获取
#过滤拼接,将location之前匹配的所有内容www.#staticfile.com/index.html 替换成root的值D://html/index.html
root D://html;
#默认访问的首页配置
index index.html;
}
}
请转到链接nginx的配置详解