在项目中,Nginx 一般会有承担三个角色 :1)静态资源服务器;2)反向代理服务器;3)网关限流器,本文将介绍三个功能。
概述
Nginx 配置文件整体结构如下:
1 | ... #全局块 |
- main 全局块:配置影响 nginx 全局的指令。一般有运行 nginx 服务器的用户组,nginx 进程 pid 存放路径,日志存放路径,配置文件引入,允许生成worker process数等;
- events 块:配置影响 nginx 服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等;
- http 块:可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如 文件引入,mime-type 定义,日志自定义,是否使用 sendfile 传输文件,连接超时时间,单连接请求数等。
- server 块:配置虚拟主机的相关参数,一个 http 中可以有多个 server;
- location 块:配置请求的路由,以及各种页面的处理情况。
不同模块指令关系:server 继承 main, location 继承 server, upstream 既不会继承指令也不会被继承,它有自己的特殊指令。
静态资源服务器
nginx 可以用做 http 静态资源服务器,其配置如下所示:
1 |
|
可以通过 root
或 alias
指令来设置文件的目录,在 nginx 的配置中,alias 目录和 root 目录是有区别的:
- alias 指定的目录是准确的,即 location 匹配访问的 path 目录下的文件直接是在 alias 目录下查找的;
- root 指定的目录是 location 匹配访问的 path 目录的上一级目录,这个 path 目录一定要是真实存在 root 指定目录下的;
- alias 指定的目录后面必须要加上 / 符号;
- alias 目录配置中,location 匹配的 path 目录如果后面不带 /,那么访问的 url 地址中这个 path 目录后面加不加 / 不影响访问,访问时它会自动加上 /;但是如果 location 匹配的 path 目录后面加上 /,那么访问的 url 地址中这个 path 目录必须要加上 /, 访问时它不会自动加上 /, 如果不加上 /, 访问就会失败;
5)root 目录配置中,location 匹配的 path 目录后面带不带 /, 都不会影响访问。
反向代理
nginx 可以作为反向代理服务器,为后端应用提供负载均衡的能力,其配置如下:
1 | http { |
说明:
location
与proxy_pass
path 路径上包含 / , 则真实的路径为移除location
path 的内容,如 url: /app1/hello, 区别的 url: /hello;location
与proxy_pass
path 路径上不包含 / , 则直接转发,如 url: /app1/hello, 区别的 url: /app1/hello;
长连接设置
nginx 可以针对 http 1.1 进行长连接设置。
客户端长连接
默认情况下,nginx 已经自动开启了对客户端连接的长连接支持。一般场景可以直接使用,也可以进行自定义配置:
1 | http { |
后端长连接
nginx 也可以设置跟后端使用保持长连接,其配置如下:
1 | http { |
限流
在 nginx 中可以使用两个模块进行限流配置:
- ngx_http_limit_conn_module: 连接数限流模块;
- ngx_http_limit_req_module: 漏桶算法实现的请求限流模块。
这两个模块 nginx 默认已经安装,不用额外再安装。
limit_conn 用来对某个 KEY 对应的总的网络连接数进行限流,可以按照如 IP、域名维度进行限流。limit_req 用来对某个 KEY 对应的请求的平均速率进行限流,并有两种用法:平滑模式(delay)和允许突发模式(nodelay)。
ngx_http_limit_conn_module
limit_conn 是对某个 KEY 对应的总的网络连接数进行限流。可以按照IP 来限制 IP维度 的总连接数,或者按照服务域名来限制某个域名的总连接数。但是记住不是每一个请求连接都会被计数器统计,只有那些被 Nginx 处理的且已经读取了整个请求头的请求连接才会被计数器统计。
配置实例:
1 | http { |
- limit_conn:要配置存放 KEY 和计数器的共享内存区域和指定 KEY 的最大连接数;此处指定的最大连接数是 1,表示 nginx 最多同时并发处理 1 个连接;
- limit_conn_zone:用来配置限流 KEY、及存放 KEY 对应信息的共享内存区域大小;此处 的KEY 是 “$binary_remote_addr” 其表示 IP 地址,也可以使用如 $server_name 作为 KEY 来限制域名级别的最大连接数;
- limit_conn_status:配置被限流后返回的状态码,默认返回 503;
- limit_conn_log_level:配置记录被限流后的日志级别,默认 error 级别。
ngx_http_limit_req_module
limit_req 是令牌桶算法实现,用于对指定 KEY 对应的请求进行限流,比如按照IP维度限制请求速率。
配置实例:
1 | http { |
- limit_req:配置限流区域、桶容量(突发容量,默认0)、是否延迟模式(默认延迟);
- limit_req_zone:配置限流 KEY、及存放 KEY 对应信息的共享内存区域大小、固定请求速率;此处指定的 KEY 是“$binary_remote_addr” 表示IP地址;固定请求速率使用 rate 参数配置,支持 10r/s 和 60r/m,即每秒 10 个请求和每分钟 60 个请求,不过最终都会转换为每秒的固定请求速率(10r/s 为每 100 毫秒处理一个请求;60r/m,即每 1000 毫秒处理一个请求)。
整体配置
1 | #user nginx; |
工程代码:https://github.com/noahsarkzhang-ts/springboot-lab/tree/main/springboot-nginx
参考: