Nginx(1)
服务器上。
前言
Web 是互联网中连接用户与信息的核心载体,理解其底层架构与关键技术,是技术学习者、运维工程师及开发人员的基础必修课。用户在浏览器输入 URL,到页面完整呈现,背后涉及 Web 架构模型、HTTP/HTTPS 协议交互、请求响应处理等一系列复杂机制。目前Nginx 作为当前主流的、支撑海量并发的高性能 Web 服务器,是保障服务稳定运行的关键工具。
本文聚焦三大基础模块:
-
Web 核心概念
-
HTTP/HTTPS 关键机制
-
Nginx 安装与基本配置
为后续深入学习反向代理、负载均衡、性能优化等实战内容奠定扎实基础。无论零基础入门,还是技术复盘,都能从中获得清晰的知识框架与可落地的操作指南。
省流版
等待施工中......
一、什么是Web
1.1 Web基本概念
Web是运行在互联网上的一个超文本信息系统,往往以前端页面来供用户使用,它依赖于HTTP / HTTPS 协议实现浏览器与服务器之间的交互。
DNS解析流程:
客户端host文件——>网卡配置——>/etc/resolv.conf
1.1.1 Web的特点
-
统一访问:浏览器输入 URL 即可获取资源,操作简单。
-
超链接网状结构:页面通过链接互连,信息可跳转。
-
无状态:每次请求独立,不记忆历史(需额外技术维持)。
-
分布式:任何设备、任何地点都能访问。
-
动态交互:支持实时更新、异步加载、用户交互。
1.1.2 B / S 架构模型
B/S(Browser/Server,浏览器/服务器)架构是一种基于 Web 的软件应用模式,其核心特点是:
-
客户端统一:用户通过浏览器(如 Chrome、Edge)访问应用,无需安装额外软件。
-
服务端集中:业务逻辑、数据存储、计算等全部在服务器端完成。
-
通信协议:主要基于 HTTP/HTTPS 协议进行请求与响应。
-
跨平台性:任何支持浏览器的设备都能访问,不受操作系统限制。
-
易于维护:只需更新服务器端代码,所有客户端即时生效。
B / S 架构示意图:
┌─────────────┐ HTTP请求 ┌─────────────┐
│ 浏览器 │ ────────────────> │ Web服务器 │
│ (Client) │ <──────────────── │ (Nginx等) │
└─────────────┘ HTTP响应 └──────┬──────┘
│
│ 数据交互
▼
┌─────────────┐
│ 数据库/应用 │
└─────────────┘
1.2 Web 请求与响应过程
Web 请求与响应过程是从用户在浏览器输入 URL 到页面呈现的完整链路,通常包含以下关键步骤:
1. DNS 解析
-
浏览器缓存 → 操作系统 hosts 文件 → 本地 DNS 服务器 → 递归/迭代查询,获得目标服务器的 IP 地址。
2. 建立 TCP 连接(三次握手)
-
浏览器向服务器发起 SYN 请求。
-
服务器回应 SYN+ACK。
-
浏览器发送 ACK,连接建立。
Client Server
| |
| 1. SYN (seq=x) |
|------------------------------------->|
| |
| 2. SYN + ACK (seq=y, ack=x+1) |
|<-------------------------------------|
| |
| 3. ACK (ack=y+1) |
|------------------------------------->|
| |
| 连接建立成功 |
3. 发送 HTTP 请求
-
浏览器构建 HTTP 请求报文(包含请求行、请求头、空行、请求体)。
-
通过 TCP 连接发送到服务器。
4. 服务器处理请求
-
Web 服务器(如 Nginx)接收请求并解析。
-
根据请求路径(URL)决定处理方式:静态文件直接返回,动态请求转发给后端应用(如 PHP、Java、Node.js 等)。
-
后端处理(如查询数据库、业务逻辑)后生成响应内容。
5. 返回 HTTP 响应
-
服务器构建响应报文(状态行、响应头、空行、响应体)。
-
通过 TCP 连接发送回浏览器。
6. 浏览器解析渲染
-
解析 HTML、CSS、JS,构建 DOM 树、渲染树。
-
执行 JavaScript,请求子资源(图片、CSS、JS 等,可能重复第 1-5 步)。
-
最终呈现页面。
7. 连接关闭(四次挥手)
-
数据传输完成,浏览器或服务器主动发起 FIN 包,关闭 TCP 连接(也可用 Keep-Alive 复用连接)。
Client Server
| |
| 1. FIN (seq=u) |
|------------------------------------->|
| |
| 2. ACK (ack=u+1) |
|<-------------------------------------|
| |
| 3. FIN (seq=v) |
|<-------------------------------------|
| |
| 4. ACK (ack=v+1) |
|------------------------------------->|
| |
| 等待 2MSL 后关闭 | 立即关闭
1.3 静态资源与动态资源
在 Web 架构中,根据资源生成方式的不同,可划分为静态资源与动态资源两类。理解二者的区别及对应的处理策略,是优化 Web 性能和设计合理架构的基础。
静态资源
-
定义:服务器上预先存在的文件,内容不随请求而变化,可直接返回给客户端。
-
典型类型:HTML、CSS、JavaScript(.js)、图片(JPEG/PNG/SVG)、字体文件(.woff)、视频、PDF 等。
-
处理方式:Web 服务器(如 Nginx、Apache)收到请求后,直接读取磁盘上的文件并返回,无需调用后端应用(如 PHP、Java、Node.js)。
-
优点:响应速度快,对 CPU 消耗低,便于使用 CDN(内容分发网络)加速。
Nginx配置示例:
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; #开启浏览器缓存
root /var/www/static;
}
}
动态资源
-
定义:由后端应用程序在请求时实时生成的内容,不同用户、不同时间访问得到的结果可能不同。
-
典型类型:用户个人主页、订单列表、搜索结果的 HTML、JSON 格式的 API 响应等。
-
处理方式:Web 服务器将请求转发(代理)给后端应用(如 Tomcat、uWSGI、Node.js),应用执行数据库查询、业务逻辑后生成响应,再返回给客户端。
-
特点:内容丰富、个性化强,但对服务器资源(CPU、内存、数据库连接)消耗较大,需要合理设计缓存与并发策略。
Nginx 配置示例(反向代理):
location /api/ {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
动静分离
动静分离是指将静态内容与动态内容分开处理——由 Nginx 直接处理静态资源请求,动态请求则代理至后端应用服务器。这种架构可以显著减轻后端压力,提高整体并发能力,是 Web 性能优化的常用手段。
部署结构:
用户请求 → Nginx(反向代理)
├─ 匹配 *.css, *.js, *.png → 直接返回静态文件
└─ 匹配 /user/, /order/ → 代理到 Java/Tomcat 服务器
1.4 Web 发展阶段
| 阶段 | 核心特点 | 典型技术 | 用户角色 |
|---|---|---|---|
| Web 1.0 | 只读,静态页面 | HTML、门户网站 | 被动接收信息 |
| Web 2.0 | 交互,用户生成内容 | AJAX、社交网络 | 既读又写,参与互动 |
| Web 3.0 | 智能化、去中心化 | 区块链、语义网 | 数据自主、价值交换 |
二、HTTP 与 HTTPS 协议
HTTP(超文本传输协议)是 Web 数据通信的基础,而 HTTPS 是其安全版本。理解二者机制,对配置 Nginx 的 SSL 证书、优化传输安全至关重要。
2.1 HTTP 核心特点
-
无状态:每个请求独立,服务器不保留客户端上下文(后续需 Cookie/Session 维持)。
-
明文传输:数据不加密,易被窃听或篡改。
-
默认端口:80。
-
请求方法:GET、POST、PUT、DELETE、HEAD 等。
2.2 HTTPS 的改进
HTTPS = HTTP + SSL/TLS,在 HTTP 和 TCP 之间增加加密层。
| 特性 | HTTP | HTTPS |
|---|---|---|
| 加密 | ❌ 明文 | ✅ 对称加密 + 非对称加密 |
| 证书 | 无 | 需 CA(证书颁发机构)签发的证书 |
| 端口 | 80 | 443 |
| 安全性 | 低(易劫持、篡改) | 高(防窃听、防篡改、防冒充) |
| 性能 | 稍快(无加密开销) | 稍慢(握手+加密),但现代硬件影响很小 |
2.3 SSL/TLS 握手简要过程
-
客户端发送
ClientHello(支持的加密套件、随机数)。 -
服务器回复
ServerHello+ 证书(含公钥)。 -
客户端验证证书,生成
Pre-Master Secret并用服务器公钥加密发送。 -
双方根据协商的密钥生成会话密钥(对称加密)。
-
完成握手,开始加密通信。
2.4 HTTP状态码(重要)
HTTP 状态码由三位数字组成,表示服务器对请求的处理结果。Nginx 会根据上游服务器返回的状态码决定后续行为(如是否重试、缓存、记录日志等)。
3.1 分类概览
| 分类 | 范围 | 含义 |
|---|---|---|
| 1xx | 100-199 | 信息性,请求已接收,继续处理 |
| 2xx | 200-299 | 成功,请求被成功处理 |
| 3xx | 300-399 | 重定向,需进一步操作完成请求 |
| 4xx | 400-499 | 客户端错误,请求包含语法错误或无法完成 |
| 5xx | 500-599 | 服务端错误,服务器处理请求失败 |
3.2 常见状态码详解
| 状态码 | 含义 | 典型场景 | Nginx 相关 |
|---|---|---|---|
| 200 OK | 请求成功 | GET/POST 正常返回 | 代理成功,正常缓存 |
| 301 Moved Permanently | 永久重定向 | 域名更换,旧 URL 永久指向新地址 | 常用于 HTTP 跳转 HTTPS |
| 302 Found | 临时重定向 | 临时活动页、未登录跳转登录页 | 可配置 proxy_redirect 重写 Location 头 |
| 304 Not Modified | 资源未改变 | 客户端缓存生效,服务端返回此码 | 节省带宽 利用 expires 等缓存策略 |
| 400 Bad Request | 请求语法错误 | URL 参数错误、请求头过大 | Nginx 可配置 client_header_buffer_size 缓解 |
| 401 Unauthorized | 未授权 | 需要认证(如 Basic Auth) | 结合 auth_basic 模块使用 |
| 403 Forbidden | 禁止访问 | IP 被拒绝、目录无 index 文件 | 检查 allow/deny 指令、目录权限 |
| 404 Not Found | 资源不存在 | 请求的 URL 在服务器找不到 | 可自定义 error_page 404 页面 |
| 500 Internal Server Error | 服务器内部错误 | 后端 PHP/Java 代码异常 | 查看 Nginx error.log 和后端日志 |
| 502 Bad Gateway | 网关错误 | Nginx 无法从上游获得有效响应(如 PHP‑FPM 挂了) | 检查 upstream 服务,配置 proxy_next_upstream 实现故障转移 |
| 503 Service Unavailable | 服务不可用 | 服务器过载、限流触发、维护模式 | 排查 limit_req 限流配置、系统资源 |
| 504 Gateway Timeout | 网关超时 | 上游超过 proxy_read_timeout 未响应 |
增大超时时间或优化后端处理速度 |
三、Nginx 概念
3.1 Nginx 介绍
Nginx是一款高性能的 HTTP 服务器 和 反向代理服务器,同时支持邮件代理和通用的 TCP/UDP 代理。它由俄罗斯程序员伊戈尔·赛索耶夫(Igor Sysoev)开发,于 2004 年首次发布。
核心特点
| 特性 | 说明 |
|---|---|
| 高并发 | 采用异步、非阻塞的事件驱动模型,能处理数万甚至百万级并发连接 |
| 轻量级 | 内存占用低(几 MB 级别),非常适合资源受限的环境 |
| 高扩展性 | 模块化设计,支持丰富的第三方模块(如 SSL、Gzip、限流等) |
| 高可靠性 | 经过大量生产环境验证,稳定性极高 |
| 热部署 | 支持平滑升级配置和二进制文件,无需中断服务 |
常见用途
-
Web 服务器:托管静态文件(HTML、CSS、JS、图片),性能远超 Apache。
-
反向代理:将客户端请求转发给后端应用(Tomcat、Node.js、Python、Go 等)。
-
负载均衡:支持轮询、最少连接、IP 哈希等算法,分发请求到多台后端服务器。
-
HTTP 缓存:缓存后端响应,减少上游压力。
-
SSL/TLS 终结:处理 HTTPS 加密,卸载证书管理负担。
-
限流与访问控制:限制请求频率、IP 访问等。
-
日志与监控:提供访问日志、错误日志及基本的监控状态页。
Nginx 与 Apache 的简单对比
| 维度 | Nginx | Apache |
|---|---|---|
| 并发模型 | 事件驱动(异步非阻塞) | 进程/线程驱动(每请求占用一进程或线程) |
| 静态文件性能 | 极高 | 一般 |
| 动态内容处理 | 通常通过反向代理 | 可直接集成模块(mod_php) |
| 内存占用 | 低 | 较高 |
| 配置风格 | 简洁、声明式 | 更强大但更复杂 |
3.3 Nginx 进程结构
Nginx 采用 多进程模型,生产环境通常运行一个 主进程(master) 和多个 工作进程(worker),此外还可能包含缓存关联进程。
进程组成
| 进程类型 | 数量 | 职责 |
|---|---|---|
| Master 进程 | 1 | 读取配置、管理 worker 进程、接收信号(重启、热升级、日志切割) |
| Worker 进程 | 多个(通常等于 CPU 核心数) | 处理客户端请求,执行 I/O 事件,是真正处理请求的进程 |
| Cache Manager 进程(可选) | 1 | 管理磁盘缓存(加载、清理过期缓存) |
| Cache Loader 进程(可选) | 1 | 启动时加载磁盘缓存索引到内存 |
进程交互
-
Master 进程以 root 用户启动,监听特权端口(如 80、443)。
-
Worker 进程以普通用户(如 nginx、www-data)运行,降低安全风险。
-
Worker 之间通过共享内存实现负载均衡和会话保持(如
sticky模块)。 -
每个 Worker 独立处理连接,采用非阻塞事件驱动模型(epoll/kqueue),单进程可处理数万并发。
为什么是多进程而非多线程?
-
稳定性:一个 Worker 崩溃不影响其他 Worker,Master 会立即重启新的 Worker。
-
无锁设计:每个 Worker 独立处理请求,避免多线程竞争。
-
CPU 亲和性:可以绑定 Worker 到特定 CPU 核心,提升缓存命中率。
四、Nginx安装
4.1 关闭防火墙 核心防护 Nginx软件包下载 | yum 下载
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld #常态关闭防火墙
setenforce 0 #核心防护关闭
wget http://nginx.org/download/nginx-1.20.2 tar.gz
#解压安装的话 可能需要依赖包安装
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
yum install -y nginx
4.2 创建运行用户、组
#-M 不创建主目录
#-s /sbin/nologin 禁止交互式登录
useradd nginx -M -s /sbin/nologin
4.3 编译安装Nginx
#进入opt 解压nginx包 进入解压文件夹
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
--with-http_ssl_module # 启用 HTTPS 模块
补充:
Nginx -t 检查nginx语法
企业常用模块:
./configure \
--prefix=/usr/local/nginx \ # 安装目录
--user=nginx \ # 运行用户(后续会创建)
--group=nginx \ # 运行用户组
--with-http_ssl_module \ # 启用 HTTPS 模块
--with-http_v2_module \ # 启用 HTTP/2 协议(提升性能)
--with-http_gzip_static_module \ # 启用静态 gzip 压缩(预压缩 .gz 文件)
--with-http_stub_status_module \ # 启用状态监控模块(提供 /nginx_status 页面)
--with-pcre \ # 启用 PCRE 正则支持(rewrite 模块依赖)
--with-stream \ # 启用 TCP 代理模块(如反向代理 MySQL、Redis)
--with-stream_ssl_module \ # 启用 TCP 代理的 SSL 支持
--http-log-path=/var/log/nginx/access.log \ # 访问日志路径
--error-log-path=/var/log/nginx/error.log \ # 错误日志路径
--pid-path=/var/run/nginx/nginx.pid \ # PID 文件路径
--lock-path=/var/lock/nginx.lock # 锁文件路径(防止重复启动)
可根据需求增减模块(如 --without-xxx 禁用不需要的模块)
企业若需特殊模块(如第三方缓存模块),可通过 --add-module 引入
信号 0 (EXIT) - 程序退出时收到该信息
信号 1 (HUP) - 挂起,通常用于重载配置(平滑重启)
信号 2 (INT) - 中断,相当于 Ctrl+C,非强制结束
信号 3 (QUIT) - 退出,优雅停止
信号 9 (KILL) - 强制杀死进程
信号 11 (SEGV) - 段错误(内存访问越界)
信号 15 (TERM) - 终止,正常结束进程(kill 默认信号)
#快速停止(立即退出,不处理完当前请求)
kill -TERM <PID号>
kill -INT <PID号>
killall -TERM nginx
killall -INT nginx
#优雅停止(处理完当前请求后退出,同QUIT)
kill -QUIT <PID号>
killall -QUIT nginx
#平滑停止Worker(用于热升级,旧Worker不再接收新连接)
kill -WINCH <PID号>
killall -WINCH nginx
#重载配置(平滑重启Worker,同HUP)
kill -HUP <PID号>
killall -HUP nginx
#重新打开日志文件(日志切割)
kill -USR1 <PID号>
killall -USR1 nginx
#平滑升级二进制文件(启动新版本Master)
kill -USR2 <PID号>
killall -USR2 nginx
#获取Nginx版本信息(非信号,但常用)
/usr/local/nginx/sbin/nginx -v
总结
Web基础:梳理了 B/S 架构、请求-响应流程(7步)、动静资源区别及 Web 1.0→3.0 演进。
HTTP/HTTPS:对比安全差异,简述 TLS 握手流程,重点列出状态码分类(尤其 4xx/5xx)。
Nginx 实战:完整演示 1.20 版编译安装、进程结构、核心功能及与 Apache 对比。
后续预告:将深入反向代理、负载均衡、性能优化等实战内容。
本文为系列打下理论与操作基础,实现了从概念到工具的初步衔接。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)