Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装

文章目录

  • 前言
  • [一、Web 概念](#一、Web 概念)
    • [1.1 Web 的基本概念](#1.1 Web 的基本概念)
      • [1.1.1 Web的特点](#1.1.1 Web的特点)
    • [1.2 B/S 架构模型](#1.2 B/S 架构模型)
    • [1.3 Web 请求与响应过程(重点)](#1.3 Web 请求与响应过程(重点))
    • [1.4 静态资源与动态资源](#1.4 静态资源与动态资源)
    • [1.5 Web 的发展阶段](#1.5 Web 的发展阶段)
    • [1.6 案例:搭建最小 Web 服务](#1.6 案例:搭建最小 Web 服务)
      • [1.6.1 目标](#1.6.1 目标)
      • [1.6.2 搭建步骤](#1.6.2 搭建步骤)
    • [1.7 小结](#1.7 小结)
  • [二、HTTP 与 HTTPS 协议](#二、HTTP 与 HTTPS 协议)
    • [2.1 HTTP与HTTPS区别](#2.1 HTTP与HTTPS区别)
    • [2.2 HTTPS 握手流程](#2.2 HTTPS 握手流程)
    • [2.3 HTTP状态码(重点)](#2.3 HTTP状态码(重点))
      • [2.3.1 HTTP 状态码概览](#2.3.1 HTTP 状态码概览)
      • [2.3.2 常用状态码详解](#2.3.2 常用状态码详解)
        • [2.3.2.1 2xx 成功](#2.3.2.1 2xx 成功)
        • [2.3.2.2 3xx 重定向](#2.3.2.2 3xx 重定向)
        • [2.3.2.3 4xx 客户端错误(重点)](#2.3.2.3 4xx 客户端错误(重点))
        • [2.3.2.4 5xx 服务器错误(重点)](#2.3.2.4 5xx 服务器错误(重点))
      • [2.3.3 生活中的 HTTP 状态码类比](#2.3.3 生活中的 HTTP 状态码类比)
  • [三、Nginx 概念](#三、Nginx 概念)
    • [3.1 Nginx 介绍](#3.1 Nginx 介绍)
      • [3.1.1 Nginx 官网](#3.1.1 Nginx 官网)
    • [3.2 Nginx与Apache的差异](#3.2 Nginx与Apache的差异)
    • [3.3 Nginx 进程结构](#3.3 Nginx 进程结构)
  • 四、Nginx安装
    • [4.1 关闭防火墙,将安装nginx所需软件包传到/opt目录下](#4.1 关闭防火墙,将安装nginx所需软件包传到/opt目录下)
    • [4.2 安装依赖包](#4.2 安装依赖包)
    • [4.3 创建运行用户、组](#4.3 创建运行用户、组)
    • [4.4 编译安装Nginx](#4.4 编译安装Nginx)
    • [4.5 检查、启动、重启、停止 nginx服务](#4.5 检查、启动、重启、停止 nginx服务)
    • [4.6 添加 Nginx 系统服务](#4.6 添加 Nginx 系统服务)
      • [4.6.1 方法一](#4.6.1 方法一)
      • [4.6.2 方法二](#4.6.2 方法二)
  • 总结

前言

在互联网技术体系中,Web 作为连接用户与信息的核心载体,其底层逻辑与关键技术是每一位技术学习者、运维工程师及开发人员必须掌握的基础。从用户在浏览器输入 URL 到页面最终呈现,背后涉及 Web 架构模型、请求响应流程、协议交互等一系列复杂机制;而 Nginx 作为当前主流的高性能 Web 服务器,更是支撑海量并发访问、保障服务稳定运行的关键工具。

为帮助读者系统性梳理 Web 技术体系,逐步掌握从理论到实践的完整技能链,特推出《Nginx 实战系列》文章。本系列将以 "概念解析 - 原理深挖 - 实战操作" 为核心逻辑,从基础到进阶,层层递进地讲解 Web 技术栈与 Nginx 的核心能力。

作为系列的第一篇,本文将聚焦 Web 的核心概念、HTTP/HTTPS 协议的关键机制,以及 Nginx 的安装配置,为后续深入学习反向代理、负载均衡、性能优化等内容打下坚实基础,无论是零基础入门还是技术复盘,都能从中获取清晰的知识框架与可落地的操作指南。


一、Web 概念

1.1 Web 的基本概念

Web(World Wide Web,万维网)是运行在互联网之上的一个超文本信息系统 ,它依赖于 HTTP/HTTPS 协议 实现浏览器与服务器之间的交互。

DNS解析:

生效顺序:1、host文件 2、网卡配置 3、/etc/resolv.conf

1.1.1 Web的特点

  • 分布式:资源分布在世界各地的服务器上。
  • 跨平台:只要有浏览器,就能访问资源。
  • 无状态:每次 HTTP 请求都是独立的,服务器不会记住客户端状态(除非使用 Cookie/Session)。

1.2 B/S 架构模型

Web 采用 B/S 架构(Browser/Server)

  • Browser(浏览器):用户的入口,发送请求、渲染页面。
  • Server(服务器):接收请求,返回所需资源或动态内容。

图 1-1:B/S 架构示意图

复制代码
用户浏览器 ──> Web服务器(Nginx/Apache)
                 │
                 └─> 应用服务器(PHP/Python/Java)
                          │
                          └─> 数据库(MySQL/Redis)

1.3 Web 请求与响应过程(重点)

一次完整的 Web 访问过程包括以下步骤:

  1. 输入 URL :用户在浏览器输入 http://www.example.com
  2. DNS 解析:浏览器将域名解析为 IP 地址。
  3. 建立连接:浏览器与 Web 服务器建立 TCP 连接(3 次握手)。
  4. 发送请求:浏览器发起 HTTP 请求(GET/POST)。
  5. 服务器处理
    • Web 服务器处理静态资源请求
    • 动态请求转发到应用服务器(如 Tomcat、Django)
    • 应用服务器可能再查询数据库
  6. 返回响应:Web 服务器将结果打包成 HTTP 响应报文返回浏览器。
  7. 渲染页面:浏览器解析 HTML、加载 CSS/JS、渲染最终页面。

图 1-2:Web 请求-响应流程

复制代码
浏览器 ----> Web服务器 ----> 应用服务器 ----> 数据库
    <----       <----             <---- 

1.4 静态资源与动态资源

  • 静态资源:不需要服务器额外处理,直接返回即可。

    • HTML、CSS、图片、视频、JS 文件
    • 优点:速度快,压力小
  • 动态资源:需要服务器端代码计算生成,再返回客户端。

    • PHP 脚本、Python Flask/Django、Java Servlet、Ruby

    • 优点:个性化内容,支持交互

图 1-3 静态与动态资源对比图

复制代码
静态资源:用户请求 → Web服务器直接返回
动态资源:用户请求 → Web服务器 → 应用服务器运行代码 → 返回结果

1.5 Web 的发展阶段

  • Web 1.0(只读):以静态网页为主,用户仅能被动浏览内容
  • Web 2.0(交互式):支持用户生成内容,AJAX等前端技术广泛应用
  • Web 3.0(智能化):引入语义网、区块链技术,推动去中心化网络发展

1.6 案例:搭建最小 Web 服务

注意后面安装nginx之后再创建一个静态页面

1.6.1 目标

体验一次最简单的 Web 请求与响应过程 Wireshark 并且抓包。
三次握手与四次挥手

1.6.2 搭建步骤

创建一个静态页面:

html 复制代码
<!-- 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>

HTML 文档结构
<!-- 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>

1.7 小结

  • Web 是基于 B/S 架构 的信息交互方式。
  • 核心是 请求-响应模型,通过 HTTP/HTTPS 协议传输数据。
  • Web 可提供 静态资源动态资源

二、HTTP 与 HTTPS 协议

2.1 HTTP与HTTPS区别

  • HTTP:明文传输,不安全。
  • HTTPS:在 HTTP 上加入 SSL/TLS 加密,防止中间人攻击。

2.2 HTTPS 握手流程

TLS 握手过程 :客户端发起请求 → 服务端返回证书 → 双方协商加密算法 → 建立安全通道。

客户端 Hello → 服务端 Hello + 证书 → 客户端验证 → 加密通信

TLS 握手过程(建立安全通道)

流程

  1. 客户端 Hello

    • 浏览器发起请求,告诉服务器自己支持哪些加密算法。
  2. 服务端 Hello + 证书

    • 网站返回 SSL 证书(证明身份),选择一种加密算法。
  3. 客户端验证证书

    • 浏览器检查证书是否可信(CA 颁发、没过期、域名匹配)。
  4. 协商密钥

    • 双方生成一个临时密钥,用于对称加密后续通信。
  5. 加密通信开始

    • 后续 HTTP 数据都通过加密通道传输。

2.3 HTTP状态码(重点)

2.3.1 HTTP 状态码概览

HTTP 状态码都是 三位数字,按首位分为五类:

类型 范围 含义 大白话理解
1xx 100--199 信息性状态码 "我收到了请求,还在处理中"
2xx 200--299 成功 "请求成功,服务器给你东西了"
3xx 300--399 重定向 "你要的东西搬家了,去新地址找"
4xx 400--499 客户端错误 "你请求有问题(URL错、权限不够)"
5xx 500--599 服务器错误 "服务器出问题,暂时拿不到东西"

2.3.2 常用状态码详解

2.3.2.1 2xx 成功
状态码 含义 类比
200 OK 请求成功 "东西拿到了"
201 Created 创建成功 "你提交的表单/资源已创建"
204 No Content 成功,但没有内容 "操作成功,但没有额外东西返回"
2.3.2.2 3xx 重定向
状态码 含义 类比
301 Moved Permanently 永久搬家 "这个页面永久换地址了"
302 Found 临时搬家 "暂时换地址,下一次还用旧地址"
304 Not Modified 内容未改 "东西没变,你可以用缓存"
2.3.2.3 4xx 客户端错误(重点)
状态码 含义 类比
400 Bad Request 请求格式错 "你写的请求我看不懂"
401 Unauthorized 未认证 "先登录,再访问"
403 Forbidden 禁止访问 "你没权限"
404 Not Found 找不到页面 "东西搬走或根本没这东西"
2.3.2.4 5xx 服务器错误(重点)
状态码 含义 类比
500 Internal Server Error 服务器内部出错 "服务器崩了"
502 Bad Gateway 网关错误 "我去找别的服务器,结果那边挂了"
503 Service Unavailable 服务不可用 "服务器忙不过来了,稍后再试"
504 Gateway Timeout 网关超时 "找别的服务器太慢,超时了"

2.3.3 生活中的 HTTP 状态码类比

场景 状态码 对应情况
打开网页正常 200 成功拿到网页
点链接页面搬家 301/302 浏览器自动跳到新地址
输入错网址 404 "没找到这个页面"
登录需要权限 401 "先登录才能看"
网站挂了 500 "服务器出问题了"

HTTP 状态码就是服务器对你请求的"回话信息",告诉你请求成功没、东西搬没搬、你有没有权限、或者服务器出问题了。


三、Nginx 概念

3.1 Nginx 介绍

Nginx ("engine x") 是一个高性能 的 HTTP 和反向代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日,Nginx 1.0.4 发布。企业中一般使用1.20版本。

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求 。并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度 BWS、新浪、网易、腾讯等。

Nginx 是一个 高性能 Web 服务器,它可以做很多事情:

  • 静态资源服务:可以直接把网页、图片、视频这些文件发给用户。
  • 反向代理:用户访问你的服务器,Nginx 可以帮你把请求转发到后端真正处理请求的服务器。
  • 负载均衡:Nginx 能够智能地将访问流量分配到多台后端服务器,确保每台服务器都能均衡处理请求,避免过载情况发生。
  • 高并发处理:用事件驱动的方式处理请求,能同时处理成千上万的用户请求,而不会占用太多资源。

优势

  • 轻量级,占用内存小
  • 支持百万级并发访问
  • 稳定可靠,开源且社区活跃

3.1.1 Nginx 官网

bash 复制代码
RamBler:http://www.rambler.ru/ 
nginx: http://nginx.org/

Mainline version 主线版本
Stable version 稳定版本
Legacy versions 老版本,遗产版本

旧版本下载:http://mirrors.sohu.com/nginx/
Nginx 中文参考地址: http://www.nginx.cn/doc/

3.2 Nginx与Apache的差异

  • Nginx是一个基于事件的Web服务器,Apache是一个基于流程的服务器;
  • Nginx避免子进程的概念,Apache是基于子进程的;
  • Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
  • Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
  • Nginx支持热部署,Apache不支持热部署;
  • Nginx对于静态文件处理具有更高效率,Apache相对一般;
  • Nginx在反向代理场景具有明显优势,Apache相对一般。

3.3 Nginx 进程结构

Web请求处理机制:

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

工作进程(worker process)的功能

复制代码
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

四、Nginx安装

4.1 关闭防火墙,将安装nginx所需软件包传到/opt目录下

bash 复制代码
cd /opt
wget https://nginx.org/download/nginx-1.20.2.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

4.2 安装依赖包

nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。

bash 复制代码
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

4.3 创建运行用户、组

Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限

bash 复制代码
#-M:不创建用户的主目录
#-s /sbin/nologin:将用户的登录shell设置为/sbin/nologin,禁止交互式登录
useradd -M -s /sbin/nologin nginx

4.4 编译安装Nginx

bash 复制代码
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 模块   

执行以下代码:

bash 复制代码
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
bash 复制代码
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/	#让系统识别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 压缩

--with-http_stub_status_module \ # 启用状态监控模块

--with-pcre \ # 启用 PCRE 正则支持(rewrite 依赖)

--with-stream \ # 启用 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 # 锁文件路径

注意:

可根据需求增减模块(如 --without-xxx 禁用不需要的模块)

企业若需特殊模块(如第三方缓存模块),可通过 --add-module 引入

4.5 检查、启动、重启、停止 nginx服务

bash 复制代码
#检查配置文件是否配置正确
nginx -t							
#启动
nginx


nginx拓展

bash 复制代码
#停止
cat /usr/local/nginx/logs/nginx.pid		#先查看nginx的PID号
kill -3 <PID号>
kill -s QUIT <PID号>
killall -3 nginx
killall -s QUIT nginx
#重载
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx
#日志分割,重新打开日志文件
kill -USR1 <PID号>
#平滑升级
kill -USR2 <PID号>
信号编号 信号名 含义
0 EXIT 程序退出时收到该信息。
1 HUP 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2 INT 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3 QUIT 退出。
9 KILL 杀死进程,即强制结束进程。
11 SEGV 段错误。
15 TERM 正常结束进程,是 kill 命令的默认信号

4.6 添加 Nginx 系统服务

4.6.1 方法一

bash 复制代码
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20    // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
#description:Nginx Service Control Script    //这也是必须的 
COM="/usr/local/nginx/sbin/nginx" 
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
  $COM
;;

stop)
  kill -s QUIT $(cat $PID)
;;

restart)
  $0 stop
  $0 start
;;

reload)
  kill -s HUP $(cat $PID)
;;

*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1

esac
exit 0
bash 复制代码
chmod +x /etc/init.d/nginx
chkconfig --add nginx				 #添加为系统服务
systemctl stop nginx   
systemctl start nginx


4.6.2 方法二

bash 复制代码
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
复制代码
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务

[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定
PIDFile以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径

[Install]服务安装的相关设置,可设置为多用户
bash 复制代码
chmod 754 /lib/systemd/system/nginx.service

systemctl start nginx.service
systemctl enable nginx.service




总结

本文作为《Nginx 实战系列》的开篇,围绕 Web 技术体系的 "基础层" 与 "工具层" 展开,完成了从理论到实践的初步衔接。在 Web 概念部分,我们明确了 Web 作为超文本信息系统的本质,梳理了 B/S 架构的组成、一次完整 Web 请求 - 响应的 7 个关键步骤,并区分了静态资源与动态资源的差异,同时回顾了 Web 从 1.0 到 3.0 的发展脉络,帮助读者建立对 Web 技术的整体认知。

HTTP/HTTPS 协议部分,重点对比了两者的安全性差异,拆解了 TLS 握手的 5 个核心流程,并系统梳理了 HTTP 状态码的分类与常用场景 ------ 尤其是 4xx 客户端错误与 5xx 服务器错误的典型状态码,为后续问题排查提供了关键依据。

Nginx 实战部分,我们从环境准备、依赖安装、用户创建,到编译配置、服务启停与系统服务注册,完整呈现了 Nginx 1.20 版本的安装流程,同时补充了 Nginx 的进程结构、核心功能(静态资源服务、反向代理等)及与 Apache 的差异,让读者不仅能完成安装操作,更能理解背后的设计逻辑。

后续系列文章将在此基础上,进一步深入 Nginx 的核心配置(如反向代理、负载均衡)、性能优化、日志分析与故障排查等内容,持续完善 Web 技术与 Nginx 实战的知识体系,助力读者将理论转化为实际应用能力。

相关推荐
武文斌774 小时前
单片机:DS18B20测温度、74HC595扩展芯片、8*8LED矩阵
运维·服务器·单片机·嵌入式硬件
fengfuyao9855 小时前
诊断并修复SSH连接Github时遇到的“connection closed“错误
运维·ssh·github
scugxl5 小时前
centos7 docker离线安装
运维·docker·容器
阿sir1985 小时前
ZYNQ 自定义IP
服务器·网络·tcp/ip
绿箭柠檬茶7 小时前
Ubuntu 使用 Samba 共享文件夹
linux·运维·ubuntu
工藤新一¹8 小时前
Linux —— 虚拟进程地址空间
linux·运维·服务器·c/c++·虚拟进程地址空间
Aspiresky8 小时前
浅析Linux内核scatter-gather list实现
linux·dma·scatter/gather
奔跑吧 android8 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 3】【模拟input子系统input_dev和input_handler之间的多对多关系】
linux·数据结构·input·kernel·input_dev·input_handler·input_handle
再难也得平9 小时前
Linux初级篇
linux·运维·服务器