当前位置: 首页 > news >正文

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

目录

前言

一、Web 基础:理解互联网信息交互的核心

1.1 Web 的本质与特点

1.2 B/S 架构:Web 服务的交互模型

1.3 一次 Web 请求的完整旅程

1.4 静态资源与动态资源的区别

1.5 Web 的发展阶段

1.6 实践:搭建最小 Web 服务

二、HTTP 与 HTTPS:Web 通信的核心协议

2.1 HTTP 与 HTTPS 的核心差异

2.2 HTTPS 的 TLS 握手流程

2.3 读懂 HTTP 状态码:服务器的 "回话信息"

三、Nginx:高性能 Web 服务器的核心认知

3.1 Nginx 是什么?

3.2 Nginx 与 Apache 的差异

3.3 Nginx 的进程结构

四、Nginx 安装

4.1.安装前准备

4.1.1 关闭防火墙与 SELinux

4.1.2 准备安装包

4.1.3 安装依赖包

4.1.4 创建专用运行用户

4.2.编译安装 Nginx

4.2.1 基础编译配置(适合简单场景)

4.2.2 企业级编译配置(适合生产环境)

4.3.Nginx 服务基础管理

4.3.1 配置文件检查

4.3.2 服务启动

4.3.3 服务停止

4.3.4 配置重载

4.3.5 其他常用信号操作

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 状态码是服务器对客户端请求的反馈,由三位数字组成,按首位分为五类,常见状态码含义如下:

类型范围核心含义常见状态码与场景
1xx100-199信息提示表示服务器已接收请求,正在处理
2xx200-299请求成功200 OK(请求正常返回)、201 Created(资源创建成功)
3xx300-399重定向301 永久重定向(页面地址变更)、304 未修改(使用本地缓存)
4xx400-499客户端错误400 请求格式错误、401 未登录、403 无权限、404 页面不存在
5xx500-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 在设计理念与性能表现上差异明显:

对比维度NginxApache
处理模型事件驱动流程驱动
进程管理无独立子进程概念基于子进程 / 线程
资源消耗内存占用低,连接效率高内存消耗较高,连接处理一般
性能依赖不依赖硬件,靠优化配置依赖 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 还支持日志分割、平滑升级等信号控制,常用信号含义如下表:

信号编号信号名含义说明
1HUP重载配置文件(不中断服务)
3QUIT优雅停止服务(处理完现有请求后退出)
9KILL强制停止服务(立即终止,可能丢失请求)
15TERM正常停止服务(默认信号,类似 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,再重启服务即可。

http://www.xdnf.cn/news/1456903.html

相关文章:

  • 基于腾讯云MCP广场服务Firecrawl MCP网络采集服务构建自动化竞品监测工作日志
  • App UI 自动化环境搭建指南
  • oracle、mysql等基于结果创建数据
  • Oracle 数据库如何查询列
  • 驱动开发系列70 - vkQueueSubmit实现
  • ICPC Central Russia Regional Contest, 2024
  • 音频生成算法综述
  • 深度学习中的学习率优化策略详解
  • vue3入门- script setup详解上
  • 【深度学习】(9)--调整学习率
  • ACMESSL自动续签教程
  • 安徽某能源企业积极推进运维智能化转型,引入高压配电房机器人巡检系统
  • 笔记2 FreeRTOS任务
  • 如何在Spring Boot项目中使用MapStruct?
  • 旅游安全急救实训室助力应急处置技能实战化
  • Websocket的Key多少个字节
  • 【Big Data】云原生与AI时代的存储基石 Apache Ozone 的技术演进路径
  • 深度学习篇---SENet网络结构
  • 【C语言】第二课 基础语法
  • 【开题答辩全过程】以 基于微信小程序的宠物领养系统为例,包含答辩的问题和答案
  • 理解 C# `async` 的本质:从同步包装到状态机
  • 云手机与网络游戏相结合的优势?
  • AI大模型企业落地指南-笔记05
  • 【75】OpenCV C++实战篇——OpenCV 图像拼接、全景拼接(教程合集)
  • 【华为培训笔记】ASON原理
  • 关于嵌入式学习——嵌入式硬件3
  • 如何在MacOS上卸载并且重新安装Homebrew
  • 企业微信SCRM工具推荐:微盛AI·企微管家为什么是首选?
  • c#泛型公共类示例
  • Next.js App Router 中文件系统路由与页面跳转实践(以用户详情页面为例)