nginx概述
最前面给出一些相关网站的信息
- https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/
- https://nginx.org/en/docs/
# Nginx 简介
Nginx(通常称为 "NGINX")是目前最流行的 Web 服务器,也是我在工作中最常使用的前端服务器。它的出现是为了解决互联网兴起时出现的问题,即单线程服务器无法处理高并发的情况。俄罗斯工程师 Igor Sysoev 在他的工作期间使用 C 语言开发了 Nginx,并随后开源了它。Nginx 基于事件驱动架构,可以支持数百万级别的 TCP 连接,并且是跨平台的,可以在多种操作系统下运行。
因为是俄国人写的,所以这里只能看英文的材料https://nginx.org/en/ (opens new window)
nginx[engine x]是一个 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由 Igor Sysoev 编写。长期以来,它一直运行在许多负载较重的俄罗斯网站上,包括 Yandex、Mail.Ru、VK 和 Rambler。根据 Netcraft 的数据,2024 年 4 月,nginx 服务或代理了 20.54% 的最繁忙网站。以下是一些成功案例:Dropbox、Netflix、Wordpress.com、FastMail.FM。
# Functions
# 基本的 http 服务器功能
- 提供静态和索引文件,自动索引、开放式文件描述或缓存
- 通过缓存加速反向代理,负载均衡和容错
- 通过缓存加速支持 FastCGI、uwsgi、SCGI 和 memcached 服务器;负载平衡和容错;
- 模块化架构。过滤器包括 gzipping、字节范围、分块响应、XSLT、SSI 和图像转换过滤器。如果由代理服务器或 FastCGI/uwsgi/SCGI 服务器处理,则可并行处理单个页面中的多个 SSI 内含物;
- 支持 SSL 和 TLS SNI、支持 HTTP/2,具有加权和基于依赖关系的优先级;支持 HTTP/3。
# 其他 HTTP 服务器功能
- 基于名称和 IP 的虚拟服务器
- 支持保持连接和管道连接
- 访问日志格式、缓冲日志写入、快速的日志轮换和系统日志记录(方便快捷的日志控制)
- 3xx-5xx 错误代码重定向;
- 重写模块:使用正则表达式更改 URI;
# 邮件代理服务器功能
- 使用外部 HTTP 验证服务器将用户重定向到 IMAP 或 POP3 服务器;
- 使用外部 HTTP 身份验证服务器进行用户身份验证,并将连接重定向到内部 SMTP 服务器;
- 支持多种邮件 Authentication 方法:SMTP: AUTH LOGIN/PLAIN/CRAM-MD5;
# TCP/UDP 代理服务器功能
- 根据客户端地址执行不同功能;
- Load balancing and fault tolerance (opens new window);负载平衡和容错;
- 限制来自一个地址的同时连接或请求的数量;
limit_rate
:限制向客户端传输响应的速率。rate
以每秒字节数为单位指定。零值将禁用速率限制。限制是为每个请求设置的,因此如果客户端同时打开两个连接,总速率将是指定限制的两倍。
- 基于 IP 的地理定位;
- 该模块默认不内置,应使用
--with-stream_geoip_module
配置参数启用。
- 该模块默认不内置,应使用
- A/B 测试;
- 需要引入模块:
ngx_http_split_clients_module
- 根据用户 IP 的哈希值,以一定的概率将客户端划分为不同的组,如第一组和第二组。然后根据客户端所在的组来动态决定响应的索引文件,可以用来把不同的客户端分配到不同的处理逻辑中,以提供不同的响应内容。
- 需要引入模块:
- njs 脚本语言。
# 架构和可扩展性
- **一个主进程和多个工作进程;工作进程在无权限用户下运行;**就算宕机了也没事,只要主进程在就没事,这就保证了它的稳定性/高可用
- https://nginx.org/en/docs/example.html (opens new window)
- 可执行文件的重新配置和升级无需中断客户端服务;
# 趋势
- 可以看到 nginx 还是占据了 web server 的半壁江山
- 在工作中,我们经常将 Nginx 用作 HTTP 服务器来管理前端代码,或者用它来实现不同性能服务器的负载均衡。
# 正向代理与反向代理
# 正向代理
我理解正向代理就是帮人递东西
通俗一点的理解:叫外卖小哥送花给女朋友就是隐藏;叫办公室小张帮你拿个文件,就会有授权缓存(小张不认识,你就不会帮你拿。如果这个文件是公司机密,小张也不会给你。如果小张有这个文件,那就相当于小张已经缓存过了,他可以直接返给你)
在正向代理中,客户端请求通过代理服务器将请求
转发到外部服务器。这个代理服务器可以隐藏客户端的真实信息,以便访问被限制的资源或保护隐私。
- 正向代理的配置通常涉及设置一个代理服务器的地址和端口,以便客户端请求经过代理服务器发送。
# 常见功能
- 隐藏自己的身份
- 例如一些黑客会使用肉鸡跳板机去访问服务端,让服务端不知道躲在代理背后的人是谁
- 翻墙:
- 正向代理的用途包括访问被限制的资源,如 Google,或者通过 VPN 访问远程内网环境。
- 因为在国内很多时候我们没有办法直接访问到国外的网站,例如 GitHub 等等大型开源网站,不利于我们的工作和学习。所以我们就需要一个正向代理服务器去帮我们获取外网资源
- 缓存
- 用于缓存资源加速访问,进行上网认证,记录用户访问记录以及隐藏用户信息。
- 我们通过正向代理去访问公司内网的一些资源时,它可能涉及到一些流量的费用。而当这些文件资源静态资源被缓存在 web server 中,可以节约我们的流量费用
- 授权
- 有些公司会使用网线或者其他方式强制接入公司内网的正向代理服务器,主要为了控制只允许公司内网访问公司内部的资源,保证了内部资料的安全性,并且可以统计员工访问了哪些网站,并且计算每个网站停留时间有多长。
# 反向代理
我理解的反向代理就是一个窗口(限制了客户端能够看到的内容),它能够将外部的请求转发到内部的服务器上,同时隐藏内部服务器的信息。
- 反向代理与正向代理不同,它接收用户请求并根据负载均衡策略将请求路由到不同的服务器上,客户端通常无法感知代理的存在。
- 反向代理通常用于负载均衡,集群分布式部署以及隐藏服务器内部信息,提高内网的安全性。
# 常见功能
- 保护服务端,真实 IP 不会轻易被客户端获取到
- 分布式路由,类似于我们想要跟明星谈合作,都要经过一个经济人,而一个经济人可以对应的多个明星,我们访问明星的过程就是一个分布式路由。
- 负载:类似于上面的分布式路由也是发送一个请求。但是我们可以根据一定的规则,把这个请求分发到不同的服务端
- 动静分离
- 动态资源是指的那些我们需要通过运算得到的结果,例如一些统计图表都是动态资源
- 静态资源指的是一些我们固定的文件,一般这种固定文件我们会多次获取,所以静态资源多数情况下我们需要做缓存。对静态资源做缓存,可以减少请求后端的次数,减少对应的 IO
# 配置
下面贴上一段简单的配置反向代理的代码:
server {
listen 80; # 设置监听的端口
server_name localhost; # 设置服务器的域名
client_max_body_size 100M; # 设置请求体的最大值
location / {
proxy_pass http://localhost:8080; # 设置代理服务器的地址
proxy_set_header Host $host:$server_port; # 设置请求头
}
}
2
3
4
5
6
7
8
9
10
# 正反proxy区别
区分正向代理和反向代理的关键在于数据流向:在正向代理中,数据从客户端经过代理服务器发送到外部服务器,而在反向代理中,数据从客户端发送到反向代理服务器,然后由反向代理服务器路由到后端服务器。
- 在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
- 在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;
# 负载均衡
在选择负载均衡方法时,通常需要考虑服务器性能、硬件配置以及特定需求。最常用的负载均衡方式是基于权重轮询和 IP 哈希。
负载均衡是一种将请求分发到多个服务器的过程,以提高性能和可用性。它可以通过硬件负载均衡和软件负载均衡来实现。硬件负载均衡,如 F5 负载均衡,提供了良好的性能和安全性,但成本较高。因此,许多公司更倾向于使用软件负载均衡,它利用现有的主机设备进行分发。
Nginx支持的负载均衡调度算法方式如下:
- weight轮询(默认,常用,具有HA功效!):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
- ip_hash(常用):每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
- fair(了解):智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
- url_hash(了解):按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。
这些算法可用于不同场景,以实现负载均衡和性能优化。
# Web Server技术选型
server | Nginx | Apache | Lighttpd |
---|---|---|---|
反向代理 | 非常好 | 好 | 一般 |
Rewrite规则 | 非常好 | 好 | 一般 |
Fastcgi | 好 | 不好 | 非常好 |
热部署 | 支持 | 不支持 | 不支持 |
系统压力比较 | 很小 | 很大 | 比较小 |
稳定性 | 非常好 | 好 | 不好 |
安全性 | 一般 | 好 | 一般 |
技术资料 | 很少 | 非常好 | 一般 |
静态文件处理 | 非常好 | 一般 | 好 |
虚拟主机 | 支持 | 支持 | 支持 |
量级 | 轻量 | 重量级 | 轻量 |
复杂度(安装、配置) | 简单 | 较复杂 | 简单 |
Openresty
是一个基于 Nginx 与 Lua 的高性能 Web 平台,其最大特点是引入了ngx_lua
模块,支持使用lua开发插件。其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。- 直到今天Openresty还是一直跟官方保持同步版本号更新——2024年5月11日。值得一试 17kk
# 优势
- nginx支持实时压缩
- 防盗链涉及到 reference
- 经测试,并发量比 tomcat 好1000倍(个人测试)。高可用,防止 dos 攻击;worker架构保高可用。
# 总结
总的来说,Nginx 是一个功能强大的服务器和代理服务器,它可以用于各种场景,包括作为 HTTP 服务器
、反向代理服务器
以及负载均衡
。