Web 与 Nginx 网站服务:从基础到实践

目录

前言

[一、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.安装前准备

[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 到页面最终呈现,需经历七个关键步骤:

  1. 输入 URL:用户输入目标网站地址(如http://www.example.com

  2. DNS 解析:浏览器将域名转换为服务器的 IP 地址,确定资源所在位置

  3. 建立连接:通过 TCP 三次握手,在浏览器与 Web 服务器之间建立稳定连接

  4. 发送请求:浏览器向服务器发起 HTTP 请求,指定请求方式(如 GET 获取资源、POST 提交数据)

  5. 服务器处理:Web 服务器区分请求类型,静态资源直接返回,动态资源转发至应用服务器,必要时查询数据库

  6. 返回响应:服务器将处理结果打包为 HTTP 响应报文,发送回浏览器

  7. 渲染页面:浏览器解析 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 建立安全连接需经过五次关键步骤,确保通信双方身份合法与数据加密:

  1. 客户端 Hello:浏览器向服务器发送请求,告知支持的加密算法列表

  2. 服务端 Hello + 证书:服务器返回 SSL 证书(证明自身身份),并选择一种加密算法

  3. 客户端验证证书:浏览器检查证书是否由可信 CA 机构颁发、是否过期、域名是否匹配

  4. 协商密钥:双方生成临时对称密钥,用于后续数据加密

  5. 加密通信:后续所有 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 基础编译配置(适合简单场景)
  1. 解压源码包至 /opt 目录,并进入源码目录:

    复制代码
    cd /opt
    tar zxvf nginx-1.20.2.tar.gz -C /opt/
    cd nginx-1.20.2/
  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 协议)
  3. 编译并安装(make 编译源码,make install 安装编译结果):

    此处make -j 4 表示有4个CPU

    复制代码
    make && make install
  4. 配置系统命令别名(让系统全局识别 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 信号,优雅停止,避免中断正在处理的请求):

  1. 查看 Nginx PID(PID 文件路径可在编译时通过 --pid-path 指定,默认在 /usr/local/nginx/logs/nginx.pid):

    复制代码
    cat /usr/local/nginx/logs/nginx.pid
  2. 优雅停止(二选一即可):

    复制代码
    kill -3 <PID号>       # 3 对应 QUIT 信号
    kill -s QUIT <PID号>
    killall -3 nginx      # 若有多个进程,用 killall 批量停止
  3. 强制停止(仅在优雅停止失败时使用,可能丢失请求):

    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. 下载并解压新版本源码包(以 1.22.0 为例):

    复制代码
    cd /opt
    tar zxvf nginx-1.22.0.tar.gz
    cd nginx-1.22.0/
  2. 执行编译配置(需与旧版本编译参数一致,确保模块兼容):

    复制代码
    ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module
  3. 仅编译源码(不执行 make install,避免覆盖旧版本文件):

    复制代码
    make
  4. 备份旧版本二进制文件,并替换为新版本:

    复制代码
    # 备份旧版本 Nginx 执行文件
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
    # 将新版本编译生成的执行文件复制到安装目录
    cp objs/nginx /usr/local/nginx/sbin/nginx
  5. 平滑升级(通过 USR2 信号启动新版本进程,WINCH 信号停止旧版本进程):

    复制代码
    # 启动新版本 Nginx 进程
    kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
    # 停止旧版本 Nginx 进程(优雅停止)
    kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
  6. 验证升级结果:

    复制代码
    # 查看当前 Nginx 版本
    nginx -V
    # 若输出版本为 1.22.0,说明升级成功

说明:若升级后出现问题,可回滚至旧版本:mv /usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx,再重启服务即可。

相关推荐
良木林10 小时前
JS对象进阶
前端·javascript
二进制coder10 小时前
Linux内存管理章节五:Linux物理内存管理的核心:伙伴系统深入分析
linux·运维·服务器
muyouking1110 小时前
一文吃透 CSS 伪类:从「鼠标悬停」到「斑马纹表格」的 30 个实战场景
前端·css
TE-茶叶蛋10 小时前
scss 转为原子css unocss
前端·css·scss
广药门徒10 小时前
正点原子LINUX imx6ull开发板的nfs传输配置(传输慢,失败等问题)
linux·运维·服务器
Sapphire~10 小时前
重学前端012 --- 响应式网页设计 CSS变量
前端·css
家里有只小肥猫10 小时前
css中的v-bind 动态变化
前端·css
超人不会飛10 小时前
LLM应用专属的Vue3 Markdown组件 🚀重磅开源!
前端·javascript·vue.js
NULL Not NULL10 小时前
ES6+新特性:现代JavaScript的强大功能
开发语言·前端·javascript