Nginx 是一款高性能的 HTTP 和反向代理服务器,以其高并发处理能力、低内存消耗以及出色的稳定性而广受欢迎。下面这张表格汇总了它的核心概念,能帮你快速建立整体认知。
|
核心概念 |
角色/功能 |
一句话解读 |
|
反向代理 |
客户端的统一入口。 |
代理的是服务器端。客户端将请求发送给反向代理服务器,由它转发给内部的实际服务器,并将结果返回给客户端。客户端无需知道真正的服务器地址。 |
|
正向代理 |
客户端的代理。 |
代理的是客户端。客户端通过配置的代理服务器去访问外部网络,列如科学上网工具就是正向代理的典型应用。 |
|
负载均衡 |
流量的调度员。 |
当有多台后端服务器时,反向代理服务器会根据设定的规则(如轮询、权重)将请求分发出去,以避免单一服务器压力过大。 |
|
动静分离 |
网站的优化策略。 |
将动态请求(如API接口)和静态资源(如图片、CSS、JS)分别由不同的服务器(或路径)处理,提升整体响应速度。 |
|
Master-Worker 进程模型 |
Nginx 的高性能架构基石。 |
一个 Master 主进程 负责管理(如读取配置、平滑重启),多个 Worker 工作进程 负责处理网络请求。这种模式使得 Nginx 资源消耗低、稳定性高,且能利用多核 CPU。 |
|
事件驱动模型 |
高并发的引擎。 |
Worker 进程采用异步非阻塞的方式处理连接,基于 epoll(Linux)等机制,使得单个 Worker 就能高效处理数千个并发连接,而不会由于等待某个 I/O 操作而阻塞。 |
⚙️工作原理与核心架构
理解上表中的进程模型和事件驱动机制,是掌握 Nginx 为何高效的关键。其工作流程可以概括为下图所示的几个关键步骤:
简单来说:Master 进程如同管理员,不直接处理请求,而是负责管理 Worker 进程。真正的“一线员工”是 Worker 进程,它们使用高效的事件驱动模型同时接待大量请求。当请求到来时,Worker 会判断请求内容:如果是静态资源(如图片),则直接快速返回;如果是需要计算的动态请求,则交给后端的应用服务器处理,自己再将结果返回给用户。这种分工协作的机制,是 Nginx 高性能的秘诀。
快速入门与实践
1. 安装与基础命令
在 Ubuntu/Debian 系统上,安装和启动 Nginx 超级简单:
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx # 启动
sudo systemctl enable nginx # 设置开机自启
安装成功后,在浏览器访问 http://你的服务器IP,就能看到 Nginx 的欢迎页面。
常用命令:
sudo systemctl reload nginx # 平滑重载配置(不中断服务)
sudo nginx -t # 检查配置文件语法是否正确(超级重大!)
sudo systemctl restart nginx # 重启服务
2. 核心配置文件 nginx.conf
Nginx 的配置一般位于 /etc/nginx/nginx.conf,它采用分块的结构,超级清晰:
- 全局块:最外层的配置,如定义 Worker 进程数量、错误日志路径。
- events 块:设置网络连接模型,如每个 Worker 的最大连接数。
- http 块:这是配置最频繁的部分,包含:
- server 块:定义一个“虚拟主机”(一个网站)。
- location 块:根据请求的 URL 路径,指定不同的处理规则。
3. 基础配置示例
示例一:静态网站服务
这个配置告知 Nginx 监听 80 端口,当有人访问 www.example.com 时,就去 /var/www/example 目录下寻找文件(如 index.html)并返回。
server {
listen 80;
server_name www.example.com;
root /var/www/example; # 网站根目录
index index.html; # 默认首页文件
location / {
try_files $uri $uri/ =404; # 尝试按URL寻找文件,找不到则返回404
}
}
示例二:反向代理
这个配置将所有访问 api.example.com 的请求,转发到运行在本地 8080 端口的实际应用服务器(如 Tomcat、Node.js 应用)。
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:8080; # 反向代理的核心指令
# 以下指令确保将客户端的真实信息传递给后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
示例三:负载均衡
这个配置定义了一个名为 backend_servers 的服务器组,包含三个后端应用实例。Nginx 会按照轮询方式将请求分发给它们,其中 weight 参数可以设置权重(如 server2 接收的请求会是其他的两倍)。
# 在http块内定义上游服务器组
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080 weight=2; # 权重为2,处理更多请求
server 192.168.1.12:8080;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_servers; # 代理到服务器组
}
}
性能优化小贴士
- 启用 Gzip 压缩:压缩文本文件(HTML, CSS, JS),显著减少传输体积。
- 设置静态资源缓存:让浏览器缓存图片、CSS 等文件,降低服务器压力。
- 调整 Worker 进程数:一般设置为 CPU 的核心数,可以在全局块中设置 worker_process auto;。
