Nginx反向代理Ubuntu配置
Nginx反向代理Ubuntu配置
1.0什么是正向代理
在NAT技术(Network Address Translation)出现之前,所有主机无法直接与外网相连,要想上网,需要连接到一台能够访问外网的Web服务器,再通过这台服务器访问外网。而这台Web服务器就叫做“正向代理服务器”。
现在的“*”技术也是如此,我们把请求发给一台可以连接外面世界的Web服务器,由它转发我们的请求,再将结果返回给我们。这台Web服务器就是“正向代理服务器”。
综上所述:正向代理服务器是客户端和目的服务器之间的一个中介,客户端通过正向代理服务器访问客户端原本无法访问的目标服务器。
2.0什么是反向代理
客户端向一个服务器A提交请求后,服务器A偷偷地去服务器B上获取资源,并返回给客户端。客户端天真地以为数据是服务器A给他的。在这过程中,服务器A称为“反向代理服务器”,服务器B称为反向代理服务器的“后端服务器”。
2.1正向代理反向代理的区别
两者最直观的区别是在用户的角度。“正向代理”是用户使用的技术。用户首先是知道自己要访问的目标服务器是谁,但由于某种原因无法直接访问该目标服务器,因此选择使用正向代理服务器帮忙转发请求。
而“反向代理”是服务器使用的技术。用户向服务器发送请求后,服务器在用户不知情的情况下去其他服务器上获取资源并返回给用户。
2.2反向代理作用
1.为负载过高的源服务减负
2.为地理上分散的区域高效的内容分发(CDN)
3.为包含机密信息的源服务器提供安全屏障
4.为负载过高的源服务器减负
3.0反向代理的工作方式
一般情况下当浏览器有请求时会直接发送这些请求到源服务器。当Traffic Server工作在反向代理模式,它会在这些请求到达源服务器之前就拦截它们。典型的用法是将源服务器的DNS入口(主机名)解析成Traffic Server的IP地址。当Traffic Server被配置为源服务器,浏览器会和Traffic Server连接而非源站。为了避免DNS冲突,源站的主机名和外在DNS主机名必须不同。
下面是Traffic Server处理从客户端浏览器发出的HTTP请求方式:
- 客户端浏览器向名为www.host.com的主机发起一个http请求。Traffic Server以源服务器的角色接收这个请求(源站对外主机名被解析到ATS上)。
- Traffic Server在remap.conf文件中定位映射规则并重新映射这个请求到一个指定的源站(realhost.com)
- Traffic Server建立一个和源站的HTTP连接。
- 如果请求在缓存命中而且内容是有效的,Traffic Server直接从缓存中向客户端发送被请求的对象。否则,Traffic Server从源站获取被请求的对象资源,发送给客户端,同时在缓存中保存一份该对象的拷贝。
4.0Nginx
4.1什么是负载均衡
我们知道,无论单机性能如何优化,始终存在一个上限。而很多极端负载的情况下,单机性能是远远无法满足业务需求的,那么这时候就需要设计一个高性能集群。而负载均衡器就相当于一个任务分配器,将任务分配给各个机器,这种分配任务的算法就是负载均衡算法
4.2什么是Nginx
Nginx是软件负载均衡的一种,即通过软件实现负载均衡。常见的软件负载均衡有Nginx和LVS。Nginx是7层负载均衡,支持HTTP、E-mail协议,性能是万级,一般的Linux服务器上装一个Nginx大概达到5万/秒
4.3Nginx的安装
1.获得管理员权限 su- 输入密码
2.安装Nginx,vim等编辑器
3.克隆虚拟机,克隆出两台应用服务器
4.打开/etc/nginx/nginx.conf分别修改配置文件如下:
负载均衡服务器:
应用服务器:
5.两台应用服务器在root权限下通过mkdir创建文件夹,然后通过touch命令创建index.html,内容按照自己喜好添加
6.重启Nginx服务(可使用systemctl restart nginx或nignx -s reload等,反正哪个有效用哪个)打开负载均衡服务器,输入自己的虚拟ip地址,持续刷新,会发现按照自己的负载均衡算法进行着分配,详细分配情况可以查看/var/log/nginx/access.log
7.结果如下
4.4Nginx upstream块、location块、server块简析
upstream块:
定义了反向代理时应用服务器集群和负载均衡策略
首先 nodes定义了此upstream块的名称
server显而易见代表服务器,后面的是地址端口
最后是负载均衡算法。什么都不加就是最简单的轮询,而如图加个weight就是加权轮询,还有ip_hash,会话保持等,这里不展开说。
location块:
location块是用于匹配的,它会基于Nginx负载均衡服务器收到的请求字符串,URL匹配。
location [=||*|^~] /uri/ { … }
-
= 开头表示精确匹配
- 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
一个server块可以有多个location块,比如:
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
那么http://localhost/匹配A,http://localhost/login匹配B,http://localhost/static/a.png则匹配C,而location匹配的符号优先级是这样的
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求
server块:
server块的用处就是配置一个虚拟主机。
listen 指令监听一个端口,server_name表示服务器名称,location块开始匹配, proxy_pass就是反向代理的地址,而地址正是我前面配置的upstream块服务器集群中的应用服务器。至于root和index,这里并不是必要的,但是在应用服务器中是必要的,如前面所说,收到负载均衡服务器发来的请求后,它开始在以/html为根目录,index index.html index.htm三个文件中匹配。