一、nginx简介
Nginx是一款轻量级HTTP服务器,也是一款邮箱代理服务器,同时具备反向代理、通用TCP/UDP代理功能,Nginx可以运行在x86、ARM等多种平台上,同时支持Linux、Windows等主流的操作系统。
二、Nginx特点
高性能
- 采用事件驱动的异步非阻塞架构,支持高并发连接。
- 内存占用低,单机可轻松支持数万并发连接。
- 高效的静态内容处理能力,适合作为静态资源服务器。
高可靠性
- 模块化设计,稳定性强,长期运行不易崩溃。
- 支持热部署,可在不中断服务的情况下更新配置或升级版本。
负载均衡
- 内置多种负载均衡算法(轮询、权重、IP哈希等)。
- 支持后端服务器的健康检查,自动剔除故障节点。
反向代理
- 可隐藏真实服务器信息,增强安全性。
- 支持缓存加速,减轻后端服务器压力。
灵活的配置
- 使用声明式配置文件,结构清晰易维护。
- 支持条件判断、变量和正则表达式,满足复杂业务场景。
扩展性强
- 丰富的第三方模块生态(如Lua、GeoIP等)。
- 可通过C语言开发自定义模块。
低资源消耗
- CPU和内存占用远低于传统服务器(如Apache)。
- 特别适合资源受限的虚拟化环境。
多协议支持
- 原生支持HTTP/2、WebSocket、gRPC等现代协议。
- 可作为邮件代理服务器(IMAP/POP3/SMTP)。
跨平台
- 支持Linux/BSD/Windows/macOS等多种操作系统。
- 针对不同平台进行性能优化。
三、Nginx架构

- 注意:默认情况下,nginx会建立和服务器CPU核心数相等的worker进程,woker进程之间相互独立,若一个进程故障不会影响其它进程
四、nginx关键工作机制
- 抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,哪个worker抢占了该互斥锁,该客户端的请求就由那个worker响应和处理

- 异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求,在异步非阻塞模式下,底层使用了linux的epoll模型,就算worker被阻塞,新的客户端请求也会被正常处理

五、nginx正向代理功能
正向代理(Forward Proxy)是客户端通过代理服务器访问互联网资源的模式。代理服务器代表客户端向目标服务器发起请求,常用于访问控制、缓存加速或隐私保护。Nginx可通过配置实现正向代理功能。
客户端 <一> 代理 <一> 服务端
A租房人(客户端) B房产中介(代理) C真实房东(服务端)
-
A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
-
B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
-
A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
-
C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
-
结论:正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理翻墙去访问(用户知道要访问真正的服务器)
六、nginx反向代理功能
reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

七、负载均衡功能
nginx作为高性能的反向代理服务器,内置了多种负载均衡算法,能够将客户端请求分发到多个后端服务器,提升系统的可用性和扩展性。以下是nginx负载均衡的核心功能和配置方法。
一、 什么是四层和七层负载均衡?
在理解其配置之前,我们先快速区分一下概念:
-
四层负载均衡(Layer 4, L4):
-
工作在 OSI 模型的传输层。
-
基于 TCP/UDP 端口 和 IP地址 进行转发。
-
不解析应用层协议(如 HTTP、FTP、MySQL 等)。它只关心数据包是从哪里来,要转到哪里去。
-
性能更高,因为处理逻辑简单,开销小。
-
-
七层负载均衡(Layer 7, L7):
-
工作在 OSI 模型的应用层。
-
基于应用层内容 进行转发,例如 HTTP 的
Host头部、URL 路径、Cookie 等。 -
功能更强大,可以实现基于内容的智能路由、SSL 终结、请求改写等。
-
性能开销稍大,因为需要解析应用层协议。
-
八、部署Nginx
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# yum install nginx -y
[root@server ~]# nginx -V # 查看版本,编译器、配置参数等信息
[root@server ~]# systemctl start nginx # 启动httpd
[root@server ~]# systemctl enable nginx # 设置开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@server ~]# systemctl status nginx # 查看状态,q键退出查看
[root@server ~]# ps -ef | grep nginx # 查看进程
root 1690 1 0 13:57 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 1691 1690 0 13:57 ? 00:00:00 nginx: worker process
nginx 1692 1690 0 13:57 ? 00:00:00 nginx: worker process
root 1726 1510 0 14:00 pts/0 00:00:00 grep --color=auto nginx
# 测试,Windows中打开浏览器输入服务器IP地址
九、常用命令
systemctl系列
systemctl start nginx # 启动服务
systemcctl restart nginx # 重启服务
systemctl enable nginx # 开机启动
systemctl stop nginx # 停止服务
systemctl disable nginx # 取消开机启动
systemctl status nginx # 查看状态
nginx自带命令
nginx # 启动nginx
nginx restart # 重启服务
nginx -s reload # 重新加载配置文件
nginx -s stop # 强行停止服务
nginx -s quit # 优雅停止服务,即所有请求处理完后退出服务
nginx -v # 查看版本号
nginx -t # 检查配置文件的语法错误,无错返回ok
十、OpenResty
一、 什么是 OpenResty?
-
官方定义:一个基于 Nginx 与 Lua 的高性能 Web 平台。
-
核心思想:将 Lua 脚本嵌入到 Nginx 的各个请求处理阶段(如重写、访问、内容生成、日志记录等),从而让开发者能够用灵活的脚本语言来操作请求和响应,而无需去编写复杂的 C 语言 Nginx 模块。
-
关键组件:
-
Nginx Core:提供了事件驱动、异步非阻塞的底层框架。
-
LuaJIT:一个极快的 Lua 编译器,让 Lua 脚本能以接近 C 的速度运行。
-
lua-nginx-module:最重要的模块,它充当了 Nginx 和 Lua 之间的桥梁。
-
一系列 Lua 库 :如
lua-resty-redis,lua-resty-mysql,lua-resty-string等,用于方便地与后端服务交互。
-
二、 OpenResty 与标准 Nginx 的核心区别
| 特性 | 标准 Nginx | OpenResty |
|---|---|---|
| 扩展方式 | 主要依赖配置文件 和 C 模块 | Lua 脚本 + 配置文件 |
| 灵活性 | 配置驱动,功能受限于模块 | 代码驱动,几乎可以编写任何业务逻辑 |
| 开发效率 | 修改复杂逻辑需重新编译,周期长 | 修改 Lua 脚本即可,热加载,效率极高 |
| 能力范围 | 静态内容、反向代理、负载均衡 | 完整的 Web 应用、API 网关、防火墙、缓存逻辑等 |
简单来说,标准 Nginx 是一个强大的网络服务器和代理 ,而 OpenResty 是一个全功能的 Web 应用服务器。
三、 OpenResty 的核心架构与执行阶段
这是 OpenResty 最强大的地方。它允许你在 Nginx 请求生命周期的几乎每一个阶段注入 Lua 代码。
主要阶段:
-
set_by_lua*: 设置变量。 -
rewrite_by_lua*: 重写 URI、跳转等(在访问阶段之前)。 -
access_by_lua*: 访问控制、权限验证(如 API 鉴权)。 -
content_by_lua*: 生成响应内容,这是最常用的阶段。 -
header_filter_by_lua*: 过滤和设置响应头。 -
body_filter_by_lua*: 过滤和修改响应体。 -
log_by_lua*: 记录自定义日志。