10个场景,基本会玩Nginx了!
10个场景,基本会玩Nginx了!
来自: [鑫哥的技术思维](javascript:void(0)😉
-
概述
-
安装&使用
-
实用场景
-
- 虚拟主机
- 静态站点
- 反向代理
- 负载均衡
- HTTPS加密传输
- 文件服务器
- 限速
- 限流
- 黑白名单
- 请求拦截
- 虚拟主机
-
配置&变量详解
-
HTTP状态码
概述
What is Nginx?
Nginx(发音同“engine x”)是一个高性能的反向代理和 Web 服务器软件,因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性,Nginx 在互联网企业中得到广泛应用。
Nginx特点
-
高性能、高并发
-
扩展性好
-
异步非阻塞的事件驱动模型
Nginx Apache 一个进程处理多个请求 一个进程处理一个请求 非阻塞式 阻塞式
安装&使用
安装
windows安装
- 下载官方稳定版:
https://nginx.org/download/nginx-1.20.0.zip
- 解压到本地,直接运行
nginx.exe
即可
Linux安装
- rpm包安装
❝
rpm包下载页:
http://nginx.org/packages/rhel/7/x86_64/RPMS/
❞
- 关闭防火墙
rpm包中已包含了大量常用模块,推荐使用rpm包方式安装,简单快速
使用
命令参数 | 含义 |
---|---|
nginx | 启动 |
nginx -V | 查看当前版本及编译配置信息 |
nginx -t | 检查配置文件语法是否正确 |
nginx -s stop | 直接关闭worker子进程 |
nginx -s quit | 等待worker子进程正确处理完请求后关闭 |
nginx -s reload | 重读配置文件 |
实用场景
虚拟主机
静态站点
为了加快网站解析速度,可以将动态资源交给后端服务器,纯前端的静态页面放在系统目录下,交给Nginx来解析。
反向代理
反向代理是用户客户端访问代理服务器后,被反向代理服务器按照一定的规则从一个或多个被代理服务器中获取响应资源并返回给客户端的代理模式,客户端只知道代理服务器的 IP,并不知道后端服务器的 IP,原因是代理服务器隐藏了被代理服务器的信息。
七层反向代理
在配置文件nginx.conf中的http段中,写入如下格式的配置,即可将本地8088端口代理到百度:
四层反向代理
Nginx除了可以代理HTTP七层流量,还可以代理 TCP/UDP 四层流量,核心模块 stream 需要在编译配置时增加“--with-stream”参数进行编译(rpm包已包含)。
配置文件如下(需写在main段中):
负载均衡
当出现高并发大流量的业务场景时,单台后端服务器已无法支撑业务正常运行,需要将请求流量按照一定规则分发到多台服务节点上,即使某个节点宕机,系统依然能够对外正常提供服务,以此来提高系统的性能和稳定性。
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
支持协议图
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
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 | 标记服务器长期不可用,离线维护 |
负载均衡算法
-
轮询(默认)
-
- 每个请求按时间顺序逐一分配到不同的后端服务器
-
weight-权重轮询
-
- 指定轮询概率,用于后端服务器性能不均的情况
-
哈希-hash
-
- 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值叫哈希值,映射不可逆。
- hash $request_uri:根据这个变量的哈希值来负载
- 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值叫哈希值,映射不可逆。
-
ip_hash
-
- 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,是session共享问题的解决方案之一
-
最少连接数算法
-
- 多个worker子进程同时处理请求时,无法共享后端服务器的连接数状态,此时需要开辟共享内存空间,用来在多个worker子进程中共享信息
- zone zone_name 1M,开辟共享内存
- 多个worker子进程同时处理请求时,无法共享后端服务器的连接数状态,此时需要开辟共享内存空间,用来在多个worker子进程中共享信息
-
- 从上游服务器挑选一台当前已建立连接数最少的分配请求
- 极端情况下会退化为轮询算法
- least_conn:
- 从上游服务器挑选一台当前已建立连接数最少的分配请求
「对上游服务器返回异常时的处理」
❝
「遇到这些情况下执行失败转发」
语法: 「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
「超时时间,超过这个时间就不再尝试失败转发」
语法: 「proxy_next_upstream_timeout」 time
默认值:proxy_next_upstream_timeout 0 (不等待)
上下文:http, server, location
「转发次数」
语法: 「proxy_next_upstream_tries」 number
默认值:proxy_next_upstream_tries 0 (一直转发)
上下文: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 | 禁用请求失败转发功能 |
配置样例
HTTPS加密传输
HTTPS 通过加密通道保护客户端与服务端之间的数据传输,已成为当前网站部署的必选配置。在部署有 Nginx 代理集群的 HTTPS 站点,通常会把 SSL 证书部署在 Nginx 的服务器上,然后把请求代理到后端的上游服务器。这种部署方式由 Nginx 服务器负责 SSL 请求的运算,相对减轻了后端上游服务器的 CPU 运算量。
- 生成自签名HTTPS证书
- server配置
文件服务器
要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。
- 效果
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
- 配置
限速
限流
limit_conn
- 用于限制客户端并发连接数
- 使用共享内存,对所有的worker子进程生效(需要保存客户端连接数)
limit_req
-
用于限制客户端处理请求的「平均速率」
-
使用共享内存,对所有的worker子进程生效
-
限流算法:「leaky_bucket」(漏桶)
-
- 暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水。
- 溢出的上方水直接抛弃。
- 暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水。
黑白名单
access
- 限制特定IP或网段访问
- allow
- deny
规则示例
请求拦截
auth_request
-
基于子请求收到的HTTP响应码做访问控制
-
- 如:拦截所有请求,先去做鉴权请求,通过后再放行
配置&变量详解
全局配置main段
events段
http段
- server段
- server_name的匹配规则
- location段
匹配规则 | 含义 | 示例 | 优先级(1最高) |
---|---|---|---|
= | 精确匹配 | location = /pic/ | 1 |
^~ | 匹配到即停止搜索 | location ^~ /pic/ | 2 |
~ | 正则匹配,区分大小写 | location ~ .(Jpg|gif)# | 3 |
~* | 正则匹配,不区分大小写 | location ~ .(Jpg|gif)$ | 4 |
无符号 | location / | 5 | |
@ | 内部跳转 | location @errorpage |
root与alias的区别 | root | alias |
---|---|---|
语法 | root path | alias path |
上下文 | http, server, location, if | location |
区别 | 将定义路径与URI叠加 | 只取定义路径,末尾一定要加/ |
location末尾带与不带/的区别 | ||
---|---|---|
不带/ | location /test | 尝试把test当成目录,如果找不到则找test文件 |
带/ | location /test/ | 将test作为目录,如果不存在则直接返回404 |
状态项 | 含义 |
---|---|
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值 |
-
rewrite指令&return指令
-
- 根据指定正则表达式匹配规则,重写URL
-
- 停止处理请求,直接返回响应码或重定向到其他URL
- 执行return指令后,location中后续指令将不会被执行
- 停止处理请求,直接返回响应码或重定向到其他URL
-
- return
- rewrite
- return
Nginx变量分类
时间空间单位
时间单位
- ms:毫秒
- s:秒
- m:分钟
- h:小时
- d:天
- w:周
- M:月
- y:年
空间单位
- k/K:KB
- m/M:MB
- g/G:GB
HTTP状态码
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码 | 描述 |
---|---|
100 | 继续。客户端应继续其请求 |
101 | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | 请求成功。一般用于GET与POST请求 |
201 | 已创建。成功请求并创建了新的资源 |
202 | 已接受。已经接受请求,但未处理完成 |
203 | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | 部分内容。服务器成功处理了部分GET请求 |
300 | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | 使用代理。所请求的资源必须通过代理访问 |
306 | 已经被废弃的HTTP状态码 |
307 | 临时重定向。与302类似。使用GET请求重定向 |
400 | 客户端请求的语法错误,服务器无法理解 |
401 | 请求要求用户的身份认证 |
402 | 保留,将来使用 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | 客户端请求中的方法被禁止 |
406 | 服务器无法根据客户端请求的内容特性完成请求 |
407 | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | 服务器等待客户端发送的请求时间过长,超时 |
409 | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | 客户端请求信息的先决条件错误 |
413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | 服务器无法处理请求附带的媒体格式 |
416 | 客户端请求的范围无效 |
417 | 服务器无法满足Expect的请求头信息 |
500 | 服务器内部错误,无法完成请求 |
501 | 服务器不支持请求的功能,无法完成请求 |
502 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
__EOF__

本文链接:https://www.cnblogs.com/starkzz/p/17553827.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现