前言
- web概念
- web的基本概念
- B/S架构模型
- web请求 与响应过程
- 静态页面 动态页面
- HTTP和HTTPS协议
- 两者区别,为什么都用https
- https握手流程
- HTTP状态码 1xx 2xx 3xx 4xx 5xx
- nginx概念
- 介绍
- 简述nginx和apache区别
- nginx进程结构
- 编译安装(为什么不用yum安装?)
1 web概念
1.1 web的基本概念
web是基于互联网的超文本信息系统,依赖于
HTTP/HTTPS 协议
特点
- 分布式:资源分布在世界各地的服务器上。
- 跨平台:只要有浏览器,就能访问资源。
-
无状态:每次 HTTP 请求都是独立的,服务器不会记住客户端状态(除非使用 Cookie/Session)。
web缓存原理
客户端 服务端
cookie缓存--->cookie_ID--->session_ID IP
↓
session缓存记录
cookie_ID 和 session_ID一一对应
1.2 B/S架构模型
Web 采用 B/S 架构(Browser/Server):
- Browser(浏览器):用户的入口,发送请求、渲染页面。
- Server(服务器):接收请求,返回所需资源或动态内容。
用户浏览器 ──> Web服务器(Nginx/Apache)
│
└─> 应用服务器(PHP/Python/Java)
│
└─> 数据库(MySQL/Redis)
1.3 Web请求与响应过程
- 输入URL
- DNS解析
- 建立TCP连接(三次握手)
- 发送HTTP请求
- 服务器处理
a. web服务器处理静态
b. 应用服务器处理动态页面(Tomcat、Django)
d. 数据库查询页面数据
[!note] 访问百度的过程:
- 浏览器输入网址
- DNS服务器进行网址解析
- 客户端通过三次握手和服务器建立TCP连接
- 客户端向服务器发送http请求头
- 服务端根据请求找到资源反馈给客户端
1.4 静态资源与动态资源
-
静态资源:不需要服务器额外处理,直接返回即可。
HTML、CSS、图片、视频、JS 文件
优点:速度快,压力小 -
动态资源:需要服务器端代码计算生成,再返回客户端。
PHP 脚本、Python Flask/Django、Java Servlet、Ruby
静态资源:用户请求 → Web服务器直接返回
动态资源:用户请求 → Web服务器 → 应用服务器运行代码 → 返回结果
2 HTTP和HTTPS协议
2.1 http与https区别
- HTTP:明文传输,不安全。
- HTTPS:在 HTTP 上加入 SSL/TLS 加密,防止中间人攻击。
2.2 HTTPS 握手流程
- TLS 握手过程:客户端发起请求 → 服务端返回证书 → 双方协商加密算法 → 建立安全通道。
客户端 Hello → 服务端 Hello + 证书 → 客户端验证 → 加密通信
TLS 握手过程(建立安全通道)
流程:
- 客户端 Hello
浏览器发起请求,告诉服务器自己支持哪些加密算法。 - 服务端 Hello + 证书
网站返回 SSL 证书(证明身份),选择一种加密算法。 - 客户端验证证书
浏览器检查证书是否可信(CA 颁发、没过期、域名匹配)。 - 协商密钥
双方生成一个临时密钥,用于对称加密后续通信。 - 加密通信开始
后续 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 常用状态码详解
2xx 成功
| 状态码 | 含义 | 类比 |
|---|---|---|
| 200 OK | 请求成功 | “东西拿到了” |
| 201 Created | 创建成功 | “你提交的表单/资源已创建” |
| 204 No Content | 成功,但没有内容 | “操作成功,但没有额外东西返回” |
3xx 重定向
| 状态码 | 含义 | 类比 |
|---|---|---|
| 301 Moved Permanently | 永久搬家 | “这个页面永久换地址了” |
| 302 Found | 临时搬家 | “暂时换地址,下一次还用旧地址” |
| 304 Not Modified | 内容未改 | “东西没变,你可以用缓存” |
4xx 客户端错误
| 状态码 | 含义 | 类比 |
|---|---|---|
| 400 Bad Request | 请求格式错 | “你写的请求我看不懂” |
| 401 Unauthorized | 未认证 | “先登录,再访问” |
| 403 Forbidden | 禁止访问 | “你没权限” |
| 404 Not Found | 找不到页面 | “东西搬走或根本没这东西” |
5xx 服务器错误
| 状态码 | 含义 | 类比 |
|---|---|---|
| 500 Internal Server Error | 服务器内部出错 | “服务器崩了” |
| 502 Bad Gateway | 网关错误 | “我去找别的服务器,结果那边挂了” |
| 503 Service Unavailable | 服务不可用 | “服务器忙不过来了,稍后再试” |
| 504 Gateway Timeout | 网关超时 | “找别的服务器太慢,超时了 |
3 nginx概念
3.1 简介
- 俄罗斯开发的web服务器
官网:https://nginx.org
功能特点 - 轻量级
- 高性能、占用内存少
- 高并发(单台3K~5W负载)
- 反向代理
- 负载均衡
3.2 Nginx和Apache的差异
- Nginx基于事件,Apache基于流程;
- Nginx避免子进程,Apache基于子进程;
- Nginx在内存消耗和连接方面更好;
- Nginx性能和可伸缩性不依赖硬件,Apache依赖于CPU和内存等硬件;
- Nginx支持热部署,Apache不支持热部署;
- Nginx静态文件处理效率更高;
- Nginx反向代理优势明显,Apache相对一般。
3.3 Nginx进程结构
web请求处理机制
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
4 编译安装Nginx
4.1 yum安装Nginx
推荐使用官方源或编译安装。简易脚本安装示例(CentOS):
yum install -y epel-release
yum install -y nginx
systemctl start nginx
systemctl enable nginx
4.2 编译安装Nginx
- 官方下载 https://nginx.org/download/nginx-1.20.2.tar.gz 下载到/opt目录下。
wget -o /opt/nginx-1.20.2.tar.gz https://nginx.org/download/nginx-1.20.2.tar.gz
- 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
- 安装依赖包
nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum install -y g*** g***-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
- 编译安装
# 解压
cd /opt
tar -zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
# 预处理
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
--prefix=:指定安装路径
--user=:指定用户名
--group=:指定组名
--with-*.module:增加模块
# 编译
make
# 安装
make install
# 添加命令链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 检查、启动、重启、停止 nginx服务
# 用nginx自带选项
nginx -t #检查配置文件是否正确
nginx #启动Nginx
nginx -s 信号 #向主进程发送信号: stop, quit, reopen, reload
# 用kill命令管理nginx进程
killall -信号 nginx #终止nginx进程
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号 |
4.3 新版本升级
- 下载或用其他方法把新版本放到/opt/目录下,这里1.22.0版本为例。
wget -o /opt/nginx-1.22.0.tar.gz https://nginx.org/download/nginx-1.22.0.tar.gz
- 检查旧版本信息,和模块。
nginx -V
nginx version: nginx/1.22.0
built by g*** 4.8.5 20150623 (Red Hat 4.8.5-44) (G***)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
- 编译并更新Nginx
# 解压
cd /opt
tar -zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
# 预处理
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
# 编译
make
- 替换二进制文件
# 备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
# 拷贝
cp objs/nginx /usr/local/nginx/sbin/nginx
# 升级
make upgrade
#重启nginx,或者先 killall nginx ,再/usr/local/nginx/sbin/nginx
# 检查版本信息
nginx -V
4.4 为什么不使用yum安装
反思:是否可以用yum安装nginx然后手工添加模块
- 可以但相对复杂,反而违背简化安装的初中。
- 源码安装版本控制容易一些。
- 源码安装自主可控
yum 安装后加模块 = 用相同版本源码 + 原参数 + 新模块 → 重新编译 → 替换二进制
查看原参数:nginx -V
需要注意:systemd和selinux的兼容性。yum更新会不会覆盖nginx。
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1 | 编译新 nginx 时,保持 configure 参数与原版一致(尤其是路径) | 避免 systemd 和文件路径冲突 |
| 2 | 用 cp 替换 /usr/sbin/nginx 后,立即执行 restorecon
|
修复 SELinux 上下文 |
| 3 | 启动前先 nginx -t 测试 |
避免配置或模块错误 |
| 4 | 使用 systemctl reload nginx 而非 restart(平滑) |
减少服务中断 |
| 5 |
锁定 yum 版本:yum versionlock nginx
|
防止后续 yum update 覆盖你的定制版本 |
- 覆盖后立即修复标签
sudo restorecon -v /usr/sbin/nginx
- 或批量修复整个 nginx 相关路径
sudo restorecon -Rv /usr/sbin/nginx /etc/nginx /var/log/nginx /var/cache/nginx