nginx
nginx
ZEROKO14基本介绍
Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和 HTTP缓存。该软件由俄罗斯程序员伊戈尔•赛索耶夫开发的开源框架,由c语言实现,并于2004年首次公开发布。2011年成立同名公司以提供支持服务。2019年3月11日,Nginx公司被F5网络公司以6.7亿美元收购。Nginx是免费的开源软件,根据类BSD许可证的条款发布。
作用
web服务器
解析http协议
反向代理服务器
了解反向代理的概念
邮件服务器
解析邮件相关的协议:pop3/smtp/imap
优点
高并发支持: 单机能够支持10W+的并发连接(取决于内存大小,极限能够到百万),那么在实际生产中也是非常能接近这个数字的,这主要得益于 nginx 在linux 环境下使用了 epol1 I0 多路复用模型。
内存消耗低: 在同类型 web 服务中,nginx 比 apache 占用的内存资源更少,在一般情况下 10K非活跃的 HTTP Keep-Alive 连接在 nginx中仅消耗 2.5M内存。
高扩展性: 低耦合的模块设计,并且有丰富的第三方模块支持。
高可靠性: 经过十几年各种复杂场景和各大公司的生产环境验证,并且 nginx 的架构是由 master 进程和worker 进程组成的,如果 worker 进程出现问题,那么 master 进程可以快速开启一个新的worker 进程提供服务。
经过大批网站检验:
热部署
master和worker的分离设置,可实现7*24小时不间断服务的前提下升级nginx可执行文件
最自由的BSD许可协议
BSD许可协议,即Berkeley Software Distribution license的简称,是由加州大学伯克利分校发布并维护的开源软件许可证。它是自由软件中使用最广泛的许可协议之一。BSD许可协议给予使用者很大的自由,可以自由地使用、修改源代码,也可以将修改后的代码作为开源或专有软件再发布。这种许可证因此而得名,被叫做BSD许可证。
BSD许可协议允许用户免费使用nginx,修改nginx源码再发布
- 淘宝:tengine
| server | Apache | Nginx | Lighttpd |
|---|---|---|---|
| Proxy代理 | 非常好 | 非常好 | 一般 |
| Rewriter | 好 | 非常好 | 一般 |
| Fcgi | 不好 | 好 | 非常好 |
| 热部署 | 不支持 | 支持 | 不支持 |
| 系统压力比较 | 很大 | 很小 | 比较小 |
| 稳定性 | 好 | 非常好 | 不好 |
| 安全性 | 好 | 一般 | 一般 |
| 技术支持 | 非常好 | 很少 | 一般 |
| 静态文件处理 | 一般 | 非常好 | 好 |
| Vhosts虚拟主机 | 支持 | 不支持 | 支持 |
| 反向代理 | 一般 | 非常好 | 一般 |
| Session sticky | 支持 | 不支持 | 不支持 |
Nginx是[[网络编程#多并发服务器|异步非阻塞的事件驱动模型]]
Nginx安装
源码安装方式如下:
1 | nginx工作时候需要依赖三个库(openssl没有版本要求) |
需要安装ssl支持的话,需要
--with-http_ssl_module
测试是否安装成功:
在浏览器中访问[部署了nginx对应的主机的ip地址],如果能看到nginx的欢迎页面表示已经安装成功
apt安装的话,已包含大量常用模块,推荐使用apt方式安装,简单快速
nginx可执行程序路径
1 | /usr/local/nginx/sbin/nginx |
由于nginx安装需要很多模块,源码编译比较麻烦,因此有捆绑了标准 nginx 核心、大量第三方 nginx 模块以及大部分外部依赖项的项目OpenResty
OpenResty® 是一个基于 Nginx 和 LuaJIT 的动态网页服务器,它集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各类设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致且友好的非阻塞响应。
OpenResty® 已经在很多知名的互联网公司(包括阿里巴巴、腾讯和新浪)和许多高流量的网站(例如 weibo.com、taobao.com 和 jd.com)中得到了广泛应用,并得到了越来越多的全球知名互联网公司的青睐。
nginx各种默认路径
在nginx不手动指定各项路径的时候的默认路径详解
Linux
nginx在linux下各种默认目录详解
1 | /usr/local/nginx/ |
Mac
nginx在mac下下各种默认目录详解 (此时location中是root html)
mac上配置文件真正的根目录为:/opt/homebrew/Cellar/nginx/1.25.3/,即配置文件中的相对路径都为相对此地址
root后面跟的如果是
.即root .,则nginx是会去/opt/homebrew/Cellar/nginx/1.25.3/路径下找nginx.conf文件
mac中/opt/homebrew/Cellar/nginx/1.25.3/html/等同于/opt/homebrew/var/www/,互为映射关系
像kali系统,会把/var/www/html映射到/usr/local/nginx/html
Nginx基本命令
启动nginx(需要管理员权限)
1 | 启动 |
关闭nginx
1 | 马上关闭 |
查看nginx配置文件位置并且测试配置文件正确与否使用命令查看: nginx -t
查看nginx的版本: nginx -v
查看nginx的编译配置信息: nginx -V
nginx配置
nginx的配置需要通过nginx.conf文件来配置
配置文件可以通过 nginx -t来查看位置
可以通过 sudo netstat -tuln | grep 端口号查看端口是否正确被监听中
nginx.conf详解
配置文件的组织形式
上图中main模块本身即为最外层,即所有{...}之外就是main模块
- http模块 (这个是协议级别)
- server模块 (每个server模块对应一个web服务器:服务器级别)
- location模块 (用来匹配不同的URI请求,进而对请求做不同的处理和响应:请求级别)
- server模块 (每个server模块对应一个web服务器:服务器级别)
- mail模块 (处理邮件相关的动作)
[重要]常用配置项介绍
1 | user nobody;#启动之后的worker进程属于谁 |
location指令名可以是[[正则表达式|正则表达式]]
服务器要处理的指令如何从url中提取?
例子:http://192.168.10.100:80/login.html
- 去掉协议
http:// - 去掉IP/域名+端口:
192.168.10.100:80 - 剩下的:
/login.html,会去/usr/local/nginx/下找./login.html
全局配置main段详解
1 | 核心参数(其他参数大部分情况下用不到) |
events段
1 | events { |
http段
server段
1 | server { |
| root与alias的区别 | root | alias |
|---|---|---|
| 语法 | root path | alias path |
| 上下文 | http, server, location, if | location |
| 区别 | 将定义路径与URI叠加 | 只取定义路径,末尾一定要加/ |
server_name的匹配规则
1 | # 精确匹配,优先级最高,1 |
location段
| 匹配规则 | 含义 | 示例 | 优先级(1最高) |
|---|---|---|---|
| = | 精确匹配 | location = /pic/ |
1 |
| ^~ | 匹配到即停止搜索 | location ^~ /pic/ |
2 |
| ~ | 正则匹配,区分大小写 | `location ~ .(Jpg | gif)#` |
| ~* | 正则匹配,不区分大小写 | `location ~* .(Jpg | gif)$` |
| !~ | 表示区分大小写不匹配的正则 | 3 | |
| !~* | 表示不区分大小写不匹配的正则 | 3 | |
| 无符号 | 通用匹配,任何请求都会匹配到 | location / |
4 |
| @ | 内部跳转 | location @errorpage |
查找顺序和优先级
- 带有“=”的精确匹配优先
- 没有修饰符的精确匹配
- 正则表达式按照他们在配置文件中定义的顺序
- 带有”^~”修饰符的,开头匹配
- 带有”
“或”*”修饰符的,如果正则表达式与URI匹配 - 没有修饰符的,如果指定字符串与URI开头匹配
| location末尾带与不带/的区别 | ||
|---|---|---|
| 不带/ | location /test | 尝试把test当成目录,如果找不到则找test文件 |
| 带/ | location /test/ | 将test作为目录,如果不存在则直接返回404 |
1 | # 测试样例 |
监控模块
主要用于监控各种连接数
需要模块–with-http_stub_status_module
1 | location /status { |
页面结果解释:
| 状态项 | 含义 |
|---|---|
| Active connections | 当前客户端与Nginx间的TCP连接数,等于下面Reading、Writing、Waiting数量之和 |
| accepts | 自Nginx启动起,与客户端建立过的连接总数 |
| handled | 自Nginx启动起,处理过的客户端连接总数。如果没有超出worker_connections配置,该值与accepts相同 |
| requests | 自Nginx启动起,处理过的客户端请求总数。由于存在HTTP Keep-Alive请求,故requests值会大于handled值 |
| Reading | 正在读取HTTP请求头部的连接总数 |
| Writing | 正在向客户端发送响应数据的连接总数 |
| Waiting | 当前空闲的HTTP Keep-Alive连接总数 |
| 内嵌变量 | |
|---|---|
| 变量名 | 含义 |
| $connections_active | 同Active connections值 |
| $connections_reading | 同Reading值 |
| $connections_writing | 同Writing值 |
| $connections_waiting | 同waiting值 |
nginx语法
nginx模块语法指令
–with-http_rewrite_module
rewrite/return指令
由此模块提供支持: ngx_http_rewrite_module
- rewrite
- 根据指定正则表达式匹配规则,重写URL(其实就是重定向)
- return
- 停止处理请求,直接返回响应码或重定向到其他URL
- 执行return指令后,location中后续指令将不会被执行
rewrite
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Nginx 前要编译安装 PCRE 库
上下文:server, location, if
[格式] rewrite regex replacement [flag]
regex:用来匹配URI的正则表达式。replacement:正则匹配成功后,用来替换URI的字符串。如果该字符串以http://、https://或$scheme开头,则处理将停止,并重定向URI到客户端。flag:是一个可选参数,其有4个候选值。last: 重写后的url发起新请求,再次进入server段,重试location中的匹配(默认为last)break: 直接使用重写后的url,不再匹配其他location中的语句redirect: 返回302临时重定向permanent: 返回301永久重定向
在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记
例子: rewrite ^/(.*) http://www.cjzzc.com/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.cjzzc.com/$1。这里的$1是取前面regex部分括号里的内容结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.cjzzc.com/$1地址上。
return
上下文:server, location, if
该指令可以停止处理并指定的响应码返回给前端。既可以返回文本,也可以重定向URL。
return code [text];- text:响应体内容(如果code是200)
- 例:
return 200 "return 200 HTTP Code";
return code URL;- URL:重定向
- 例:
return 302 /test;
return URL;- URL:直接跟URL的话必须是http/https开头的完整路径
使用案例
1 | location / { |
set指令
由此模块提供支持: ngx_http_rewrite_module
用于定义一个变量
上下文:server,location,if
格式: set $variable value
$variable:为变量的名称,可以看到变量的名称以$符号开头,且不要与nginx预设的全局变量名相同。value:为变量的值,可以是字符串、其他变量或者两者的组合。
如:set $url $scheme://$host:$server_port$request_uri;
$url为客户端发起的完整url
if指令
由此模块提供支持: ngx_http_rewrite_module
上下文: server,location
格式: if (condition) { ... } (if和(之间有一个空格。)
条件表达式condition的形式
- 变量名,如果变量的值为空字符串或”0”,则为false,其他条件为true。
- 使用”=”和”!=”比较变量和字符串是否相等,满足条件则为true,否则为false。
- 判断文件是否存在:
-f和!-f - 判断目录是否存在:
-d和!-d - 使用正则表达式与变量的值进行匹配。变量与正则表达式之间使用
~、~*、!~、!~*,如果正则表达式包含}或;,则整个表达式应该用单引号或双引号括起来。
1 | ~ 正则匹配 (区分大小写) |
在匹配过程中可以引用一些Nginx的全局变量
–with-http_map_module
map指令
1 | map $request_uri $real { |
nginx核心指令
root/alias指令
1 | location /img/ { |
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无
break指令
上下文: server, location, if;
格式: break;
在同一作用域中,中断该指令之后的其他指令,位于其前面的指令配置生效,位于其后面的指令配置则无效。
nginx变量

TCP连接相关变量
1 | #客户端地址,例如192.168.1.1 |
HTTP请求相关变量
1 | #请求包体头部长度 |
Nginx处理请求时相关变量
1 | #请求处理到现在所耗费的时间,单位为秒,例如0.03代表30毫秒 |
Nginx返回响应时相关变量
1 | #响应体中真实内容的大小 |
系统变量
1 | #nginx系统版本 |
时间空间单位
时间单位
- ms:毫秒
- s:秒
- m:分钟
- h:小时
- d:天
- w:周
- M:月
- y:年
空间单位
- k/K:KB
- m/M:MB
- g/G:GB
nginx实用场景
虚拟主机
1 | server { |
静态站点
为了加快网站解析速度,可以将动态资源交给后端服务器,纯前端的静态页面放在系统目录下,交给Nginx来解析。
1 | server { |
反向代理
[[网络编程#反向代理|了解反向代理]]
反向代理是用户客户端访问代理服务器后,被反向代理服务器按照一定的规则从一个或多个被代理服务器中获取响应资源并返回给客户端的代理模式,客户端只知道代理服务器的 IP,并不知道后端服务器的 IP,原因是代理服务器隐藏了被代理服务器的信息。
nginx反向代理可以
- 七层反向代理(应用层)
- 四层反向代理(TCP/UDP代理)
七层反向代理
在配置文件nginx.conf中的http段中,写入如下格式的配置,即可将本地8088端口代理到百度:
1 | server { |
使用nginx做反向代理以支持cors跨域请求访问
1 | location / { |
作用为: 当访问https://xxx.xxx.xxx.xxx:xxxx/https://www.github.com的时候访问的实际上是https://www.github.com的资源,解决了跨域问题
四层反向代理
Nginx除了可以代理HTTP七层流量,还可以代理 TCP/UDP 四层流量,需要使用核心模块 stream,手动编译的话需要在编译配置时增加
--with-stream参数进行编译。
配置文件如下(需写在main段中):
1 | stream { |
负载均衡
当出现高并发大流量的业务场景时,单台后端服务器已无法支撑业务正常运行,需要将请求流量按照一定规则分发到多台服务节点上,即使某个节点宕机,系统依然能够对外正常提供服务,以此来提高系统的性能和稳定性。
支持的协议如下:
upstream模块
用于定义上游模块
upstream及其下层指令说明
| 指令 | 含义 |
|---|---|
| upstream | 段名,中间定义上游服务url |
| server | 定义上游服务地址 |
| zone | 定义共享内存,用于跨worker子进程共享数据 |
| keepalive | 对上游服务启用长连接,每个worker子进程与上游服务器空闲长连接的最大数量(keepalive 16;当同时有5000个请求过来,处理完毕后,会保留16个连接,其他全部关闭) |
| keepalive_requests | 一个长连接可以处理的最多请求个数 |
| keepalive_timeout | 空闲情况下,一个长连接的超时时长,超过后会销毁长连接 |
| hash | 负载均衡算法:哈希 |
| ip_hash | 负载均衡算法:依据ip进行哈希计算 |
| least_conn | 负载均衡算法:最少连接数 |
| least_time | 负载均衡算法:最短响应时间 |
| random | 负载均衡算法:随机 |
server模块
| 参数 | 含义 |
|---|---|
| weight=number | 权重值,默认为1 |
| max_conns=number | 上游服务器的最大并发连接数 |
| fail_timeout=time | 服务器不可用的判定时间(10s内不可用次数达3次,则在这10s内不会再转发给后端,超过10后依然还是会转发过去) |
| max_fails=number | 服务器不可用的检查次数 |
| backup | 备份服务器,仅当其他服务器都不可用时 |
| down | 标记服务器长期不可用,离线维护 |
负载均衡算法
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器
1 | upstream backend { |
加权轮询
指定轮询概率,用于后端服务器性能不均的情况
1 | upstream backend { |
实际案例
1 | #server模块,代理几台服务器就需要几个server模块,同时也需要几个代理模块upstream |
关于上面nginx实现负载均衡的加权轮询算法(WeightedRound-Robin)详解,点击跳转
哈希-hash
- 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值叫哈希值,映射不可逆。
hash $request_uri:根据这个变量的哈希值来负载- 相同统一资源标识符(Uniform Resource Identifier)的请求将始终被路由到相同的后端服务器
1 | upstream backend { |
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,是session共享问题的解决方案之一
1 | upstream backend { |
最少连接数算法
- 从上游服务器挑选一台当前已建立连接数最少的分配请求
- 极端情况下会退化为轮询算法
least_conn:- 多个worker子进程同时处理请求时,无法共享后端服务器的连接数状态,此时需要开辟共享内存空间,用来在多个worker子进程中共享信息
- zone zone_name 1M,指定开辟共享内存的大小
1 | upstream backend { |
对上游服务器返回异常时的处理
主要有这三个关键词可以设置
proxy_next_upstream
含义是:proxy_next_upstream配置的这些情况下执行失败转发,如果不配置proxy_next_upstream,当遇到上游返回http错误码时,nginx会直接返回给客户端.
语法: proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 http_429 non_idempotent off;
默认值:proxy_next_upstream error timeout
上下文:http, server, location
| 可选参数 | 含义 |
|---|---|
| error | 向后端服务器传输请求,或读取响应头「出错」时(服务器宕机会转发到下一台) |
| timeout | 向后端服务器传输请求,或读取响应头「超时」时(proxy_read_timeout设置的时间内没有接收完响应体,则会转发到下一台服务器;但是服务器宕机的话会返回502,不会转发下一台) |
| invalid_header | 后端返回无效的响应时 |
| http_500、502、503、504、403、404、429 | http响应状态为xxx时 |
| non_idempotent | 非幂等请求失败时,是否需要转发下一台后端服务器(不设置就是不转发,如post请求时,如果命中404,则会直接返回404。对于写操作最好不要轻易设置) |
| off | 禁用请求失败转发功能 |
案例
1 | worker_processes 1; |
上面的案例中:如果访问localhost:8080/test,会因为负载均衡访问上游服务器localhost:8001,localhost:8002,localhost:8003其中一个,但是由于设置了proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 http_429; 即设置的上述情况不会走负载均衡的转发,因此访问localhost:8080/test始终会在多次转发下最终访问的是localhost:8002
proxy_next_upstream_timeout
含义:超过该时间不再尝试失败转发
语法: proxy_next_upstream_timeout time
默认值:proxy_next_upstream_timeout 0
含义为:如果nginx在向上游服务器发送请求时,如果连接超时时间超过了0,nginx将不会尝试将请求转发到下一个上游服务器,而是立即返回一个失败响应(通常是502 Bad Gateway)给客户端
上下文:http, server, location
proxy_next_upstream_tries
含义:设置最大尝试转发次数,超过转发次数依旧失败则错误码直接返回给客户端
语法: proxy_next_upstream_tries number
默认值:proxy_next_upstream_tries 0 (一直转发)
上下文:http, server, location
异常处理样例
1 | upstream backend { |
HTTPS加密传输
HTTPS 通过加密通道保护客户端与服务端之间的数据传输,已成为当前网站部署的必选配置。在部署有 Nginx 代理集群的 HTTPS 站点,通常会把 SSL 证书部署在 Nginx 的服务器上,然后把请求代理到后端的上游服务器。这种部署方式由 Nginx 服务器负责 SSL 请求的运算,相对减轻了后端上游服务器的 CPU 运算量。
生成自签名HTTPS证书
1 | 配置https签名证书 |
这种自签名的SSL证书只能提供数据加密的功能,无法提供身份验证。这意味着,虽然数据传输是加密的,但用户无法确认他们正在与预期的服务器进行通信,而不是与中间人攻击者进行通信。此外,自签名证书在用户的浏览器中通常会显示警告,这可能会影响用户对网站的信任度。
而购买SSL证书,尤其是从知名的证书颁发机构购买,可以提供更全面的保护。这些证书不仅提供数据加密,还经过了严格的身份验证过程,可以证明网站的身份是真实的。此外,这些证书会被用户的浏览器所信任,不会显示任何警告。
总的来说,如果你的网站需要处理敏感信息,如用户登录凭据、信用卡信息等,那么购买SSL证书是非常必要的。如果你的网站只是提供一些公开的、非敏感的信息,那么使用自签名的SSL证书或许就足够了。但无论如何,使用SSL证书(无论是购买的还是自签名的)总比完全不使用SSL证书要安全得多
nginx.conf配置
1 | server { |
nginx如果未开启SSL模块,配置https后nginx -t会提示错误:[emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx
apt 默认安装的 Nginx 包通常不包含 --with-http_ssl_module 选项,即不包含ssl模块。可用下面命令查看配置的模块
nginx -V:
--with-openssl=/root/openssl/openssl --with-pcre=../pcre2-10.42 --with-zlib=../zlib-1.2.13
文件服务器
要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。
nginx.conf配置
1 | server { |
注意点
按照上述配置配置好后,访问网址会出现403错误,查看error.log会发现是权限不足问题,使用ps aux | grep nginx会发现 master进程是root权限,而worker进程是nobody权限
nobody是nginx工作进程的运行用户。Nginx通常会使用非特权用户运行工作进程,以增加安全性。”nobody”是一个常见的非特权用户,用于执行网络服务进程。它通常具有较低的权限,只能访问必要的系统资源,以减少潜在的安全风险。因此,作为文件服务器不具备权限访问文件资源,因此会返回403错误.
nginx.conf中添加user root wheel;可以解决问题,此后,worker进程也将会获得root权限.
在
user root wheel;中,wheel是通过id root指令查看root的用户组为wheel
虽然这种方法可以解决权限不足问题,但有安全隐患,最好还是用别的用户 [[linux基础以及系统编程#用户权限,用户和用户组相关命令|查看linux权限相关命令]]
限速
limit_rate
定义响应数据的传输速度,bytes/s
本指令属于ngx_http_core_module,不属于ngx_http_limit_conn_module
1 | location /rate { |
限流
- limit_conn 限制客户端并发连接数
- limit_req 限制客户端处理请求的平均速率
limit_conn
- 用于限制客户端的并发连接数
- 使用共享内存,对所有的worker子进程生效(需要保存客户端连接数)
[格式] limit_conn zone number
zone:用limit_conn_zone中定义的zone名称number:以zone为标识的客户端被允许的同时最大连接数
上下文:http,server,location
案例: limit_conn limit_addr 1
limit_conn_zone
[格式] limit_conn_zone key zone=name:size
上下文:http
key:用于定义客户端的唯一标识来限速,如$binary_remote_addr使用4个字节空间,高效$remote_addr使用7-15个字节空间
name:给zone取的任意名称size:共享内存大小空间,m为单位
案例:limit_conn_zone $binary_remote_addr zone=limit_addr:10m;
limit_conn_status
[格式] limit_conn_status 触发限速后返回的状态码
上下文:http,server,location
案例: limit_conn_status 503
limit_req
- 用于限制客户端处理请求的「平均速率」
- 使用共享内存,对所有的worker子进程生效
- 限流算法:「leaky_bucket」(漏桶)
- 暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水。
- 溢出的上方水直接抛弃。
[格式] limit_req zone=name [burst=number] [nodelay | delay=number];
上下文:http, server, location
burst:桶大小,设置一个大小为x的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报limit_req_status设置的状态码的错误然后返回。nodelay:如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回limit_req_status设置的状态码,永远不存在请求需要等待的情况。(rate指limit_req_zone设置)name:给zone取的任意名称
案例:limit_req zone=limit_req burst=7 nodelay;
案例:limit_req zone=limit_req;
limit_req_zone
[格式] limit_req_zone key zone=name:size rate=rate;
上下文:http
key:用于定义客户端的唯一标识来限速,如remote_addr$binary_remote_addr使用4个字节空间,高效$remote_addr使用7-15个字节空间
name:给zone取的任意名称size:共享内存大小空间,m为单位rate:表示允许相同标识的客户端的访问频次,12r/m的,即限制每5秒访问一次,每5秒才处理一个请求。
案例:limit_req_zone $binary_remote_addr zone=limit_req:15m rate=12r/m;
limit_req_status
[格式] limit_req_status code(http的状态码,默认值:503)
上下文:http, server, location
案例: limit_req_status 504;
限流案例
结合limit_conn和limit_req的案例
1 | http { |
黑白名单
限制特定IP或网段访问
- allow
- deny
规则是从上到下的,规则顺序很重要
1 | server { |
规则示例
1 | location / { |
请求拦截
关键词: auth_request
基于子请求收到的HTTP响应码做访问控制
如:拦截所有请求,先去做鉴权请求,通过后再放行(典型的应用就是鉴权)
1 | location /private { |
防盗链
1 | location ~^/.*\.(png|jpg|gif|jfif) { |
如果出现盗链的情况,将会出现类似于如下效果:
nginx配置问题
nginx配置过程中遇到的一些问题记录
nginx配置端口问题
Mac/linux系统的限制:Mac系统默认只允许1024以下的端口号被系统服务使用,如果要使用1024以下的端口号,需要root权限或者修改系统配置,即通过user指令配置设置为root权限
但似乎阿里云服务器可以部署到8000以内的端口.不明所以
直接return文本
使用default_type指令将默认的Content-Type设置为text/plain,以确保返回的内容被浏览器识别为纯文本。然后,我们使用return指令返回带有target_host和target_uri的文本响应。
1 | location /test { |
nginx插件
fastdfs插件
[[网络编程#FastDFS|fastdfs插件详解跳转]]
[[网络编程#fastDFS配合fastCGI项目|nginx配合fastcgi使用跳转]]
nginx-http-flv-module
nginx-rtmp-module实现了RTMP协议
nginx-http-flv-module: 在nginx-rtmp-module的基础上,实现了HTTPFLV,并覆盖nginx-rtmp-module的所有功能
nginx javascript
使nginx支持js语法


