一.什么是Nginx
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,支持很多第三方的模块扩展(可使用openresty进行二次开发)。
二.Nginx的功能详解
(1)http反向代理:
Nginx主要是将请求根据灵活的转发策略进行转发,对外暴露统一的域名,再根据请求的完整URL进行URL重定向,这样可以将同一域名的请求分发到不同的服务器进行处理,降低了用户根据需求访问不同URL的操作,同时也可以解决跨域问题。
(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块等五个部分组成。下图可以很好的表明配置文件中各个块的区域位置。
1.全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2.events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型(异步非阻塞的关键,有兴趣可以单独了解)处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3.http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4.server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5.location块:配置请求的路由,以及各种页面的处理情况。
以下是一个简单配置文件的说明:
需要注意在upstream XXX{}块中可以配置集群,同时可以配置负载的算法,默认为轮询策略。如果需要添加权值,只需要在对应的ip后面添加weight=XXX即可。如果需要使用Ip hash,就在最后添加一行“ip_hash;”即可。
四.实际配置中遇到的问题
工作中,常用的配置主要在server块和location块,因为这两块主要是配置Nginx的反向代理和转发的主要区域。
(1)需要配置http块中的upstream块,这里可以添加对应服务名的集群ip。
(2)配置server块中的监听端口(listen)和监听地址(server_name)
(3)在配置location的时候有一些规则
首先需要明确一点,location匹配的是Nginx的$request\_uri,然后以下是location匹配种类:
\=:开头表示精确匹配
^~:开头,注意这不是一个正则表达式(是提升优先级的字符串匹配)它的目的是优先于正则表达式的匹配。如果该location是最佳匹配,则不再进行正则表达式检测。
~:开头表示区分大小写的正则匹配;
~\*:开头表示不区分大小写的正则匹配
!~ && !~\*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则
/:开头为字符串匹配
location匹配顺序:
首先精确匹配\=
其次匹配^~
再其次按照配置文件的顺序进行正则匹配
最后是交给/进行通用匹配
其中需要注意^~这个匹配,一旦^~字符串匹配成功将不再进行正则匹 配,立即返回命中的字符串匹配。如果\=先命中,依旧需要判断正则匹配,如果正则匹配命中则返回正则匹配,如果正则匹配未命中就返回\=匹配。所有之前的匹配都没有命中则判断/匹配。同时需要注意,正则匹配是按照location配置的顺序进行匹配,因此正则匹配的顺序至关重要。
(4)常用配置指令alias、root、proxy_pass、rewrite、proxy_redirect
1.alias——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向alias配置的路径,如:
请求/test/1.jpg(省略了协议和域名),将会返回文件/usr/local/1.jpg。
如果alias配置在正则匹配的location内,则正则表达式中必须包含捕获语句(也就是括号()),而且alias配置中也要引用这些捕获值。如:
请求中只要能匹配到正则,比如/img/flower.png或者/resource/img/flower.png,都会转换为请求/usr/local/images/flower.png。
2.root——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向root配置的路径,并把请求路径附加到其后,如:
请求/test/1.jpg,将会返回文件/usr/local/test/1.jpg。
3.proxy_pass——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到proxy_pass配置额URL,是否会附加location配置路径与proxy_pass配置的路径后是否有"/"有关,有"/"则不附加,如:
请求/test/1.jpg,将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。
4.rewrite规则会改变部分或整个用户请求中的URL,主要有两个用途:
<1>通知客户端,请求的资源已经换地方了。例如网站改版后添加了www前缀,通过rewrite规则可以将所有请求导向新站点。
<2>控制Nginx中的处理流程。例如当需要动态生成内容时,将请求转发到应用程序服务器。
以下为工作中真实遇到的问题,写法一和写法二的区别
区别在于
写法一是将/test1/test2/aaaaa统一转换到/XXX/aaaaa
写法二是将/test1/test2/aaaaa统一转换到/XXX/
其中(.*)$表示n个字符作为变量,$1表示(.*n)$所替换的变量。注意一点,当使用(.\*)$之后的变量替换时不需要在最后面添加?$args。
5.proxy_redirect
利用这个指令可以为被代理服务器发出的相对重定向增加主机名,主要是修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。