前言

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的特点

  1. 统一访问:浏览器输入 URL 即可获取资源,操作简单。

  2. 超链接网状结构:页面通过链接互连,信息可跳转。

  3. 无状态:每次请求独立,不记忆历史(需额外技术维持)。

  4. 分布式:任何设备、任何地点都能访问。

  5. 动态交互:支持实时更新、异步加载、用户交互。

1.1.2 B / S 架构模型

B/S(Browser/Server,浏览器/服务器)架构是一种基于 Web 的软件应用模式,其核心特点是:

  1. 客户端统一:用户通过浏览器(如 Chrome、Edge)访问应用,无需安装额外软件。

  2. 服务端集中:业务逻辑、数据存储、计算等全部在服务器端完成。

  3. 通信协议:主要基于 HTTP/HTTPS 协议进行请求与响应。

  4. 跨平台性:任何支持浏览器的设备都能访问,不受操作系统限制。

  5. 易于维护:只需更新服务器端代码,所有客户端即时生效。

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 握手简要过程

  1. 客户端发送 ClientHello(支持的加密套件、随机数)。

  2. 服务器回复 ServerHello + 证书(含公钥)。

  3. 客户端验证证书,生成 Pre-Master Secret 并用服务器公钥加密发送。

  4. 双方根据协商的密钥生成会话密钥(对称加密)。

  5. 完成握手,开始加密通信。

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 对比。

后续预告:将深入反向代理、负载均衡、性能优化等实战内容。

本文为系列打下理论与操作基础,实现了从概念到工具的初步衔接。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐