Nginx初步认识
前言
Nginx是一个Web服务器和反向代理服务器,有着高性能,占用内存低、可扩展性高多功能等等一系列优点
功能:充当反向代理服务器,服务器的负载均衡、支持HTTP/HTTPS协议、内置缓存机制,自由设置缓存时间提高需要时间和减少后端服务器负载、有着安全性:控制访问路径、IP白名单、名单和速率限制。
下载以及初步运行
以Windows为例:
官网下载nginx:下载
因为Nginx初始端口为80,这是所有服务器默认的HTTP端口,在Windows中
会被占用从而打不开,首先我们需要修改默认端口,解压Nginx文件夹后打开Nginx路径下的\nginx-1.26.0\conf\nginx.conf
映入眼帘的是如下配置(去除注释外):
1 | #user nobody; |
其他我们先不管,先把视线放在http
->server
之中,我们可以看到listen
后面跟着80这个数字,listen就是我们想要找到的端口号设置,把这一段修改为任意一个没被占用的端口号即可,我这里修改为90
如下:
1 | server { |
之后我们打开127.0.0.1:90就能看见默认生成的Nginx页面
我们注意到server
之中还有好几个配置名字,这些都是什么意思呢?
首先看到listen
下的server_name
,这个起到设置域名或者IP地址的作用,众所周知localhost就是127.0.0.1,所以我们能在27.0.0.1:90访问到Nginx的初始界面。
server_name
可以使用域名、IP、通配符、正则表达式、default_server
进行匹配,定义服务器的地址,其中default_server修饰是搭配80 或者 443 标记用于指定默认的服务器块,当没有其他服务器块匹配请求的域名时,NGINX将使用这个默认的服务器块 (也可以设置你想展示的默认端口或IP地址 。
接下来就是
1 | location / { |
location
后设置访问的是请求,可以使用正则表达式、通配符、地址、文件等等例如/
就是请求网址根目录,/50x.html
,就是请求127.0.0.1:90/50x.html
,{}
内的参数root
为文件地址,可以是相对路径也可以是绝对地址,index
是主页的搜索范围,例如上面的配置中就是在/html/
找到index.html
或者index.htm
Nginx先判断的并不是请求而是路径,但是可以类似的通过
try_files $uri /test.html;
把路径变为请求,在下面有讲到…如果省略后缀名也可以找出来结果
使用=
号的时候,会精准匹配某个准确的字符串
我们观察到root 也就是路径写着是html
,那么这个html在哪里呢?我们打开Nginx的文件夹中看看
除了这个以外,还有一行error_page 500 502 503 504 /50x.html;
,意思是如果发生了 500、502、503、504状态码错误,就跳转到/50x.html
界面,用来处理页面错误问题。
了解到这些以后我们来自定义一个配置试试看。
添加配置:
1 | location /test { |
注意!修改配置后需要重启Nginx!!!
try_files 正则表达式或者文件名;
加载查询到的第一个结果
结果如下:
编码问题不用在意啦…
配置篇
1.站点配置
以我的一个站点配置为例子
1 | server |
Nginx服务器配置
这里我直接转载Nginx 配置详解 | 菜鸟教程 (runoob.com)
他写的好详细!!!
小小偷个懒
目录结构
1 | ... #全局块 |
- 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 5、location块:配置请求的路由,以及各种页面的处理情况。
1 | ########### 每个指令必须有分号结束。################# |
上面是nginx的基本配置,需要注意的有以下几点:
1、几个常见配置项:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、每个指令必须有分号结束。
代理、正向代理以及反向代理
代理:通过第三方(第一第二方为服务器端和客户端)服务器来进行代理,让服务器端和客户端不直接碰面,从而成功请求响应数据。
正向代理:
forward proxy
代理的是客户端,去和服务器端交互
客户端给代理服务器发送请求,由代理服务器转发给服务器端,并把响应的内容转发回客户端
用处:
突破访问限制
类似vpn,使用不属于本地网络来访问不能访问的地方
提高访问速度
通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
隐藏客户端真实IP
服务器端交互 的是代理服务器而不是客户端,起到了隐藏的作用
反向代理:
reverse proxy
代理的是服务器端,去和客户端交互
作为伪装的服务器端接受请求把请求转发给服务器端,并假装服务器端把真正的服务器响应的数据给客户端
用处:
- 隐藏服务器真实IP
使用反向代理,可以对客户端隐藏服务器的IP地址。
- 负载均衡
反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。
- 提高访问速度
反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
- 提供安全保障
反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
Nginx设置代理
设置 404 页面导向地址
1 | error_page 404 https://www.error.com; #错误页 |
如果我们的代理只允许接受get,post请求方法的一种
1 | proxy_method get; #支持客户端的请求方法。post/get; |
设置支持的http协议版本
1 | proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本 |
设置HTTP2
1 | server { |
在 Nginx 配置中,即使前端使用的是 HTTP/2,与后端服务器的通信通常仍然使用 HTTP/1.1。原因在于,HTTP/2 的主要优点(如多路复用、头部压缩和服务器推送)主要体现在客户端和 Nginx 之间的通信中。Nginx 作为反向代理服务器,可以将前端的 HTTP/2 请求转换为后端的 HTTP/1.1 请求,这样可以确保与后端服务器的兼容性和稳定性。
负载均衡时,某服务器超时/连接失败 时不再请求
例如有俩个服务器A,B,B连接不上了,这个时候再发送给B请求就会超时,等待响应时间长,才把重新请求发给A,可以断开链接
1 | proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒 |
负载均衡时设置异常情况切换下一个服务器
如果使用upstream指令配置一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
1 | proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。 |
状态值可以是:
- error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
- timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
- invalid_header:被代理服务器返回的响应头异常。
- off:无法将请求分发给被代理的服务器。
- http_400,http_500|http_502|http_503|http_504|http_404….:被代理服务器返回的状态码为400,500,502,等。
获取客户端真实信息而不是代理服务器
1 | proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口 www.taobao.com:80 |
反向代理:
和下面的负载均衡一样
1 | location / { |
或
1 | upstream backend { |
基本示例:
1 | location /api/ { |
一张图解释
sequenceDiagram 客户端->>nginx: 请求 nginx->>服务器: 转发 Note right of 客户端: 请求地址:http:localhost/api/xxxxx Note right of nginx: 转发地址:http:localhost/8080/admin/xxxxx
配置大全
1 | include mime.types; #文件扩展名与文件类型映射表 |
负载均衡
用户多的时候,执行业务处理中的服务器免不了高并发,如果只有一个服务器,那么可能导致响应速度慢业务堵塞服务器崩溃等等不好的后果。所以一般会由多个服务器进行业务处理,降低每个服务器的压力。
具体使用
1 | http { |
这样,服务器就有原本的一个服务器支撑业务就变为多个服务器一起进行
轮询 (Round Robin):
默认的算法:例如设置了三个服务器进行负载均衡,则按照顺序一个一个轮流分配请求到每个后端服务器。
例如a、b、c为三个服务器 的编号,现在有一连串的请求到Nginx,那么分配顺序就是:abc abc abc abc abc
权重 (Weight):
1 | upstream backend { |
设置方法就是在IP地址后面加上 weight= 权重值 ,不设置默认为1
如代码所示,a、b、c的权重为3、2、1那么一串请求进入的分配结果为:
aaabbc aaabbc aaabbc
IP 哈希 (IP Hash):
根据客户端 IP 地址的哈希值来分配请求,这样来自同一个客户端的请求会始终被分配到同一个后端服务器。
1 | upstream backend { |
请求的session就不怕被分配到其他的服务器了。
热备(backup)
设置某个 服务器 做当作备用,当全部服务器都故障了,就使用这个备用服务器。
1 | upstream mysvr { |
加入a、b是编号,b是热备,那么请求是这样的aaaaaaaaaa,a 故障了,bbbbbbbbb。
健康检查 (Health Check):
为了确保请求只被分配到正常运行的服务器,可以配置健康检查。
1 | upstream backend { |
三个参数为:
interval=10s:
表示健康检查的时间间隔,即每 10 秒对每个上游服务器进行一次健康检查。fails=3:
表示在标记服务器为不可用之前必须连续失败的健康检查次数。如果服务器连续 3 次健康检查失败,那么它将被认为是不可用的。passes=2:
表示在将服务器标记为可用之前必须连续成功的健康检查次数。如果服务器被标记为不可用,但之后连续 2 次健康检查成功,那么它将被重新标记为可用。
最少连接 (Least Connections):
将请求分配给当前活动连接数最少的服务器,适用于请求处理时间较长的场景。
1 | upstream backend { |
其他配置
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
例如:
1 | upstream mysvr { |
参考
Nginx 反向代理与负载均衡详解 | 菜鸟教程 (runoob.com)
深入理解 http 反向代理(nginx) - 知乎 (zhihu.com)
运维排查篇 | 访问nginx出现403错误 - 知乎 (zhihu.com)