Nginx 详解:从核心概念到实战应用
Nginx(发音为 “engine x”)是一款由俄罗斯开发者 Igor Sysoev 开发的高性能 HTTP 和反向代理服务器,同时也是 IMAP/POP3/SMTP 代理服务器。它以轻量级、高并发、低资源消耗的特性闻名,目前已成为全球最主流的 Web 服务器之一,广泛应用于互联网企业(如阿里、腾讯、Netflix 等)的生产环境中。
一、Nginx 核心特性
Nginx 的优势源于其独特的架构设计和功能特性,核心亮点如下:
1. 高性能:异步非阻塞 I/O 模型
Nginx 采用 “多进程 + 多线程(可选)+ 异步非阻塞 I/O” 架构,彻底解决了传统 Web 服务器(如 Apache prefork 模式)“一请求一进程” 的资源浪费问题:
- 多进程:Nginx 启动后会生成 1 个 Master 进程(管理配置、信号、子进程)和多个 Worker 进程(处理实际请求),Worker 进程数通常设置为与 CPU 核心数一致(充分利用多核资源,避免进程切换开销)。
- 异步非阻塞:每个 Worker 进程通过 “事件驱动” 机制处理 thousands 级别的并发请求,无需为每个请求创建新进程 / 线程,因此在高并发场景下(如每秒数万请求),Nginx 的 CPU、内存占用仍能保持稳定。
对比示例:在 4 核 CPU 服务器上,Apache prefork 模式若开启 200 个进程处理 200 个请求,内存占用可能达数百 MB;而 Nginx 仅需 4 个 Worker 进程即可处理数千个请求,内存占用通常不足 100MB。
2. 核心功能:不止于 Web 服务器
Nginx 的功能覆盖 “请求处理、流量控制、服务治理” 等多个维度,核心功能如下:
功能分类 | 具体作用 |
---|---|
HTTP 服务器 | 直接托管静态资源(HTML、CSS、JS、图片、视频),支持 gzip 压缩、缓存、断点续传。 |
反向代理 | 接收客户端请求,转发到后端业务服务器(如 Tomcat、Node.js),隐藏后端服务地址,实现 “统一入口”。 |
负载均衡 | 将并发请求均匀分配到多个后端服务器,避免单点过载,提升服务可用性和吞吐量。 |
动静分离 | 静态资源(图片、JS)由 Nginx 直接处理,动态请求(如接口调用)转发到后端,降低后端压力。 |
SSL/TLS 终结 | 集中处理 HTTPS 协议(证书配置、加密解密),无需后端服务关注加密逻辑,提升性能。 |
URL 重写 | 基于规则修改请求 URL(如伪静态、301 重定向、路径映射),支持 SEO 和业务灵活适配。 |
访问控制 | 基于 IP、用户认证(Basic Auth)限制请求,防止非法访问。 |
3. 高可用性:稳定性与容错
- Master-Worker 架构容错:若某个 Worker 进程异常崩溃(如处理恶意请求时),Master 进程会立即重新创建一个新的 Worker 进程,保证服务不中断。
- 热部署 / 热重载:支持在不停止服务的情况下更新配置文件(
nginx -s reload
)或升级 Nginx 版本,满足生产环境 “零停机维护” 需求。 - 低资源依赖:即使在低配服务器(如 1 核 1G)上,Nginx 也能稳定运行,适合边缘节点或轻量场景。
Nginx常用功能
1、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
这里我给来2张图,对正向代理与反响代理做个诠释,具体细节,大家可以翻阅下资料。
2、负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
轮询(Round Robin)
这是 Nginx 负载均衡的默认策略。它会按照后端服务器的顺序,依次将请求分发给每一台服务器。比如有三台后端服务器 A、B、C,第一个请求发给 A,第二个发给 B,第三个发给 C,第四个又发给 A,以此循环。这种策略简单易用,适用于后端服务器性能差异不大的场景。
加权轮询(Weighted Round Robin)
在轮询的基础上,为不同的后端服务器设置不同的权重值。权重值越高的服务器,被分配到请求的概率就越大。例如,服务器 A 权重为 3,服务器 B 权重为 2,服务器 C 权重为 1,那么在 6 个请求中,大约有 3 个会发给 A,2 个发给 B,1 个发给 C。此策略适合后端服务器性能存在差异的情况,让性能好的服务器承担更多请求。
IP 哈希(IP Hash)
该策略会根据客户端的 IP 地址进行哈希计算,然后将同一个客户端的请求始终分配到同一台后端服务器上。这样可以解决会话保持的问题,比如用户登录状态等需要在同一台服务器上维持的情况。例如,某个客户端 IP 经过哈希计算后,对应的后端服务器是 A,那么该客户端后续的请求都会被分配到 A 上。
扩展负载均衡策略
Nginx 支持通过第三方模块或自定义开发来实现扩展的负载均衡策略。由于 Nginx 具有良好的扩展性,开发者可以根据具体的业务需求,创造出各种各样的负载均衡逻辑。比如可以根据请求的 URL 路径、请求头信息、后端服务器的响应时间等因素来进行请求分配,满足一些特殊的业务场景,真的是 “只有你想不到,没有它做不到”。
3 动静分离
将静态资源(图片、JS、CSS)由 Nginx 直接处理,动态请求(如 /api/*
)转发到后端服务,降低后端压力。
Liunx 安装 nginx:
通过源码包 nginx-1.28.0.tar.gz
安装 Nginx ,步骤如下:
1. 下载源码包
确保你的服务器能够连接互联网,然后使用 wget
命令下载 Nginx 源码包:
# 进入临时目录(方便管理)
cd /tmp
# 下载 Nginx 源码包
wget https://nginx.org/download/nginx-1.28.0.tar.gz
如果服务器没有安装 wget
,可以使用以下命令安装(以 CentOS 为例):
yum install wget -y
2. 安装编译所需依赖
Nginx 源码编译需要一些依赖包,在 CentOS 系统中,执行以下命令安装:
yum install gcc gcc-c++ make zlib zlib-devel openssl openssl-devel pcre pcre-devel -y
在 Ubuntu 系统中,执行以下命令安装:
apt-get update
apt-get install build-essential zlib1g-dev libpcre3-dev libssl-dev -y
3. 解压源码包
tar -zxvf nginx-1.28.0.tar.gz
解压后会在当前目录下生成 nginx-1.28.0
文件夹 。
4. 配置编译参数
进入解压后的目录,并执行 ./configure
命令配置编译参数。例如,指定安装目录为 /usr/local/nginx
,并开启一些常用模块(如 --with-http_ssl_module
开启 HTTPS 支持):
cd nginx-1.28.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
--prefix
选项用于指定 Nginx 的安装目录;--with-http_ssl_module
开启 HTTPS 模块,使得 Nginx 可以处理 HTTPS 请求;--with-http_stub_status_module
开启状态统计模块,可以获取 Nginx 的一些运行状态信息。
5. 编译和安装
依次执行 make
和 make install
命令:
make
make install
make
命令用于编译 Nginx 源码,make install
则将编译好的文件安装到指定的目录(即 --prefix
指定的目录)。
路径 | 通常对应的安装方式 | 说明 |
---|---|---|
/usr/lib64/nginx |
yum/dnf 包管理器安装 | 系统默认的 Nginx 库文件、模块路径 |
/etc/nginx |
yum/dnf 包管理器安装 | 系统默认的 Nginx 配置文件路径(如 nginx.conf) |
/usr/local/nginx | 源码编译安装(你当前操作) | 你通过 configure 配置的 Nginx 安装路径(二进制、配置、日志都在这里) |
/usr/share/nginx |
yum/dnf 包管理器安装 | 系统默认的 Nginx 静态文件(如 html 页面)路径 |
6. 启动 Nginx
安装完成后,可以进入安装目录的 sbin
子目录,执行 nginx
命令启动 Nginx :
/usr/local/nginx/sbin/nginx
也可以将 Nginx 启动命令添加到环境变量中,方便直接执行 nginx
命令。例如,编辑 ~/.bashrc
文件,在末尾添加:
export PATH=$PATH:/usr/local/nginx/sbin
然后执行 source ~/.bashrc
使配置生效。
7. 验证安装
- 检查进程:使用
ps -ef | grep nginx
命令,查看是否有 Nginx 的主进程和工作进程 。 - 浏览器访问:在浏览器中输入服务器的 IP 地址,如果看到 Nginx 默认的欢迎页面,说明 Nginx 安装并启动成功。
8. 配置开机自启(可选)
创建一个 systemd
服务文件,让 Nginx 随系统开机自启。编辑 /etc/systemd/system/nginx.service
文件:
vim /etc/systemd/system/nginx.service
输入以下内容:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Install]
WantedBy=multi-user.target
保存并退出后,执行以下命令让配置生效并设置开机自启:
systemctl daemon-reload
systemctl enable nginx
这样就完成了通过源码包安装 Nginx 的全过程。
安装好以后出现下面的文件
[root@node01 nginx]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz
路径 | 含义与作用 |
---|---|
/usr/sbin/nginx |
Nginx 的主程序可执行文件,用于启动、停止 Nginx 服务(核心程序)。 |
/usr/lib64/nginx |
Nginx 的动态链接库或模块目录,存放 Nginx 运行所需的插件 / 模块(如过滤模块、代理模块)。 |
/etc/nginx |
Nginx 的配置文件目录,包含主配置文件 nginx.conf 及子配置目录 conf.d/ (核心配置所在)。 |
/usr/share/nginx |
Nginx 的静态资源目录,默认存放欢迎页面(index.html )、错误页面等静态文件。 |
/usr/share/man/man3/nginx.3pm.gz |
Perl 模块的手册页(较少用到,与 Nginx 的 Perl 扩展相关)。 |
/usr/share/man/man8/nginx.8.gz |
Nginx 主程序的手册页,执行 man nginx 时会读取这里的帮助文档。 |
Nginx 常用命令
cd /usr/local/nginx/sbin/
./nginx #启动 或者(/usr/local/nginx/sbin/nginx)
./nginx -s stop #停止 或者(/usr/local/nginx/sbin/nginx -s stop)
./nginx -s quit #安全退出
./nginx -s reload #重新加载配置文件 或者(/usr/local/nginx/sbin/nginx -s reload)
ps aux|grep nginx #查看 nginx 进程