目录
[一、Web 基础:理解互联网信息交互的核心](#一、Web 基础:理解互联网信息交互的核心)
[1.1 Web 的本质与特点](#1.1 Web 的本质与特点)
[1.2 B/S 架构:Web 服务的交互模型](#1.2 B/S 架构:Web 服务的交互模型)
[1.3 一次 Web 请求的完整旅程](#1.3 一次 Web 请求的完整旅程)
[1.4 静态资源与动态资源的区别](#1.4 静态资源与动态资源的区别)
[1.5 Web 的发展阶段](#1.5 Web 的发展阶段)
[1.6 实践:搭建最小 Web 服务](#1.6 实践:搭建最小 Web 服务)
[二、HTTP 与 HTTPS:Web 通信的核心协议](#二、HTTP 与 HTTPS:Web 通信的核心协议)
[2.1 HTTP 与 HTTPS 的核心差异](#2.1 HTTP 与 HTTPS 的核心差异)
[2.2 HTTPS 的 TLS 握手流程](#2.2 HTTPS 的 TLS 握手流程)
[2.3 读懂 HTTP 状态码:服务器的 "回话信息"](#2.3 读懂 HTTP 状态码:服务器的 "回话信息")
[三、Nginx:高性能 Web 服务器的核心认知](#三、Nginx:高性能 Web 服务器的核心认知)
[3.1 Nginx 是什么?](#3.1 Nginx 是什么?)
[3.2 Nginx 与 Apache 的差异](#3.2 Nginx 与 Apache 的差异)
[3.3 Nginx 的进程结构](#3.3 Nginx 的进程结构)
[四、Nginx 安装](#四、Nginx 安装)
[4.1.1 关闭防火墙与 SELinux](#4.1.1 关闭防火墙与 SELinux)
[4.1.2 准备安装包](#4.1.2 准备安装包)
[4.1.3 安装依赖包](#4.1.3 安装依赖包)
[4.1.4 创建专用运行用户](#4.1.4 创建专用运行用户)
[4.2.编译安装 Nginx](#4.2.编译安装 Nginx)
[4.2.1 基础编译配置(适合简单场景)](#4.2.1 基础编译配置(适合简单场景))
[4.2.2 企业级编译配置(适合生产环境)](#4.2.2 企业级编译配置(适合生产环境))
[4.3.Nginx 服务基础管理](#4.3.Nginx 服务基础管理)
[4.3.1 配置文件检查](#4.3.1 配置文件检查)
[4.3.2 服务启动](#4.3.2 服务启动)
[4.3.3 服务停止](#4.3.3 服务停止)
[4.3.4 配置重载](#4.3.4 配置重载)
[4.3.5 其他常用信号操作](#4.3.5 其他常用信号操作)
[4.4.Nginx 版本平滑升级](#4.4.Nginx 版本平滑升级)
前言
在互联网技术体系中,Web 服务与服务器软件是支撑各类网站与应用运行的核心。本文将从 Web 的基本概念入手,逐步深入 HTTP/HTTPS 协议细节,再到 Nginx 服务器的安装、配置与虚拟主机搭建,为大家梳理一套系统的 Web 服务知识与实践方案。
一、Web 基础:理解互联网信息交互的核心
1.1 Web 的本质与特点
Web(万维网)并非互联网本身,而是运行在互联网之上的超文本信息系统,依赖 HTTP/HTTPS 协议实现浏览器与服务器的交互。它具有三大关键特点:
-
分布式:资源分散存储在全球各地的服务器中,用户通过网络即可访问
-
跨平台:无论使用 Windows、macOS 还是 Linux 系统,只要安装浏览器,就能访问 Web 资源
-
无状态:每次 HTTP 请求都是独立的,服务器默认不会记住客户端历史操作,需借助 Cookie 或 Session 实现状态保持
1.2 B/S 架构:Web 服务的交互模型
Web 采用 Browser/Server(浏览器 / 服务器)架构,整个交互流程涉及三个核心角色:
-
客户端(浏览器):用户操作入口,负责发送资源请求、解析并渲染服务器返回的页面
-
Web 服务器(如 Nginx、Apache):接收客户端请求,处理静态资源(如 HTML、CSS),或转发动态请求至应用服务器
-
后端支撑:包括应用服务器(如 Tomcat、Django)与数据库(如 MySQL、Redis),负责处理动态业务逻辑与数据存储
1.3 一次 Web 请求的完整旅程
当用户在浏览器输入 URL 到页面最终呈现,需经历七个关键步骤:
-
输入 URL:用户输入目标网站地址(如http://www.example.com)
-
DNS 解析:浏览器将域名转换为服务器的 IP 地址,确定资源所在位置
-
建立连接:通过 TCP 三次握手,在浏览器与 Web 服务器之间建立稳定连接
-
发送请求:浏览器向服务器发起 HTTP 请求,指定请求方式(如 GET 获取资源、POST 提交数据)
-
服务器处理:Web 服务器区分请求类型,静态资源直接返回,动态资源转发至应用服务器,必要时查询数据库
-
返回响应:服务器将处理结果打包为 HTTP 响应报文,发送回浏览器
-
渲染页面:浏览器解析 HTML 结构,加载 CSS 样式与 JS 脚本,最终呈现完整页面
1.4 静态资源与动态资源的区别
Web 资源分为静态与动态两类,二者处理方式与应用场景差异显著:
-
静态资源:无需服务器额外处理,直接返回给客户端,包括 HTML、CSS、图片、视频、JS 文件等。优点是加载速度快,对服务器压力小,适合展示固定内容
-
动态资源:需服务器端执行代码生成内容,如 PHP 脚本、Python Django 项目、Java Servlet 等。优点是支持个性化内容与用户交互,如用户登录、数据查询等功能
1.5 Web 的发展阶段
从诞生至今,Web 经历了三次重要演进:
-
Web 1.0(只读时代):以静态页面为主,用户只能浏览内容,无法参与创作
-
Web 2.0(交互时代):引入 AJAX 等技术,用户可生成内容(如博客、社交平台),强调互动性
-
Web 3.0(智能时代):融合语义网、区块链、去中心化技术,追求更智能、更安全的信息交互
1.6 实践:搭建最小 Web 服务
通过简单步骤,可快速体验 Web 请求与响应过程:
①创建静态页面文件 index.html,内容如下:
<html>
<head><title>My First Web</title></head>
<body>
<h1>Hello Web!</h1>
<p>This is my first web page.</p>
</body>
</html>
②后续安装 Nginx 后,将该文件放入网站根目录,即可通过浏览器访问,同时可使用 Wireshark 抓包分析请求过程
二、HTTP 与 HTTPS:Web 通信的核心协议
2.1 HTTP 与 HTTPS 的核心差异
-
HTTP:采用明文传输数据,安全性低,易被中间人窃取或篡改,常见于非敏感信息传输
-
HTTPS:在 HTTP 基础上加入 SSL/TLS 加密层,通过证书验证服务器身份,保障数据传输安全,适用于支付、登录等敏感场景
2.2 HTTPS 的 TLS 握手流程
HTTPS 建立安全连接需经过五次关键步骤,确保通信双方身份合法与数据加密:
-
客户端 Hello:浏览器向服务器发送请求,告知支持的加密算法列表
-
服务端 Hello + 证书:服务器返回 SSL 证书(证明自身身份),并选择一种加密算法
-
客户端验证证书:浏览器检查证书是否由可信 CA 机构颁发、是否过期、域名是否匹配
-
协商密钥:双方生成临时对称密钥,用于后续数据加密
-
加密通信:后续所有 HTTP 数据均通过临时密钥加密传输,保障安全性
2.3 读懂 HTTP 状态码:服务器的 "回话信息"
HTTP 状态码是服务器对客户端请求的反馈,由三位数字组成,按首位分为五类,常见状态码含义如下:
类型 | 范围 | 核心含义 | 常见状态码与场景 |
---|---|---|---|
1xx | 100-199 | 信息提示 | 表示服务器已接收请求,正在处理 |
2xx | 200-299 | 请求成功 | 200 OK(请求正常返回)、201 Created(资源创建成功) |
3xx | 300-399 | 重定向 | 301 永久重定向(页面地址变更)、304 未修改(使用本地缓存) |
4xx | 400-499 | 客户端错误 | 400 请求格式错误、401 未登录、403 无权限、404 页面不存在 |
5xx | 500-599 | 服务器错误 | 500 服务器内部故障、502 网关错误、503 服务繁忙、504 网关超时 |
日常生活中,我们也能直观感受到状态码的作用:输入正确网址显示页面(200)、点击失效链接提示 "404"、网站崩溃时无法访问(500),这些都是状态码在背后发挥作用。
三、Nginx:高性能 Web 服务器的核心认知
3.1 Nginx 是什么?
Nginx(发音 "engine x")是一款轻量级高性能的 HTTP 服务器与反向代理服务器,由俄罗斯开发者 Igor Sysoev 开发,2004 年发布首个公开版本。它具有以下优势:
-
高并发:单台物理服务器可支持 3 万 - 5 万并发请求,采用事件驱动模型,资源消耗低
-
多功能:支持静态资源服务、反向代理、负载均衡、邮件代理等场景
-
稳定性强:开源且社区活跃,长期在高流量网站(如百度、新浪、腾讯)中应用
-
轻量级:占用内存少,不依赖硬件性能,可在低配服务器上稳定运行
Nginx 官网(nginx)提供三种版本:主线版本(Mainline)、稳定版本(Stable)、旧版本(Legacy),实际生产环境建议选择稳定版本。
3.2 Nginx 与 Apache 的差异
作为两款主流 Web 服务器,Nginx 与 Apache 在设计理念与性能表现上差异明显:
对比维度 | Nginx | Apache |
---|---|---|
处理模型 | 事件驱动 | 流程驱动 |
进程管理 | 无独立子进程概念 | 基于子进程 / 线程 |
资源消耗 | 内存占用低,连接效率高 | 内存消耗较高,连接处理一般 |
性能依赖 | 不依赖硬件,靠优化配置 | 依赖 CPU、内存等硬件资源 |
热部署支持 | 支持(无需重启服务更新配置) | 不支持 |
静态资源处理 | 效率高 | 效率一般 |
反向代理能力 | 优势明显 | 相对较弱 |
3.3 Nginx 的进程结构
Nginx 采用 "主进程 + 工作进程" 的架构,分工明确且高效:
-
主进程(Master Process):负责管理工作进程,如启动、重启、停止工作进程,读取并验证配置文件
-
工作进程(Worker Process):实际处理客户端请求,所有工作进程平等,数量建议设置为服务器 CPU 核心数,充分利用硬件资源,同时避免进程竞争导致的性能损耗
工作进程的核心职责包括:接收客户端请求、调用功能模块(如 Gzip、SSL)处理请求、与后端服务器通信、缓存数据、返回响应结果等。
四、Nginx 安装
4.1.安装前准备
在开始编译安装前,需完成环境初始化与依赖包安装,确保后续操作顺利进行。
4.1.1 关闭防火墙与 SELinux
为避免防火墙规则或 SELinux 策略阻止 Nginx 运行,先执行以下命令关闭相关防护(生产环境建议按需配置规则,而非直接关闭):
# 停止防火墙服务
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
# 临时关闭 SELinux(重启后失效)
setenforce 0
4.1.2 准备安装包
从 Nginx 官方下载源码包,并上传至服务器的 /opt
目录(官方下载地址:https://nginx.org/download/nginx-1.20.2.tar.gz),最终 /opt
目录下应包含文件:nginx-1.20.2.tar.gz
。
4.1.3 安装依赖包
Nginx 的编译与运行依赖 pcre
(正则支持)、zlib
(压缩支持)、openssl
(HTTPS 支持)等库,需安装对应的开发包:
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
4.1.4 创建专用运行用户
为避免 Nginx 以 nobody
身份运行带来的权限风险,创建仅用于运行 Nginx 的专用用户(-M
不创建家目录,-s
指定登录 shell 为 /sbin/nologin
,禁止直接登录):
useradd -M -s /sbin/nologin nginx
4.2.编译安装 Nginx
根据实际需求选择基础编译配置或企业级编译配置,灵活启用所需模块。
4.2.1 基础编译配置(适合简单场景)
-
解压源码包至
/opt
目录,并进入源码目录:cd /opt tar zxvf nginx-1.20.2.tar.gz -C /opt/ cd nginx-1.20.2/
-
执行
./configure
配置编译参数(指定安装路径、运行用户及核心模块):./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
./configure \ --prefix=/usr/local/nginx \ # 指定 Nginx 安装路径 --user=nginx \ # 指定运行用户为 nginx --group=nginx \ # 指定运行用户组为 nginx --with-http_stub_status_module \ # 启用状态统计模块(用于监控 Nginx 状态) --with-http_ssl_module # 启用 HTTPS 模块(支持 HTTPS 协议)
-
编译并安装(
make
编译源码,make install
安装编译结果):此处make -j 4 表示有4个CPU
make && make install
-
配置系统命令别名(让系统全局识别
nginx
命令,无需输入完整路径):ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
4.2.2 企业级编译配置(适合生产环境)
生产环境中需考虑日志路径、模块扩展、性能优化等需求,可使用以下增强型配置(按需增减模块,--without-xxx
可禁用不需要的模块):
./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 压缩(减少带宽占用)
--with-http_stub_status_module \ # 启用状态监控模块
--with-pcre \ # 启用 PCRE 正则支持(rewrite 规则依赖)
--with-stream \ # 启用 TCP 代理模块(支持反向代理数据库等 TCP 服务)
--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 # 自定义锁文件路径
说明:若需引入第三方模块(如缓存模块),可通过
--add-module=/路径/模块源码
参数添加。
4.3.Nginx 服务基础管理
掌握 Nginx 配置检查、启动、停止、重载等核心操作,是日常运维的基础。
4.3.1 配置文件检查
修改 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf
)后,需先检查配置语法是否正确,避免启动失败:
nginx -t
# 成功提示:nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
# nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
4.3.2 服务启动
首次启动或停止后重启 Nginx,直接执行以下命令:
nginx
4.3.3 服务停止
停止 Nginx 需先获取进程 PID,再通过信号控制(推荐使用 QUIT
信号,优雅停止,避免中断正在处理的请求):
-
查看 Nginx PID(PID 文件路径可在编译时通过
--pid-path
指定,默认在/usr/local/nginx/logs/nginx.pid
):cat /usr/local/nginx/logs/nginx.pid
-
优雅停止(二选一即可):
kill -3 <PID号> # 3 对应 QUIT 信号 kill -s QUIT <PID号> killall -3 nginx # 若有多个进程,用 killall 批量停止
-
强制停止(仅在优雅停止失败时使用,可能丢失请求):
bash
kill -9 <PID号> # 9 对应 KILL 信号 killall -9 nginx
4.3.4 配置重载
修改配置后无需重启服务,通过 HUP
信号重载配置(不中断现有连接):
kill -1 <PID号> # 1 对应 HUP 信号
kill -s HUP <PID号>
killall -1 nginx
4.3.5 其他常用信号操作
除上述操作外,Nginx 还支持日志分割、平滑升级等信号控制,常用信号含义如下表:
信号编号 | 信号名 | 含义说明 |
---|---|---|
1 | HUP | 重载配置文件(不中断服务) |
3 | QUIT | 优雅停止服务(处理完现有请求后退出) |
9 | KILL | 强制停止服务(立即终止,可能丢失请求) |
15 | TERM | 正常停止服务(默认信号,类似 QUIT) |
- | USR1 | 重新打开日志文件(用于日志分割) |
- | USR2 | 启动新的 Nginx 进程(用于版本平滑升级) |
示例:日志分割时重新打开日志文件
kill -USR1 <PID号>
4.4.Nginx 版本平滑升级
当需要升级 Nginx 版本(如从 1.20.2 升级到 1.22.0)时,可通过平滑升级避免服务中断,步骤如下:
-
下载并解压新版本源码包(以 1.22.0 为例):
cd /opt tar zxvf nginx-1.22.0.tar.gz cd nginx-1.22.0/
-
执行编译配置(需与旧版本编译参数一致,确保模块兼容):
./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module \ --with-http_ssl_module
-
仅编译源码(不执行
make install
,避免覆盖旧版本文件):make
-
备份旧版本二进制文件,并替换为新版本:
# 备份旧版本 Nginx 执行文件 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old # 将新版本编译生成的执行文件复制到安装目录 cp objs/nginx /usr/local/nginx/sbin/nginx
-
平滑升级(通过
USR2
信号启动新版本进程,WINCH
信号停止旧版本进程):# 启动新版本 Nginx 进程 kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) # 停止旧版本 Nginx 进程(优雅停止) kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
-
验证升级结果:
# 查看当前 Nginx 版本 nginx -V # 若输出版本为 1.22.0,说明升级成功
说明:若升级后出现问题,可回滚至旧版本:
mv /usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx
,再重启服务即可。