Nginx的概述及Location配置

一.什么是Nginx

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善css

Nginx功能丰富,可做为HTTP服务器,也可做为反向代理服务器,支持不少第三方的模块扩展(可以使用openresty进行二次开发)。html

二.Nginx的功能详解

(1)http反向代理:前端

Nginx主要是将请求根据灵活的转发策略进行转发,对外暴露统一的域名,再根据请求的完整URL进行URL重定向,这样能够将同一域名的请求分发到不一样的服务器进行处理,下降了用户根据需求访问不一样URL的操做,同时也能够解决跨域问题。nginx

(2)负载均衡:正则表达式

Nginx同时还能够对后台的集群服务器进行负载均衡,Nginx提供的负载均衡策略有两种大类,一种是内置策略,一种是扩展策略。其中内置策略有:轮询,加权轮询,Ip hash。外置扩展的能够根据需求进行编写。算法

这里简单扩展一下内置的策略:后端

1>轮询,加权轮询:进行简单或者根据权值进行负载请求。但可能会出现有服务器异常后,Nginx依旧不停的分配请求给该服务器(Nginx有本身的健康检测机制,主要为服务心跳)。加权轮询主要是考虑到服务器自己性能,人为的给予权重进行优化处理。跨域

2>Ip hash经过对来源Ip地址进行hash计算,而后将计算出的hash值相同的Ip分配到同一个服务器上。该方案主要解决了分布式部署中session不共享的问题,可是同时也带来了新的问题,负载可能出现不均衡。浏览器

(3)静态服务器:缓存

静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html、css、js)、图片(jpeg、gif、png)、视频文件(flv、mpeg)、其余文件(TXT等任意下载文件),所以Nginx在现阶段先后端分离的状况下,经常用来部署前端项目(本人暂时只部署过Vue项目)。

三.Nginx的配置详解

Nginx的配置文件为nginx.conf。里面主要分为了全局块,events块,http块,server块,location块等五个部分组成。下图能够很好的代表配置文件中各个块的区域位置。
image

1.全局块:配置影响nginx全局的指令。通常有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,容许生成worker process数等。

2.events块:配置影响nginx服务器或与用户的网络链接。有每一个进程的最大链接数,选取哪一种事件驱动模型(异步非阻塞的关键,有兴趣能够单独了解)处理链接请求,是否容许同时接受多个网路链接,开启多个网络链接序列化等。

3.http块:能够嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,链接超时时间,单链接请求数等。

4.server块:配置虚拟主机的相关参数,一个http中能够有多个server。

5.location块:配置请求的路由,以及各类页面的处理状况。
如下是一个简单配置文件的说明:
image
须要注意在upstream XXX{}块中能够配置集群,同时能够配置负载的算法,默认为轮询策略。若是须要添加权值,只须要在对应的ip后面添加weight=XXX便可。若是须要使用Ip hash,就在最后添加一行“ip_hash;”便可。

四.实际配置中遇到的问题

工做中,经常使用的配置主要在server块和location块,由于这两块主要是配置Nginx的反向代理和转发的主要区域。
(1)须要配置http块中的upstream块,这里能够添加对应服务名的集群ip。
image
(2)配置server块中的监听端口(listen)和监听地址(server_name)
image
(3)在配置location的时候有一些规则

首先须要明确一点,location匹配的是Nginx的$request\_uri,而后如下是location匹配种类:
 \=:开头表示精确匹配
 ^~:开头,注意这不是一个正则表达式(是提高优先级的字符串匹配)它的目的是优先于正则表达式的匹配。若是该location是最佳匹配,则再也不进行正则表达式检测。
 ~:开头表示区分大小写的正则匹配;
 ~\*:开头表示不区分大小写的正则匹配
 !~ && !~\*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则
 /:开头为字符串匹配

location匹配顺序:

首先精确匹配\=
 其次匹配^~
 再其次按照配置文件的顺序进行正则匹配
 最后是交给/进行通用匹配
 其中须要注意^~这个匹配,一旦^~字符串匹配成功将再也不进行正则匹 配,当即返回命中的字符串匹配。若是\=先命中,依旧须要判断正则匹配,若是正则匹配命中则返回正则匹配,若是正则匹配未命中就返回\=匹配。全部以前的匹配都没有命中则判断/匹配。同时须要注意,正则匹配是按照location配置的顺序进行匹配,所以正则匹配的顺序相当重要。

(4)经常使用配置指令alias、root、proxy_pass、rewrite、proxy_redirect
1.alias——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向alias配置的路径,如:
image
请求/test/1.jpg(省略了协议和域名),将会返回文件/usr/local/1.jpg。
若是alias配置在正则匹配的location内,则正则表达式中必须包含捕获语句(也就是括号()),并且alias配置中也要引用这些捕获值。如:
image
请求中只要能匹配到正则,好比/img/flower.png或者/resource/img/flower.png,都会转换为请求/usr/local/images/flower.png。

2.root——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向root配置的路径,并把请求路径附加到其后,如:
image
请求/test/1.jpg,将会返回文件/usr/local/test/1.jpg。

3.proxy_pass——反向代理配置,用于代理请求,适用于先后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到proxy_pass配置额URL,是否会附加location配置路径与proxy_pass配置的路径后是否有"/"有关,有"/"则不附加,如:
image
请求/test/1.jpg,将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。

4.rewrite规则会改变部分或整个用户请求中的URL,主要有两个用途:
<1>通知客户端,请求的资源已经换地方了。例如网站改版后添加了www前缀,经过rewrite规则能够将全部请求导向新站点。

<2>控制Nginx中的处理流程。例如当须要动态生成内容时,将请求转发到应用程序服务器。

如下为工做中真实遇到的问题,写法一和写法二的区别
image
区别在于

写法一是将/test1/test2/aaaaa统一转换到/XXX/aaaaa

写法二是将/test1/test2/aaaaa统一转换到/XXX/

其中(.*)$表示n个字符做为变量,$1表示(.*n)$所替换的变量。注意一点,当使用(.\*)$以后的变量替换时不须要在最后面添加?$args。

5.proxy_redirect利用这个指令能够为被代理服务器发出的相对重定向增长主机名,主要是修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段。

相关文章
相关标签/搜索