目录
- [Kickstart 与自动化安装](#Kickstart 与自动化安装)
- 系统故障排除
- [sudo 权限管理](#sudo 权限管理)
- 加密基础与算法
- [SSL/TLS 与 OpenSSL](#SSL/TLS 与 OpenSSL)
- [OpenSSH 与密钥认证](#OpenSSH 与密钥认证)
- [DNS 域名解析](#DNS 域名解析)
- [BIND 配置与管理](#BIND 配置与管理)
- [DHCP 服务](#DHCP 服务)
- [HTTP 协议与 Web 架构](#HTTP 协议与 Web 架构)
- [httpd (Apache) 安装与配置](#httpd (Apache) 安装与配置)
- [httpd 虚拟主机与 HTTPS](#httpd 虚拟主机与 HTTPS)
📌 核心概念一览
| 主题 | 核心概念 | 一句话 |
|---|---|---|
| 系统安装 | Anaconda、Kickstart | Anaconda 是 RHEL/Fedora 安装程序;Kickstart 用 ks 文件实现无人值守安装 |
| 故障排除 | 单用户模式、救援模式、MBR/grub 修复 | 确定特征→重现→收集信息→从简单入手、一次一种、先备份 |
| 权限管理 | sudo、/etc/sudoers | 让普通用户以指定身份执行命令;条目格式 who which_hosts=(runas) TAG:command |
| 加密 | 对称、单向、非对称 | 对称快但密钥分发难;单向做摘要;非对称做身份认证与密钥交换 |
| PKI/SSL | CA、x509、OpenSSL | CA 签发证书;SSL/TLS 在应用层下加密;OpenSSL 实现工具 |
| SSH | OpenSSH、密钥认证、scp/sftp | 加密远程登录;密钥认证免密;scp 传文件 |
| DNS | 域名解析、递归/迭代、主/从/缓存 | FQDN↔IP;stub resolver 查 /etc/hosts 再问 DNS;BIND/named 实现 |
| 资源记录 | SOA、NS、A、MX、PTR、CNAME | DNS 数据库条目;SOA 定义区域属性;NS 指定名称服务器;A 做正向解析 |
| DHCP | 动态主机配置、67/68 UDP | DISCOVER→OFFER→REQUEST→ACK 四步获取 IP/掩码/网关/DNS |
| HTTP | 超文本传输、请求/响应报文 | GET/POST 方法;状态码 2xx 成功、3xx 重定向、4xx 客户端错、5xx 服务端错 |
| httpd | Apache、MPM、虚拟主机 | prefork/worker/event 三种并发模型;基于 IP/端口/域名的虚拟主机 |
| CGI | 通用网关接口 | httpd 调用外部程序生成动态内容;FastCGI 为改进版 |
| HTTPS | HTTP over SSL/TLS | 443/tcp;mod_ssl;需证书与私钥 |
Kickstart 与自动化安装 🚀
Anaconda 简介
Anaconda 是 Red Hat Linux 和 Fedora 的安装管理程序,用 Python 与 C 编写,提供:
- 图形界面:PyGTK
- 文本界面:python-newt
可用于自动安装配置,最小化人工参与;支持 RHEL、Fedora 等多种系统。
名字由来:Anaconda 是一种吃蜥蜴的蟒蛇,因 Caldera 的安装程序名为 lizard(蜥蜴),故得名。
Kickstart 三部分结构
Kickstart 用于完成无人值守自动化安装 ,由一份 ks 配置文件驱动。

| 部分 | 起始标记 | 内容 |
|---|---|---|
| 命令段 | (无特殊标记,文件开头) | 必备命令(keyboard/lang/timezone/rootpw/auth/bootloader)+ 可选命令(autopart/clearpart/network/firewall 等) |
| 软件包段 | %packages |
列出要安装的包或组,如 @base、httpd |
| 脚本段 | %pre、%post |
%pre 在安装前执行(可用工具有限);%post 在安装后执行(常用于配置) |
生活例子:Kickstart 像"装修清单"------命令段是"房型、墙色、地板",软件包段是"家具清单",脚本段是"装完后挂画、通电、贴对联"。
为什么需要 Kickstart?
大批量装机时,交互式安装每台都要选语言、分区、软件包,既慢又易出错。Kickstart 把所有选项写进 ks 文件,通过网络或光盘提供;安装程序按文件执行,实现无人值守,便于机房批量部署和环境一致性。
命令段:必备命令
| 命令 | 说明 | 示例 |
|---|---|---|
| keyboard | 键盘布局 | keyboard us |
| lang | 语言 | lang en_US 或 zh_CN;locale -a 可查所有支持语言 |
| timezone | 时区 | timezone [--utc] Asia/Shanghai;timeconfig 可查时区,乱码可 export LANG=C |
| rootpw | root 密码 | rootpw --iscrypted <加密串> 或 rootpw yourpassword |
| auth / authconfig | 认证方式 | 如 authconfig --enableshadow --passalgo=sha512 |
| bootloader | 引导程序 | bootloader --location=mbr --append="hdd=ide-scsi ide=nodma" |
命令段:常用可选命令
| 命令 | 说明 | 示例/选项 |
|---|---|---|
| autopart | 自动分区 | 按默认策略分区 |
| clearpart | 清除分区 | --all(全清)、--linux(仅 Linux 分区)、--none(默认,用空闲空间)、--initlabel(无分区表时初始化);慎用,指错可致命 |
| ignoredisk | 忽略/仅用某盘 | ignoredisk --drives=sdb,sdc 或 --only-use=sda |
| driverdisk | 驱动盘位置 | driverdisk --source=http://path/to/dd.img 或 nfs:host:/path |
| firewall | 防火墙 | firewall --enabled/--disabled;--trust 可跟 --ssh、--http、--ftp 等 |
| firstboot | 首次启动向导 | firstboot --disabled 或 --enabled |
| halt | 装完后关机 | 无参数即关机 |
| graphical / text | 安装界面 | graphical(默认,图形)或 text(纯文本) |
| install / upgrade | 安装或升级 | install;url --url http://server/dir 或 ftp://user:pass@server/dir |
| interactive | 交互模式 | 与自动化矛盾,一般不用 |
| part | 磁盘分区 | 定义具体分区,如 part / --fstype=ext4 --size=10240 |
| network | 网络配置 | network --bootproto=dhcp 或 --bootproto=static --ip=... --netmask=... --gateway=... --nameserver=... 可加 --device=eth0 |
| selinux | SELinux | selinux --permissive 或 --disabled |
| skipx | 跳过 X 配置 | 不装图形界面时用 |
ks 文件放在哪、安装时如何指定
ks 文件位置 (通过 ks= 指定):
| 位置 | 示例 |
|---|---|
| HTTP | ks=http://server/path/ks.cfg |
| FTP | ks=ftp://user:pass@server/path/ks.cfg |
| NFS | ks=nfs:server:/path/ks.cfg |
| 光盘 | ks=cdrom:/ks.cfg |
| 硬盘 | ks=hd:sda1:/ks.cfg |
| 软盘 | ks=floppy:/ks.cfg |
| 本地文件 | ks=file:/path/ks.cfg |
安装时 boot 提示符可用命令
| 命令 | 说明 |
|---|---|
| askmethod | 手动选择安装方式 |
| dd= | 指定驱动盘 |
| ip= / netmask= / gateway= / dns= | 配置网络(如 dns=8.8.8.8,8.8.4.4) |
| ks= | 指定 ks 文件位置(见上表) |
| ksdevice= | 指定网卡(如 ksdevice=eth0) |
| nonet | 不启用网络 |
| noprobe | 不探测硬件(特殊硬件导致安装失败时可试) |
| rescue | 进入救援模式 |
制作可引导 ISO(原文):
bash
mkisofs -R -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso iso/
注 :原文提到用 Kickstart 自动安装 RHEL 6.5 时提示找不到 cdrom 驱动,改用 PXE 方式安装。
对比:Kickstart 安装方式(ks 文件来源)
| 方式 | 适用场景 | 优缺点 |
|---|---|---|
| HTTP/FTP | 批量网络安装 | 快速、集中管理;需网络与 HTTP/FTP 服务器 |
| NFS | 内网批量安装 | 适合 Linux 环境;需 NFS 服务器 |
| 光盘 | 单机或小批量 | 无需网络;速度慢、不便更新 |
| 硬盘/U 盘 | 便携安装 | 灵活;需预先拷贝 ks 文件到设备 |
| PXE | 大规模网络部署 | 无需光盘/U 盘,全自动;需 DHCP + TFTP + PXE 服务器 |
对比:graphical 与 text 安装
| 对比项 | graphical(图形) | text(文本) |
|---|---|---|
| 界面 | PyGTK 图形界面 | 纯文本菜单 |
| 资源 | 占内存稍多 | 占用少 |
| 适用 | 桌面、有显示器 | 服务器、远程 console、低配机器 |
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| Anaconda | Red Hat/Fedora 的安装程序,用 Python+C 编写,提供图形和文本两种安装界面 | 像"装修公司的项目经理",帮你完成房子装修的全流程(选材料、铺地板、刷墙) |
| Kickstart | 无人值守自动化安装工具,通过 ks 配置文件定义所有安装选项 | 像"装修清单",列好所有要求(房型、家具、颜色),装修队照单施工,不用你在场 |
| ks 文件 | Kickstart 配置文件,包含命令段、软件包段、脚本段三部分 | 像"装修合同",写明房型(命令段)、家具清单(软件包段)、装完后的收尾工作(脚本段) |
| %packages | ks 文件中的软件包段标记,后面列出要安装的软件包或包组 | 像"家具采购清单",列出沙发、床、桌椅(@base、httpd、vim) |
| %pre | ks 文件中的安装前脚本段,在安装开始前执行(可用工具有限) | 像"装修前的准备",先量房、拆旧家具、铲墙皮 |
| %post | ks 文件中的安装后脚本段,在安装完成后执行(常用于配置) | 像"装修后的收尾",挂画、通电、贴对联、打扫卫生 |
| PXE | 网络启动协议,通过网络从服务器加载操作系统,无需光盘/U盘 | 像"云端装修",不用带材料到现场,所有材料从中心仓库(服务器)直接送到工地(客户端) |
| mkisofs | 制作 ISO 镜像文件的命令,可将目录打包成可引导的光盘镜像 | 像"把装修清单和材料样品打包成一个工具箱",方便携带和分发 |
| ksvalidator | 检查 ks 文件语法是否正确的工具 | 像"装修合同审核员",检查合同条款是否有错误或遗漏 |
| system-config-kickstart | 图形化创建 ks 文件的工具 | 像"装修设计软件",通过点击和选择来生成装修方案,不用手写 |
系统故障排除 🔧
故障排除思路(五步法)
- 确定故障特征:现象、报错、发生时机。
- 重现故障:在可复现条件下操作。
- 用工具收集信息 :日志(
/var/log/messages、dmesg)、命令(lsmod、lspci等)。 - 排除不可能原因,从简单入手。
- 定位故障 :一次只尝试一种方式。
原则:
- 先备份原文件 (如
/etc/fstab.bak、dd if=/dev/sda of=/root/mbr.back) - 尽量借助工具(单用户、救援模式、grub 命令行)
为什么故障排除强调"先备份、一次一种"?
改配置或重装组件有风险,若一次改多处,出问题后难以判断是哪一个改动导致的;先备份能在改坏时快速还原。一次只尝试一种修复方式,便于确定"是这一步解决了问题",方便总结和文档化。
常见故障类型
| 故障类型 | 典型现象 |
|---|---|
| 管理员密码忘记 | 无法登录 |
| 系统无法正常启动 | MBR/grub 损坏、grub 配置文件丢失、stage2 等文件丢失 |
| 系统初始化故障 | 某文件系统无法挂载、驱动不兼容、kernel panic |
| 服务故障 | 某服务启动失败导致整个系统卡住(如 sendmail 时间戳检查失败) |
| 图形界面故障 | X 无法启动 |
| 用户无法登录 | bash 程序损坏 |
| 命令无法运行 | PATH 被改错、库文件缺失 |
| 编译无法继续 | 开发环境缺基本组件 |
| 默认级别误设为 0 或 6 | 启动即关机或重启 |
| rc.local 脚本错误 | 启动时卡住或报错 |
启动流程(排障顺序)
POST
BIOS
启动设备顺序
MBR
bootloader
Kernel
initrd
ROOTFS
/sbin/init
/etc/inittab
排障时按此顺序从前往后排查。
生活例子:故障排除像"看病"------先问症状(确定特征)、能不能复现(重现)、验血验尿(收集信息)、排除感冒(排除简单原因)、一次只试一种药(一次一种方式),且就诊前先拍片备份(先备份原文件)。
对比:常见故障排除方式
| 故障类型 | 首选方式 | 备选方式 | 工具 |
|---|---|---|---|
| 密码忘记 | 单用户模式 | - | grub 编辑 + passwd |
| MBR/grub 损坏 | 救援模式 | 另一台机器挂盘修 | grub 命令行、dd |
| grub.conf 丢失 | grub> 手动引导 | 救援模式重建 | grub 命令、vi |
| bash 等关键文件损坏 | 救援模式 | - | rpm --replacepkgs |
| PATH 改错 | 新终端登录 | 单用户模式 | export PATH |
| 服务启动卡住 | 单用户关服务 | 交互模式(按 I) | chkconfig、service |
| 内核 panic | 检查 grub root= / initrd | 换内核 | grub 编辑、dmesg |
故障一:管理员密码忘记
解决 :进入单用户模式修改密码。
- 开机时按 e 进入 grub 编辑。
- 选中 kernel 行,按 e ,在行尾加
single(或1、s、S)。 - 按 b 启动。
- 进入单用户后:
passwd root重置密码。 init 6重启。
故障二:MBR 损坏
备份与模拟破坏:
bash
# 备份 MBR(前 512 字节)
dd if=/dev/sda of=/root/mbr.backup count=1 bs=512
# 模拟破坏 MBR(前 200 字节)
dd if=/dev/zero of=/dev/sda count=1 bs=200
sync
shutdown -r now
修复方法:使用救援模式(步骤详细)
- 挂载完整的系统安装光盘。
- 重启,在
boot>提示符输入linux rescue。 - 选择 English 、键盘 us。
- 选择 Yes 启动网络接口(若需从网络取包)。
- 选择 Yes 配置 eth0 网卡。
- 选择 Manual address(静态地址),空格选中。
- 设置 IP、掩码、网关、DNS。
- 选择 Continue,启动救援小系统。
- 在 shell 中输入
grub进入 grub 命令行。 find (hd0,0)(或按 TAB 列设备)查找内核在哪个磁盘/分区。root (hd0,0)(与 find 结果一致)。setup (hd0)把 stage1 写入 MBR。quit退出 grub。sync同步磁盘。reboot重启,成功。
故障三:grub 配置文件丢失
现象 :启动后显示 grub> 提示符。
手动引导步骤:
find (hd0,0)(或 TAB 列设备)。root (hd0,0)(假设 /boot 在 hd0,0)。kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00(TAB 补全)。initrd /initrd-2.6.18-308.el5.img(TAB 补全)。boot启动。- 进系统后,若 grub.conf 能找到就放回原位;若找不到,手动创建
/boot/grub/grub.conf:
bash
default=0
timeout=5
title WangSong Team
root (hd0,0)
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00 quiet
initrd /initrd-2.6.18-308.el5.img
故障四:grub 目录下其他文件丢失(如 stage2)
解决 :从同版本或 /usr/share/grub/i386-pc/(32 位)或对应 64 位目录拷贝回 /boot/grub/。
故障五:系统初始化故障
- 文件系统无法挂载 :检查
/etc/fstab、设备是否存在、文件系统类型。 - 驱动不兼容 :可能导致 kernel panic(内核恐慌)。
故障六:默认级别误设为 0 或 6
现象:启动即关机或重启。
解决 :进入单用户模式 (方法同故障一),编辑 /etc/inittab,将 id:0:initdefault: 或 id:6:initdefault: 改为 id:3:initdefault: 或 id:5:initdefault:。
故障七:用户无法登录(bash 被删)
现象:关机都关不掉,无法进入单用户(因 shell 是 bash)。
解决 :进入救援模式,重装 bash。
-
光盘启动,
boot> linux rescue(步骤同故障二)。 -
进入救援系统后,挂载光盘:
bashmkdir /media mount /dev/hdc /media # cdrom 指向 /dev/hdc cd /media/Server ls | grep bash -
重装 bash(根已挂在
/mnt/sysimage):bashrpm -ivh --replacepkgs --root /mnt/sysimage bash-3.2-xxx.rpm -
sync→reboot。
故障八:PATH 改错导致命令找不到
现象 :执行 export PATH=/data/bin 后,ls 等命令不可用。
解决:
- 新开终端重新登录(若只是当前 shell 改了)。
- 若改了配置文件,手动指定:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin;echo $PATH可查看。 - 或进入单用户模式修复配置文件。
故障九:/etc/rc.d/ 下某文件被删
解决:进入单用户模式,从备份或同版本系统拷回。
故障十:sendmail 时间戳检查失败
现象:启动时卡在 sendmail 服务。
解决:
- 方法一 :单用户模式关闭 sendmail(
chkconfig sendmail off)。 - 方法二 :启动时按 I 进入交互模式,逐条询问是否启动该服务,跳过 sendmail。
故障十一:编译无法继续
原因:开发环境缺基本组件(如 gcc、make、头文件)。
解决 :yum groupinstall "Development Tools" "Development Libraries" -y。
配置备份建议
作为管理员应阶段性备份 /etc 下配置 ,并用版本控制工具(svn 或 git)管理,可将配置恢复到过去某一时刻。
对比:单用户模式与救援模式
| 对比项 | 单用户模式(single) | 救援模式(linux rescue) |
|---|---|---|
| 进入方式 | grub kernel 行尾加 single |
光盘启动,boot 输入 linux rescue |
| 使用的系统 | 本机根文件系统(只读后 remount 可写) | 光盘上的小 Linux,本机根需手动挂到 /mnt/sysimage |
| 典型用途 | 改 root 密码、改 inittab、关问题服务 | MBR 重写、grub 重装、bash 等关键文件损坏 |
| 网络 | 可选配置 | 可选配置,常用于从网络拉包 |
| 能否用本机命令 | 是(本机 /bin、/sbin) | 否(用光盘的,需 chroot 到 /mnt/sysimage 才能用本机命令) |
能
不能
显示 grub>
完全不显示
🚨 故障发生
能进系统?
单用户模式
改密码/配置
grub 能显示?
grub 命令行
手动引导
救援模式
MBR/grub 重装
✅ 修复
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| 单用户模式 | Linux 启动到 runlevel 1,只有 root 用户,不启动网络和多数服务,用于维护 | 像"维修模式",商场闭店后只有维修工进去修东西,顾客和店员都不在 |
| 救援模式 | 从光盘启动的小型 Linux 系统,用于修复无法启动的系统 | 像"急救车",你的车坏了开不动,急救车(光盘)来把你拖走修理 |
| MBR | Master Boot Record,主引导记录,硬盘第一个扇区的前 512 字节,包含引导程序和分区表 | 像"大楼的总开关和楼层指示牌",坏了整栋楼都进不去 |
| GRUB | Grand Unified Bootloader,Linux 的引导加载程序,负责加载内核 | 像"电梯操作员",你告诉他去几楼(选内核),他把你送到那一层(加载内核) |
| grub.conf | GRUB 的配置文件,定义启动菜单和内核参数 | 像"电梯楼层按钮配置表",写明哪个按钮对应哪一层 |
| kernel panic | 内核恐慌,Linux 内核遇到无法恢复的错误而停止运行 | 像"司机突然晕倒",车(系统)立即停下来无法继续行驶 |
| initrd/initramfs | 初始化内存盘,包含启动时必需的驱动和工具,在内核加载后、根文件系统挂载前使用 | 像"急救包",车启动前先准备好急救包(驱动),万一路上出问题能应急 |
| dd | disk dump,磁盘复制命令,可按字节复制数据,常用于备份和恢复 | 像"复印机",可以一模一样地复制文件,包括格式和位置 |
| sync | 同步命令,将内存中的数据强制写入磁盘 | 像"保存按钮",把内存里的修改真正写到硬盘上,防止断电丢失 |
| chroot | change root,改变根目录,让进程以指定目录为根 | 像"虚拟现实眼镜",戴上后你看到的世界(根目录)变了,但实际还在原地 |
| rpm --replacepkgs | RPM 包管理器的"替换安装"选项,即使已安装也重新安装,用于修复损坏的文件 | 像"重装软件",软件坏了就重装一遍,覆盖掉坏的文件 |
| PATH | 环境变量,定义系统查找命令的目录列表 | 像"快捷方式列表",你说"打开记事本",系统按列表顺序找到记事本程序 |
| dmesg | 显示内核环形缓冲区的消息,包含硬件检测和驱动加载信息 | 像"汽车仪表盘的故障记录",记录启动时发生的所有事件 |
| lsmod | 列出当前加载的内核模块 | 像"查看已安装的插件列表",看看系统装了哪些驱动模块 |
| lspci | 列出所有 PCI 设备 | 像"查看电脑配置单",显示显卡、网卡、声卡等硬件 |
sudo 权限管理 👤
sudo 作用与配置文件
sudo :让某用户以另一用户身份(通常 root)执行指定命令。
- 配置文件:
/etc/sudoers,建议用visudo编辑(会做语法检查)。
一条 sudo 条目格式:
text
who which_hosts=(runas) TAG: command
| 字段 | 含义 | 可写成 |
|---|---|---|
| who | 用户 | 用户名、%组名、User_Alias |
| which_hosts | 主机 | 主机名、IP、网段、Host_Alias |
| runas | 以谁身份 | 用户名、%组名、Runas_Alias |
| TAG | 标签 | NOPASSWD (此后命令免密)、PASSWD(需密码) |
| command | 命令 | 绝对路径、Cmnd_Alias |
示例:
text
hadoop ALL=(root) NOPASSWD:/usr/sbin/useradd, PASSWD:/usr/sbin/usermod
表示用户 hadoop 在任何主机上可以无密码以 root 执行 useradd,但执行 usermod 需输密码。
四类别名
别名规则 :必须全大写,且只能由大写字母组成。
| 别名类型 | 可包含 |
|---|---|
| User_Alias | 用户名、%组名、其他用户别名 |
| Host_Alias | 主机名、IP、网段、其他主机别名 |
| Runas_Alias | 用户名、%组名、其他 Runas 别名 |
| Cmnd_Alias | 命令绝对路径、目录(即该目录下所有命令)、其他命令别名 |
示例:
text
User_Alias USERADMIN = hadoop, %hadoop, %useradmin
Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, !/usr/bin/passwd root, /usr/bin/passwd [A-Za-z]*
USERADMIN ALL=(root) NOPASSWD: USERADMINCMND
注意:
- 命令尽量用绝对路径。
!表示"不允许",如!/usr/bin/passwd root表示不能passwd root;取反优先级最高。[A-Za-z]*表示命令后必须跟字母参数(如passwd tom可以,passwd单独不行)。
sudo 常用命令
| 命令 | 作用 |
|---|---|
sudo COMMAND |
以授权身份执行命令 |
sudo -l |
列出当前用户可执行的 sudo 命令 |
sudo -k |
清除缓存的认证信息(下次 sudo 需输密码) |
- sudo 默认有效期约 5 分钟,超时后需重新输入密码。
- 日志 :
tail /var/log/secure可查看 sudo 使用记录;tail /var/log/messages也有相关记录。
为什么用 sudo 而不是直接给 root 密码?
root 密码给多人共用时,谁做了什么无法区分,且密码易泄露。sudo 可以按用户、按主机、按命令精细授权,且所有执行记录在日志里,便于审计;需要时收回某人的 sudo 权限即可,不用改 root 密码。
为什么别名必须全大写?
sudoers 语法规定:为与真实用户名、主机名区分,别名被规定为必须全大写,这样解析时不会与普通用户名混淆。
生活例子:sudo 像"公司门禁权限"------不是每人一把总经理钥匙(root),而是给每个人开不同门的权限(useradd、某脚本),且进门记录可查。
对比:直接给 root 密码 vs sudo
| 对比项 | 直接给 root 密码 | sudo |
|---|---|---|
| 权限粒度 | 全部 root 权限 | 按命令、按主机精细控制 |
| 审计 | 无法区分谁做的 | 日志记录每条 sudo 操作 |
| 安全 | 密码泄露影响大 | 收回某人权限即可,不用改密码 |
| 学习曲线 | 简单 | 需学 sudoers 语法 |
👤 普通用户
🔑 sudo 授权
✅ 允许的命令
如 useradd
❌ 禁止的命令
如 passwd root
📋 日志记录
/var/log/secure
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| sudo | Substitute User DO,让普通用户以其他用户(通常是 root)身份执行命令 | 像"临时授权卡",保安(sudo)给你一张卡,让你进入特定房间(执行特定命令),但不给你总钥匙(root 密码) |
| /etc/sudoers | sudo 的配置文件,定义哪些用户可以执行哪些命令 | 像"权限清单",写明张三可以开会议室门,李四可以开仓库门 |
| visudo | 编辑 /etc/sudoers 的专用命令,会检查语法错误 | 像"专业编辑器",写错了会提醒你,防止把权限配置文件改坏 |
| NOPASSWD | sudo 配置标签,表示执行命令时不需要输入密码 | 像"免密门禁",刷卡就能进,不用输密码 |
| User_Alias | sudo 配置中的用户别名,将多个用户归为一组 | 像"部门名称",不用一个个列员工名字,直接说"技术部" |
| Cmnd_Alias | sudo 配置中的命令别名,将多个命令归为一组 | 像"权限包",不用一个个列命令,直接说"用户管理权限包" |
| sudo -l | 列出当前用户可以执行的 sudo 命令 | 像"查看我的门禁卡能开哪些门" |
| sudo -k | 清除 sudo 的认证缓存,下次使用需重新输密码 | 像"退出登录",清除记住的密码,下次要重新输 |
| /var/log/secure | 安全日志文件,记录 sudo、ssh 等安全相关操作 | 像"门禁记录",记录谁在什么时间进了哪个门 |
加密基础与算法 🔐
数据安全三要素
| 要素 | 含义 | 实现方式 |
|---|---|---|
| 机密性 | 数据内容不被窃取 | 对称加密、非对称加密 |
| 完整性 | 数据内容不被篡改 | 单向加密(摘要)+ 签名 |
| 身份验证 | 确定通信双方身份 | 非对称加密(数字签名)、CA 证书 |
加密类型对比
| 类型 | 密钥 | 速度 | 典型算法 | 主要用途 |
|---|---|---|---|---|
| 对称加密 | 加解密同一密钥 | 快 | DES(56bit)、3DES、AES(128/192/256/512)、Blowfish | 大量数据加密 |
| 单向加密 | 无密钥(摘要) | 中 | MD4、MD5、SHA1、SHA256/384/512、CRC-32 | 完整性校验、密码存储 |
| 非对称加密 | 公钥/私钥对 | 慢 | RSA(加密+签名)、DSA(签名)、ElGamal | 身份认证、密钥交换、签名 |
对称加密:
- 加解密用同一密钥,速度快,适合大量数据。
- 问题:密钥如何安全传输?
单向加密:
- 提取数据特征码(摘要/fingerprint),定长输出,不可逆。
- 特点 :输入相同→输出必然相同;雪崩效应(输入微小改变→输出巨大差异)。
- 用途:数据完整性校验(发送方附上摘要,接收方重新计算比对);密码存储(存 hash 而非明文)。
非对称加密:
- 密钥对:公钥(P)、私钥(S)。
- 特点:公钥加密→私钥解密;私钥加密→公钥解密。
- 用途 :
- 发送方用自己私钥加密 (签名)→接收方用公钥解密→身份认证。
- 发送方用对方公钥加密 →对方用私钥解密→数据机密性。
- 问题:速度慢,一般不直接加密大量数据。
为什么非对称加密一般不直接加密整份数据?
非对称加密运算慢、对数据长度有限制。实际做法多是:用非对称加密做身份认证 和密钥交换 (例如用对方公钥加密一个随机数,对方用私钥解密得到后作为对称密钥),大量数据则用对称加密,兼顾安全与性能。HTTPS、SSH 都采用这种组合。
生活例子:加密组合像"快递"------对称加密是"装箱打包"(快),非对称加密是"验身份证+交钥匙"(慢但安全);你不会用身份证验证来打包每件货(太慢),而是先验身份、交一把锁的钥匙(密钥交换),再用那把锁快速封箱(对称加密)。
大
小/签名
🔐 加密需求
数据量大?
对称加密
DES/AES
快
非对称加密
RSA/DSA
慢但安全
❓ 密钥怎么传?
非对称加密
交换对称密钥
✅ 组合使用
HTTPS/SSH
密钥交换:Diffie-Hellman 协议
IKE(Internet Key Exchange):用 Diffie-Hellman 协议在不安全信道协商共享密钥。
原理简述(原文):
- A 和 B 各自选一个秘密数 x、y。
- 公开参数:大素数 P、生成数 g。
- B 发给 A:
g^y % p;A 收到后计算(g^y % p)^x = g^(xy) % p。 - A 发给 B:
g^x % p;B 收到后计算(g^x % p)^y = g^(xy) % p。 - 双方得到相同的
g^(xy) % p作为共享密钥。
问题 :解决了密钥交换,但身份认证问题仍存在(中间人攻击)。
PKI 与 CA
PKI(Public Key Infrastructure,公钥基础设施) :以 CA(Certificate Authority,证书颁发机构) 为核心,管理密钥与证书。
CA 原理:
- 服务器将公钥发给 CA。
- CA 用自己的私钥给服务器公钥签名,加上数字签名等信息,生成证书。
- 服务器与客户端通信时,将证书发给客户端。
- 客户端用 CA 公钥解密证书→验证合法性→获得服务器公钥。
- 如何信任 CA 公钥:最安全的办法是到 CA 机构拷贝其公钥(或预装在系统/浏览器里)。
x509 证书(PKI 标准)包含:
- 公钥及有效期
- 证书合法拥有者
- 证书用途
- CA 信息
- CA 签名校验码
PKI 实现:
- TLS/SSL:x509 证书
- OpenGPG:另一套 PKI 体系
完整安全通信流程(HTTPS 为例)
- 客户端用 CA 公钥验证服务器证书→获得服务器公钥。
- 客户端生成随机数,用服务器公钥加密后发给服务器。
- 服务器用私钥解密得到随机数。
- 双方用该随机数作为对称密钥加密数据(可定期更换)。
- 服务器用私钥加密数据摘要(签名)→客户端用公钥验证→完整性 + 身份认证。
至此:机密性(对称加密)、完整性(摘要+签名)、身份验证(证书+CA)三者均得到保证。
🖥️ 服务器
🏛️ CA
📜 签发证书
💻 客户端
✅ 验证证书
用 CA 公钥
🔑 获得服务器公钥
🎲 生成随机数
用公钥加密
🔓 私钥解密
得到随机数
🔐 用随机数
做对称密钥
生活例子:PKI/CA 像"办护照"------你把身份信息(公钥)交给公安局(CA),公安局核实后盖章(签名)发护照(证书);你出国时海关(客户端)看到公安局的章就信你,且从护照上拿到你的照片(公钥)确认是你本人。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| 对称加密 | 加密和解密使用同一个密钥的加密方式,速度快但密钥分发困难 | 像"保险箱钥匙",开锁和锁门用同一把钥匙,问题是怎么把钥匙安全地给对方 |
| 非对称加密 | 使用公钥和私钥两个密钥,公钥加密私钥解密,或私钥加密公钥解密 | 像"挂锁",你把开着的锁(公钥)给别人,他锁上后只有你的钥匙(私钥)能打开 |
| 单向加密 | 只能加密不能解密,生成固定长度的摘要,用于验证数据完整性 | 像"指纹",从人能提取指纹,但从指纹无法还原出人 |
| DES | Data Encryption Standard,数据加密标准,56 位密钥,已不安全 | 像"老式密码锁",只有 3 位数字,容易被破解 |
| AES | Advanced Encryption Standard,高级加密标准,支持 128/192/256 位密钥 | 像"现代密码锁",有 10 位数字,非常安全 |
| MD5 | Message Digest 5,消息摘要算法第 5 版,生成 128 位摘要,已不安全 | 像"旧版防伪码",容易被伪造 |
| SHA | Secure Hash Algorithm,安全散列算法,有 SHA1/SHA256/SHA512 等版本 | 像"新版防伪码",更难伪造 |
| RSA | 非对称加密算法,以三位发明者名字命名,可用于加密和签名 | 像"银行保险箱",有两把钥匙,一把公开一把私有 |
| DSA | Digital Signature Algorithm,数字签名算法,只能用于签名不能加密 | 像"签名笔",只能签名证明是你,不能用来加密内容 |
| 摘要/fingerprint | 单向加密生成的固定长度特征码,用于验证数据是否被篡改 | 像"文件的指纹",文件改一个字,指纹就完全不同 |
| 雪崩效应 | 输入微小改变导致输出巨大差异的特性,是好的加密算法的标志 | 像"蝴蝶效应",改一个字母,整个摘要完全变样 |
| 密钥交换 | 在不安全信道上协商出共享密钥的过程 | 像"暗号对接",两个特工在电话里说暗号,旁人听不懂,但他们能确定共同的秘密 |
| Diffie-Hellman | 密钥交换协议,允许双方在不安全信道上协商共享密钥 | 像"调色游戏",你有红色我有蓝色,我们各自混入对方的颜色,最后得到相同的紫色 |
| PKI | Public Key Infrastructure,公钥基础设施,管理密钥和证书的体系 | 像"身份证系统",有发证机关(CA)、身份证(证书)、验证流程 |
| CA | Certificate Authority,证书颁发机构,负责签发和管理数字证书 | 像"公安局户籍科",负责发身份证并盖章证明 |
| x509 | 数字证书的标准格式,定义证书应包含的信息 | 像"身份证格式标准",规定必须有姓名、照片、有效期等 |
| 数字签名 | 用私钥对数据摘要加密,证明数据来自特定发送者且未被篡改 | 像"手写签名+指纹",证明文件是你签的且没被改过 |
SSL/TLS 与 OpenSSL 🔒
SSL/TLS 简介
- SSL(Secure Socket Layer):安全套接字层。
- TLS(Transport Layer Security):传输层安全,SSL 的后续版本。
位置 :在 TCP/IP 模型的应用层与传输层之间附加一层,为 HTTP、FTP、SMTP 等明文协议提供加密。
应用:HTTPS(HTTP over SSL/TLS)、FTPS、SMTPS 等。
SSL 分层
| 层 | 作用 |
|---|---|
| SSL 记录协议 | 建立在可靠传输协议(TCP)上,为高层提供数据封装、压缩、加密 |
| SSL 握手协议 | 建立在 SSL 记录协议之上,用于传输前身份验证、协商加密算法、交换加密密钥 |
HTTPS 握手流程(SSL 会话建立)
服务器 客户端 服务器 客户端 1. TCP 三次握手 2. SSL 会话请求 3. 协商 SSL 版本、算法 4. 发送服务器证书 5. 验证证书合法性 6. 用证书公钥加密随机数 7. HTTPS 请求(URL) 8. 用随机数加密数据+私钥签名
注意 (原文):SSL 会话是基于 IP 地址建立的,一个 IP 上只能有一个 SSL 会话,即一个 IP 只能有一个 HTTPS 服务器(可以是主机或虚拟主机之一)。
OpenSSL
OpenSSL:Linux 上实现 SSL 协议的开源工具。
三部分:
| 组件 | 说明 |
|---|---|
| libcrypto | 加密库 |
| libssl | TLS/SSL 实现库(基于会话,实现身份认证、数据机密性、会话完整性) |
| openssl | 多用途命令行工具(加密/解密、摘要、生成密钥、创建私有 CA) |
OpenSSL 常用命令
| 用途 | 命令示例 |
|---|---|
| 测试加密性能 | openssl speed |
| 加密文件 | openssl enc -des3 -salt -a -in ping.sh -out ping.enc |
| 解密文件 | openssl enc -des3 -d -salt -a -in ping.enc -out ping.sh |
| MD5 摘要 | openssl dgst -md5 file 或系统 md5sum file |
| SHA1 摘要 | sha1sum file |
| 生成密码哈希 | openssl passwd -1 或 openssl passwd -1 -salt .uJLV8x0(盐加密) |
| 获取随机数 | openssl rand -base64 100 |
| 生成私钥 | (umask 077; openssl genrsa -out server.key 2048) 或 openssl genrsa 2048 > service.key |
| 从私钥提取公钥 | openssl rsa -in server.key -pubout |
| 自签名证书 | openssl req -new -x509 -key server.key -out server.crt -days 365 |
| 查看证书 | openssl x509 -text -in server.crt |
证书配置目录 (原文):/etc/pki/tls/openssl.cnf
对比:SSL/TLS 与 SSH
| 对比项 | SSL/TLS | SSH |
|---|---|---|
| 主要用途 | 为应用层协议(HTTP/FTP/SMTP)加密 | 加密远程登录与文件传输 |
| 典型应用 | HTTPS、FTPS | ssh、scp、sftp |
| 证书 | 需 CA 签发的 x509 证书 | 主机密钥(自签名),可选用户密钥 |
| 端口 | 443(HTTPS)、990(FTPS) | 22 |
生活例子:SSL/TLS 像"给邮局加装保险箱"------原本明信片(HTTP)谁都能看,加了保险箱(SSL)后变挂号信(HTTPS),只有收件人能打开。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| SSL | Secure Socket Layer,安全套接字层,为网络通信提供加密 | 像"信封",把明信片(明文)装进信封(加密)再寄出 |
| TLS | Transport Layer Security,传输层安全,SSL 的后续版本,更安全 | 像"升级版信封",更厚更结实,更难被拆开 |
| HTTPS | HTTP over SSL/TLS,在 HTTP 基础上加 SSL/TLS 加密 | 像"挂号信",比普通信(HTTP)更安全,有加密和签收 |
| OpenSSL | 开源的 SSL/TLS 实现,提供加密库和命令行工具 | 像"加密工具箱",里面有各种加密工具和算法 |
| libcrypto | OpenSSL 的加密库,提供各种加密算法实现 | 像"密码学教科书",包含所有加密算法的实现 |
| libssl | OpenSSL 的 SSL/TLS 库,实现 SSL/TLS 协议 | 像"安全通信手册",教你怎么建立安全连接 |
| openssl 命令 | OpenSSL 提供的命令行工具,用于加密、生成密钥、创建证书等 | 像"瑞士军刀",一个工具包含多种功能 |
| 自签名证书 | 自己给自己签发的证书,不经过 CA,浏览器会警告不信任 | 像"自己写的证明信",没有权威机构盖章,别人不一定信 |
OpenSSH 与密钥认证 🔑
OpenSSH 简介
OpenSSH :SSH(Secure SHell)协议的免费开源实现,用于加密远程控制与文件传输,取代 telnet、rcp、ftp、rlogin、rsh 等不安全的明文传输工具。
- 服务端:sshd(Linux)
- 客户端:ssh(Linux)、PuTTY、SecureCRT、Xmanager(Windows)
版本:
- V1:基本不使用(不安全)。
- V2:主流,使用 RSA/DSA 密钥。
认证方式:
- 基于口令认证
- 基于密钥认证(推荐)
相关文件与目录
安装包 :rpm -qa | grep ssh
查看版本 :ssh -V
配置文件:
| 文件 | 说明 |
|---|---|
/etc/ssh/ssh_config |
客户端配置 |
/etc/ssh/sshd_config |
服务端配置 |
主机密钥 (在 /etc/ssh/):
| 密钥文件 | 说明 |
|---|---|
ssh_host_rsa_key / .pub |
RSA 密钥(V2) |
ssh_host_dsa_key / .pub |
DSA 密钥(V2) |
ssh_host_key / .pub |
V1 密钥(不推荐) |
moduli |
密钥交换和认证相关信息 |
客户端保存的主机指纹 :~/.ssh/known_hosts(权限 644)
sshd_config 常用配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
Port |
22 | 监听端口(建议改非默认) |
AddressFamily |
any | 地址族:any、inet(IPv4)、inet6 |
Protocol |
2 | 协议版本(不要用 1) |
KeyRegenerationInterval |
1h | 密钥更换周期 |
ServerKeyBits |
1024 | 密钥长度 |
LoginGraceTime |
2m | 登录超时 |
PermitRootLogin |
yes | 是否允许 root 直接登录(建议关闭) |
MaxAuthTries |
6 | 试错次数 |
PrintLastLog |
yes | 打印上次登录信息(建议不暴露) |
Subsystem sftp |
/usr/libexec/openssh/sftp-server |
sftp 子系统(sftp 基于 ssh;ftps 基于 ssl) |
基于密钥的认证(三步)
1. 生成密钥对(客户端)
bash
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N 'password'
选项:
-t {rsa|dsa}:指定算法-f /path/to/keyfile:保存位置(默认~/.ssh/id_rsa)-N 'password':指定密码(可为空)
2. 将公钥传到服务器
方法一 :用 ssh-copy-id(推荐)
bash
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
方法二:手动 scp 后追加
bash
scp ~/.ssh/id_rsa.pub user@host:/tmp/
ssh user@host
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
3. 测试登录
bash
ssh user@host
若出现 "Agent admitted failure to sign using the key",执行 ssh-add。
ssh 使用技巧
| 用法 | 说明 |
|---|---|
ssh user@host |
登录远程主机 |
ssh -l user host |
同上 |
ssh user@host 'command' |
不登录,只执行命令并返回结果 |
ssh -X user@host |
启用 X11 转发(可运行远程图形程序) |
ssh -2 -p port user@host |
指定端口 |
scp 与 sftp
scp:基于 SSH 的远程复制命令。
bash
scp [options] SRC DEST
| 选项 | 说明 |
|---|---|
-r |
递归复制目录 |
-p |
保持源文件元数据(mode、timestamp) |
-q |
静默模式 |
-P PORT |
指定远程端口 |
示例:
bash
# 从远程拷到本地
scp root@172.16.100.2:/etc/fstab ./
# 从本地拷到远程
scp fstab root@172.16.100.2:/root/
# 指定端口
scp -P 2222 file user@host:/path/
sftp:交互式文件传输。
bash
sftp [user@]host
对比:sftp 与 ftps
| 对比项 | sftp | ftps |
|---|---|---|
| 基于 | SSH(22/tcp) | SSL/TLS(21/tcp + 数据端口) |
| 加密 | SSH 加密 | SSL/TLS 加密 |
| 认证 | SSH 认证(密钥或密码) | FTP 认证 + SSL 证书 |
对比:telnet/rsh 与 SSH
| 对比项 | telnet/rcp/rlogin/rsh | SSH(OpenSSH) |
|---|---|---|
| 传输 | 明文 | 加密 |
| 密码 | 明文传输 | 加密传输 |
| 主机认证 | 无 | 有(主机密钥) |
| 现状 | 已淘汰 | 主流 |
💻 客户端
🔑 生成密钥对
ssh-keygen
📤 公钥传到服务器
ssh-copy-id
🖥️ 服务器
~/.ssh/authorized_keys
🔓 免密登录
ssh user@host
生活例子:SSH 密钥认证像"小区门禁卡"------你把卡(公钥)给物业(服务器)录入,以后刷卡(私钥)就能进,不用每次报身份证号(密码);且卡丢了只需让物业删你那张,不用改整个小区的密码。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| SSH | Secure SHell,安全外壳协议,用于加密远程登录和命令执行 | 像"加密对讲机",你和服务器说话时别人听不懂 |
| OpenSSH | SSH 协议的开源实现,最常用的 SSH 软件 | 像"免费的加密对讲机软件" |
| sshd | SSH 服务端守护进程,运行在服务器上监听 SSH 连接 | 像"门卫",守在门口等人来登录 |
| ssh-keygen | 生成 SSH 密钥对(公钥和私钥)的命令 | 像"配钥匙机器",给你配一对钥匙(公钥和私钥) |
| ssh-copy-id | 将公钥复制到远程服务器的命令,简化密钥认证配置 | 像"把门禁卡交给物业录入系统" |
| authorized_keys | 存储允许登录的公钥列表的文件,位于 ~/.ssh/ 目录 | 像"门禁卡数据库",记录哪些卡可以开门 |
| known_hosts | 存储已知主机指纹的文件,用于验证服务器身份 | 像"可信服务器通讯录",记录你连过的服务器的"指纹" |
| scp | Secure Copy,基于 SSH 的安全文件复制命令 | 像"加密快递",文件在传输过程中被加密保护 |
| sftp | SSH File Transfer Protocol,基于 SSH 的安全文件传输协议 | 像"加密 FTP",交互式传文件,但是加密的 |
| 主机密钥 | SSH 服务器的身份标识,用于证明服务器身份 | 像"服务器的身份证",证明你连的是真服务器不是假冒的 |
| 密钥认证 | 使用公钥/私钥对进行身份验证,比密码更安全 | 像"指纹识别",比输密码更安全更方便 |
| telnet | 明文远程登录协议,不加密,已被 SSH 取代 | 像"明信片",内容谁都能看,不安全 |
| PuTTY | Windows 上常用的 SSH 客户端软件 | 像"Windows 版对讲机" |
SSH 安全建议(总结)
- 密码要经常换且足够复杂。
- 使用非默认端口(改 Port)。
- 限制登录客户地址(AllowUsers、Match Address)。
- 禁止 root 直接登录 (
PermitRootLogin no)。 - 仅开放有限用户。
- 使用基于密钥的认证。
- 不要使用 V1 版本 (
Protocol 2)。
DNS 域名解析 🌐
DNS 基本概念
DNS(Domain Name Service) :域名解析服务,实现 FQDN↔IP 双向转换。
- FQDN :Full Qualified Domain Name,完全限定域名,如
www.magedu.com.(末尾有点)。 - 域名 :
magedu.com是域;www.magedu.com是主机名(FQDN)。
名称解析框架 :nsswitch
- 配置文件:
/etc/nsswitch.conf - 示例行:
hosts: files dns- files :先查
/etc/hosts - dns:再问 DNS 服务器
- files :先查
stub resolver(名称解析器):本地程序,按 nsswitch 配置查询。
域名管理机构
| 机构 | 职责 |
|---|---|
| IANA | 互联网域名与 IP 分配机构 |
| ICANN | 民间域名分配机构,管理顶级域(TLD) |
TLD(顶级域):
| 类型 | 示例 |
|---|---|
| 组织域 | .com、.org、.net、.cc |
| 国家域 | .cn、.tw、.hk、.jp、.ir、.iq |
| 反向域 | IP→FQDN(in-addr.arpa) |
解析与查询
解析类型:
| 类型 | 方向 |
|---|---|
| 正向解析 | FQDN → IP |
| 反向解析 | IP → FQDN(不是同一数据库) |
查询类型:
| 类型 | 说明 |
|---|---|
| 递归 | 客户端只发一次请求,由 DNS 服务器一路查到底并返回结果 |
| 迭代 | DNS 服务器只返回"下一跳"(参考答案),由请求方多次请求 |
实际互联网 :本地 DNS 对客户端提供递归 ,对外部 DNS 用迭代。
DNS 服务器类型
| 类型 | 说明 |
|---|---|
| 主 DNS 服务器 | 数据可修改,权威答案 |
| 辅助(从)DNS 服务器 | 从主服务器同步数据(按 serial number、refresh、retry、expire、TTL) |
| 缓存 DNS 服务器 | 不负责区域,只缓存查询结果(非权威答案) |
| 转发器 | 将查询转发给其他 DNS |
权威答案 vs 非权威答案:
| 类型 | 说明 | TTL |
|---|---|---|
| 权威答案 | 来自该区域的主/从服务器 | 肯定答案、否定答案均有 TTL |
| 非权威答案 | 来自缓存 | 会过期,超时后重新查询 |
DNS 分布式数据库
- 上级仅知道其直接下级(如 .com 知道 magedu.com 的 NS)。
- 下级只知道根的位置(根提示文件 named.ca)。
负载均衡:一个域名可对应多个 IP,DNS 可轮询返回不同 IP。
有
无
是
否
💻 PC
ping www.magedu.com
/etc/nsswitch.conf
hosts: files dns
📄 /etc/hosts
有?
✅ 返回 IP
🌐 stub resolver
问 DNS 服务器
递归?
🔄 DNS 递归查询
一路查到底
🔁 迭代查询
返回参考答案
✅ 返回 IP + TTL
生活例子:DNS 像"114 查号台"------你问"某某公司电话",查号台先翻本地电话本(/etc/hosts),没有就打给总台(根 DNS),总台说"问 .com 台",.com 台说"问 magedu.com 台",最后 magedu.com 台告诉你"www 是 192.168.0.1"。
对比:递归与迭代查询
| 对比项 | 递归查询 | 迭代查询 |
|---|---|---|
| 请求次数 | 客户端只发一次 | 客户端发多次 |
| 谁负责查 | DNS 服务器一路查到底 | 客户端(或 DNS)逐级问 |
| 返回结果 | 最终答案 | 参考答案(下一跳) |
| 谁用 | PC 对本地 DNS | 本地 DNS 对外部 DNS |
对比:正向解析与反向解析
| 对比项 | 正向解析 | 反向解析 |
|---|---|---|
| 方向 | FQDN → IP | IP → FQDN |
| 数据库 | 正向区域文件(如 magedu.com.zone) | 反向区域文件(如 0.168.192.in-addr.arpa.zone) |
| 典型 RR | A、AAAA、CNAME | PTR |
| 用途 | 访问网站、发邮件 | 日志、反垃圾邮件、安全验证 |
BIND 配置与管理 📋
BIND 简介
BIND(Berkeley Internet Name Domain):DNS 的常见实现,由 ISC 维护。
bind97 包(RHEL 5/6):
| 文件/目录 | 说明 |
|---|---|
/etc/named.conf |
主配置文件(BIND 进程属性 + 区域定义) |
/etc/rndc.key |
rndc(Remote Name Domain Controller)密钥文件 |
/etc/rndc.conf |
rndc 配置 |
/var/named/ |
区域数据文件目录 |
/etc/rc.d/init.d/named |
服务脚本(start/stop/restart/status/reload) |
/usr/sbin/named |
二进制程序 |
bind-chroot (可选):将 named 运行在 chroot 环境(/var/named/chroot/),增强安全。
默认用户/组:named / named
DNS 监听端口
| 端口 | 协议 | 用途 |
|---|---|---|
| 53/udp | UDP | 查询 |
| 53/tcp | TCP | 区域传送(axfr/ixfr) |
| 953/tcp | TCP | rndc 控制 |
资源记录(RR)格式
text
NAME [TTL] IN RR_TYPE VALUE
常见 RR 类型:
| 类型 | 含义 | 格式 | 示例 |
|---|---|---|---|
| SOA | 起始授权记录 | ZONE_NAME IN SOA MASTER_NS ADMIN_MAILBOX (serial refresh retry expire na_ttl) | magedu.com. IN SOA ns1.magedu.com. admin.magedu.com. (2013040101 1H 5M 1W 1D) |
| NS | 名称服务器 | ZONE_NAME IN NS NS_FQDN | magedu.com. IN NS ns1.magedu.com. |
| A | IPv4 地址 | FQDN IN A IPv4 | www.magedu.com. IN A 192.168.0.1 |
| AAAA | IPv6 地址 | FQDN IN AAAA IPv6 | www.magedu.com. IN AAAA 2001:db8::1 |
| PTR | 反向解析 | IP.in-addr.arpa IN PTR FQDN | 1.0.168.192.in-addr.arpa. IN PTR www.magedu.com. |
| MX | 邮件交换器 | ZONE_NAME IN MX pri MX_FQDN | magedu.com. IN MX 10 mail.magedu.com. |
| CNAME | 别名 | ALIAS IN CNAME FQDN | www2.magedu.com. IN CNAME www.magedu.com. |
| TXT | 文本记录 | NAME IN TXT "text" | SPF、验证等 |
时间单位 :M(分钟)、H(小时)、D(天)、W(周),默认秒。
邮箱格式 :admin@magedu.com 写为 admin.magedu.com.
对比:常见 DNS 资源记录
| RR 类型 | 作用 | 左侧(NAME) | 右侧(VALUE) | 典型场景 |
|---|---|---|---|---|
| SOA | 定义区域属性 | 区域名 | 主 NS、管理员邮箱、序列号等 | 每个区域必有一条 |
| NS | 指定名称服务器 | 区域名 | NS 服务器 FQDN | 指明谁负责该区域 |
| A | IPv4 地址 | 主机名 | IPv4 | 最常用,正向解析 |
| AAAA | IPv6 地址 | 主机名 | IPv6 | IPv6 环境 |
| PTR | 反向解析 | IP(倒序) | FQDN | 日志、安全 |
| MX | 邮件服务器 | 区域名 | 邮件服务器 FQDN + 优先级 | 发邮件时查询 |
| CNAME | 别名 | 别名 | 真实 FQDN | 多个名字指向同一主机 |
📦 区域 magedu.com
📋 SOA
定义区域属性
🖥️ NS
ns1/ns2
🌐 A 记录
www→IP
🌐 A 记录
mail→IP
📧 MX 记录
邮件服务器
🔗 CNAME
ftp→www
区域类型与配置
zone 定义格式 (在 /etc/named.conf):
text
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "区域数据文件";
masters { master_ip; }; // 仅从区域需要
allow-transfer { ip; }; // 允许哪些 IP 做区域传送
};
主区域示例:
text
zone "magedu.com" IN {
type master;
file "magedu.com.zone";
allow-transfer { 172.16.100.2; };
};
从区域示例:
text
zone "magedu.com" IN {
type slave;
file "slaves/magedu.com.zone";
masters { 172.16.100.1; };
};
提示区域(根):
text
zone "." IN {
type hint;
file "named.ca";
};
转发区域:
text
zone "example.com" IN {
type forward;
forward only; // 或 first
forwarders { 8.8.8.8; };
};
区域传送
| 类型 | 说明 |
|---|---|
| axfr | 完全区域传送(传整个区域) |
| ixfr | 增量区域传送(仅传变化部分) |
对比:DNS 区域类型
| 区域类型 | 数据来源 | 可否修改 | 典型配置 |
|---|---|---|---|
| master(主) | 本地区域文件 | 可修改 | type master; file "zone.file"; |
| slave(从) | 从主服务器同步 | 不可修改(只读) | type slave; masters { ip; }; |
| hint(提示) | 根提示文件 | 不修改 | type hint; file "named.ca";(根区域) |
| forward(转发) | 转发给其他 DNS | 不存数据 | type forward; forwarders { ip; }; |
区域传送
axfr/ixfr
区域传送
🖥️ 主 DNS
可修改数据
📋 从 DNS 1
只读同步
📋 从 DNS 2
只读同步
💾 缓存 DNS
不负责区域
只缓存查询
↗️ 转发 DNS
转发给上游
区域数据文件示例
正向区域文件 (magedu.com.zone):
text
$TTL 600
@ IN SOA ns1.magedu.com. admin.magedu.com. (
2013040101 ; serial
1H ; refresh
5M ; retry
1W ; expire
1D ) ; negative TTL
IN NS ns1.magedu.com.
IN NS ns2.magedu.com.
IN MX 10 mail.magedu.com.
ns1 IN A 192.168.0.10
ns2 IN A 192.168.0.11
www IN A 192.168.0.1
mail IN A 192.168.0.2
ftp IN CNAME www
反向区域文件 (0.168.192.in-addr.arpa.zone):
text
$TTL 600
@ IN SOA ns1.magedu.com. admin.magedu.com. (
2013040101 1H 5M 1W 1D )
IN NS ns1.magedu.com.
1 IN PTR www.magedu.com.
2 IN PTR mail.magedu.com.
10 IN PTR ns1.magedu.com.
简写规则:
- @ :代表当前区域名(
$ORIGIN)。 - 省略 FQDN 末尾的点时,会自动补上
$ORIGIN。
泛域解析:
text
*.magedu.com. IN A 192.168.0.100
子域授权
在父域区域文件中:
text
SUB_ZONE_NAME IN NS NSSERVER_SUB_ZONE_NAME
NSSERVER_SUB_ZONE_NAME IN A IP
示例 (在 magedu.com.zone 中):
text
fin.magedu.com. IN NS ns1.fin.magedu.com.
fin.magedu.com. IN NS ns2.fin.magedu.com.
ns1.fin.magedu.com. IN A 172.16.100.8
ns2.fin.magedu.com. IN A 172.16.100.9
named.conf 常用选项
options 段:
text
options {
directory "/var/named";
allow-recursion { 172.16.0.0/16; }; // 允许哪些 IP 递归查询
allow-query { any; }; // 允许哪些 IP 查询
allow-transfer { none; }; // 允许哪些 IP 做区域传送
forwarders { 8.8.8.8; }; // 转发器
forward first; // 或 only
};
ACL(访问控制列表):
text
acl innet {
172.16.0.0/16;
127.0.0.0/8;
};
allow-query { innet; };
内置 ACL :any、none、localhost、localnets。
view(视图):根据客户端来源返回不同结果(智能 DNS、CDN)。
text
view "internal" {
match-clients { 192.168.0.0/24; };
zone "magedu.com" IN { ... };
};
view "external" {
match-clients { any; };
zone "magedu.com" IN { ... };
};
注意:所有区域都必须定义在视图中(若用 view)。
日志配置
logging 段:
text
logging {
category queries { query_log; };
channel query_log {
file "/var/log/named/queries.log" versions 3 size 10m;
severity info;
};
};
- category:日志源(如 queries、xfer-in、xfer-out)。
- channel:日志保存位置(syslog 或自定义文件)。
DNS 查询工具
dig(Domain Information Groper):
| 用法 | 说明 |
|---|---|
dig -t A www.baidu.com |
查 A 记录 |
dig -t NS magedu.com |
查 NS 记录 |
dig -t SOA magedu.com |
查 SOA 记录 |
dig -t MX magedu.com |
查 MX 记录 |
dig -x 172.16.100.1 |
反向查询(IP→FQDN) |
dig @8.8.8.8 www.baidu.com |
指定 DNS 服务器 |
dig +recurse ... |
递归查询 |
dig +norecurse ... |
不递归(返回参考答案) |
dig +trace ... |
查看递归过程 |
host:
bash
host -t A www.baidu.com
host -t NS magedu.com
host -t SOA magedu.com
nslookup(交互式):
text
nslookup
> server 8.8.8.8
> set q=A
> www.baidu.com
配置检查与管理
| 命令 | 说明 |
|---|---|
named-checkconf |
检查 named.conf 语法 |
named-checkzone ZONE FILE |
检查区域文件语法 |
rndc reload |
重新加载配置 |
rndc reload ZONE |
重新加载某区域 |
rndc status |
查看 named 状态 |
rndc flush |
清空缓存 |
SELinux 与 DNS
临时关闭:
bash
getenforce # 查看状态
setenforce 0 # 设为 Permissive
永久关闭:
bash
vim /etc/selinux/config
# 改为 SELINUX=permissive 或 disabled
压力测试
queryperf:DNS 查询压力测试工具(原文提及)。
对比:dig、host、nslookup
| 工具 | 特点 | 典型用法 |
|---|---|---|
| dig | 功能最全,输出详细 | dig -t A name @server、dig +trace、dig -x IP |
| host | 简洁,输出少 | host -t A name、host IP |
| nslookup | 交互式,老工具 | nslookup 后 server IP、set q=A、name |
生活例子:DNS 主从像"连锁店"------总店(主 DNS)有完整菜单(区域数据),分店(从 DNS)定期从总店拷菜单(区域传送),顾客(客户端)问任何一家都能点到菜(查到 IP);总店改菜单后通知分店更新(serial number + refresh)。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| DNS | Domain Name System,域名系统,将域名转换为 IP 地址 | 像"电话簿",你说"找张三",它告诉你张三的电话号码 |
| FQDN | Fully Qualified Domain Name,完全限定域名,如 www.example.com. | 像"完整地址",包含门牌号、街道、城市、国家 |
| 域名 | 互联网上的名称标识,如 example.com | 像"公司名称",比 IP 地址(电话号码)更好记 |
| stub resolver | 客户端的 DNS 解析器,负责发起 DNS 查询 | 像"你的秘书",你说要找谁,秘书帮你查电话簿 |
| nsswitch | Name Service Switch,名称服务切换,定义查询顺序 | 像"查找策略",先查本地通讯录,再打 114 查号台 |
| /etc/hosts | 本地主机名解析文件,优先于 DNS 查询 | 像"手机通讯录",先查通讯录,没有再打 114 |
| 递归查询 | 客户端只发一次请求,DNS 服务器负责查到底并返回结果 | 像"全包服务",你问秘书要电话,秘书帮你查到底再告诉你 |
| 迭代查询 | DNS 服务器只返回下一跳地址,客户端需多次查询 | 像"指路",你问路人,路人说"往前走问下一个人" |
| 正向解析 | 域名 → IP 地址 | 像"查电话号码",你说姓名查到电话 |
| 反向解析 | IP 地址 → 域名 | 像"查来电显示",看到号码查是谁打来的 |
| BIND | Berkeley Internet Name Domain,最常用的 DNS 服务器软件 | 像"114 查号台系统" |
| named | BIND 的守护进程,实际运行的 DNS 服务 | 像"查号台接线员" |
| 区域(zone) | DNS 管理的一个域名空间,如 example.com | 像"一个公司的员工名册" |
| 主 DNS | 拥有区域数据的权威服务器,可修改数据 | 像"总公司人事部",掌握员工名册原件 |
| 从 DNS | 从主 DNS 同步数据的服务器,只读 | 像"分公司人事部",定期从总部拷贝员工名册 |
| 缓存 DNS | 只缓存查询结果,不负责任何区域 | 像"你的通话记录",记住最近打过的号码 |
| 转发器 | 将 DNS 查询转发给其他 DNS 服务器 | 像"转接员",你问他,他转给专业人员 |
| SOA | Start of Authority,起始授权记录,定义区域属性 | 像"员工名册封面",写明版本号、负责人、更新时间 |
| NS | Name Server,名称服务器记录,指定负责该区域的 DNS 服务器 | 像"人事部电话",告诉你谁负责这个名册 |
| A 记录 | Address,IPv4 地址记录,域名到 IP 的映射 | 像"姓名→电话"的对应关系 |
| AAAA 记录 | IPv6 地址记录 | 像"姓名→新版电话号码(更长)" |
| PTR | Pointer,指针记录,用于反向解析 | 像"电话→姓名"的反向对应 |
| MX | Mail eXchange,邮件交换记录,指定邮件服务器 | 像"收信地址",告诉邮递员把信送到哪 |
| CNAME | Canonical Name,别名记录,一个域名指向另一个域名 | 像"小名→大名",张三的小名叫小张 |
| TTL | Time To Live,生存时间,DNS 记录的缓存时间 | 像"保质期",过期后要重新查询 |
| serial number | 区域文件的序列号,用于判断数据是否更新 | 像"版本号",版本号变了说明名册更新了 |
| 区域传送 | 主 DNS 将区域数据复制给从 DNS | 像"总部发名册给分部" |
| axfr | 完全区域传送,传输整个区域数据 | 像"复印整本名册" |
| ixfr | 增量区域传送,只传输变化的部分 | 像"只发更新的那几页" |
| dig | DNS 查询工具,功能强大,输出详细 | 像"专业查号工具",显示详细查询过程 |
| nslookup | 交互式 DNS 查询工具 | 像"简易查号工具" |
| rndc | Remote Name Domain Controller,远程控制 named 的工具 | 像"查号台管理后台" |
DHCP 服务 📡
DHCP 简介
DHCP(Dynamic Host Configuration Protocol) :动态主机配置协议,基于 bootp 发展而来。
作用:自动为客户端分配:
- IP 地址
- 子网掩码
- 网关
- DNS 服务器
端口:
- 67/udp:服务端
- 68/udp:客户端
DHCP 工作流程(四步)
DHCP 服务器 客户端 DHCP 服务器 客户端 1. DHCPDISCOVER(广播) 2. DHCPOFFER(提供 IP) 3. DHCPREQUEST(请求该 IP) 4. DHCPACK(确认分配)
续租:租期快到时,客户端再发 DHCPREQUEST → 服务器回 DHCPACK。
生活例子:DHCP 像"酒店前台分房卡"------你到前台(DISCOVER 广播"有空房吗"),前台查空房后给你 302 房卡(OFFER),你说"要这间"(REQUEST),前台登记后确认(ACK);住几天后(租期)要续住,再去前台续(续租)。
对比:DHCP 与静态 IP
| 对比项 | DHCP(动态) | 静态 IP |
|---|---|---|
| 配置 | 自动获取 | 手动配置 |
| 适用 | 客户端、临时设备、大量主机 | 服务器、网络设备 |
| IP 冲突 | DHCP 避免冲突 | 手动配易冲突 |
| 管理 | 集中管理(DHCP 服务器) | 分散配置 |
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| DHCP | Dynamic Host Configuration Protocol,动态主机配置协议,自动分配 IP 地址 | 像"酒店前台",客人来了自动分配房间号,不用客人自己选 |
| DHCPDISCOVER | DHCP 发现消息,客户端广播寻找 DHCP 服务器 | 像"有空房吗"的广播喊话 |
| DHCPOFFER | DHCP 提供消息,服务器回应可用的 IP 地址 | 像前台回应"302 房间可以" |
| DHCPREQUEST | DHCP 请求消息,客户端请求使用某个 IP | 像"我要 302 房间" |
| DHCPACK | DHCP 确认消息,服务器确认分配 | 像"好的,给你房卡" |
| 租期(lease) | DHCP 分配的 IP 地址的有效期 | 像"住 3 天",到期要续租或退房 |
| 续租 | 租期快到时,客户端请求延长使用时间 | 像"我要续住 3 天" |
| 67/udp | DHCP 服务器监听端口 | 像"前台电话号码" |
| 68/udp | DHCP 客户端使用端口 | 像"客人的电话号码" |
| IP 地址池 | DHCP 服务器可分配的 IP 地址范围 | 像"可用房间列表",从 201 到 299 |
| 保留地址 | 为特定 MAC 地址预留的固定 IP | 像"VIP 专属房间",张三来永远住 888 |
| bootp | Bootstrap Protocol,DHCP 的前身,功能较简单 | 像"老式前台系统" |
安装与查看
bash
yum list all | grep dhcp # 查看 dhcp 包
yum -y install dhcp # 安装
rpm -ql dhcp # 查看安装文件
netstat -unlp # 查看端口(67/udp)
HTTP 协议与 Web 架构 🌐
HTTP 简介
HTTP(HyperText Transfer Protocol):超文本传输协议。
版本演进:
| 版本 | 特点 |
|---|---|
| HTTP/0.9 | 仅纯文本(超链接)、ASCII |
| HTTP/1.0 | 增加方法(PUT、POST、DELETE、HEAD)、MIME、短连接 |
| HTTP/1.1 | 增强缓存、长连接(Keep-Alive)、Host 头(虚拟主机) |
HTML(HyperText Mark Language) :超文本标记语言,如 <h2>Title</h2>。
URI 与 URL
- URI(Uniform Resource Identifier):统一资源标识符,全局范围内路径格式统一。
- URL(Uniform Resource Locator):统一资源定位符。
格式:
text
protocol://HOST:port/path/to/file
示例 :http://www.magedu.com/download/linux.tar.gz
对比:URI 与 URL
| 对比项 | URI | URL |
|---|---|---|
| 含义 | 统一资源标识符(Identifier) | 统一资源定位符(Locator) |
| 范围 | 更广,包括 URL | URL 是 URI 的子集 |
| 示例 | urn:isbn:0-486-27557-4(书号) |
http://example.com/file |
HTTP 方法
| 方法 | 说明 |
|---|---|
| GET | 获取资源 |
| POST | 提交数据 |
| PUT | 上传资源 |
| DELETE | 删除资源 |
| HEAD | 仅获取头部 |
MIME
MIME(Multipurpose Internet Mail Extension):多用途互联网邮件扩展。
- SMTP 是纯文本协议;MIME 将非文本数据(如图片)编码为文本(如 Base64),接收方再还原并调用程序打开。
- 协议首部 :
Content-Type: image/jpeg、text/html等。
动态网页
静态内容 :.html、.css、.jpeg、.png、.gif 等,直接返回文件。
动态内容 :服务器端存储的是脚本 (如 .php、.jsp),接受参数后运行一次,生成 HTML 后返回。
流程:
text
Client --> httpd (index.php) --> PHP 解释器运行 --> 生成 HTML --> httpd --> Client
动态网页 = 静态内容 + 动态内容(只有动态部分需运行)。
对比:静态网页与动态网页
| 对比项 | 静态网页 | 动态网页 |
|---|---|---|
| 文件类型 | .html、.css、.jpeg、.png | .php、.jsp、.py、.cgi |
| 服务器处理 | 直接返回文件 | 运行脚本生成 HTML 后返回 |
| 内容 | 固定,所有人看到一样 | 可根据参数、用户、时间变化 |
| 性能 | 快 | 慢(需运行) |
| 缓存 | 易缓存 | 部分可缓存 |
是
否
💻 客户端
📤 HTTP 请求
GET /index.php?id=1
🖥️ httpd
静态?
📄 读文件
index.html
🔧 调用 PHP
运行 index.php
📝 生成 HTML
📥 HTTP 响应
生活例子:静态网页像"印刷品"------报纸印好了就不变,谁看都一样;动态网页像"点菜"------你点什么厨房(服务器)现做什么,每个人的菜(页面)可能不一样。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| HTTP | HyperText Transfer Protocol,超文本传输协议,Web 的基础协议 | 像"餐厅点菜流程",你说要什么,服务员端上来 |
| 超文本 | 包含链接的文本,可以跳转到其他文档 | 像"百科全书的参见条目",点一下跳到另一页 |
| URL | Uniform Resource Locator,统一资源定位符,网址 | 像"完整地址",包含街道、门牌号、房间号 |
| URI | Uniform Resource Identifier,统一资源标识符,比 URL 更广泛 | 像"身份证号",唯一标识一个资源 |
| GET | HTTP 请求方法,获取资源 | 像"我要看菜单" |
| POST | HTTP 请求方法,提交数据 | 像"我要点这些菜" |
| PUT | HTTP 请求方法,上传资源 | 像"我要上传一个文件" |
| DELETE | HTTP 请求方法,删除资源 | 像"删除我的订单" |
| HEAD | HTTP 请求方法,只获取头部信息 | 像"问一下有没有这道菜,不用真的上菜" |
| MIME | Multipurpose Internet Mail Extension,多用途互联网邮件扩展 | 像"文件类型标签",告诉浏览器这是图片还是文本 |
| 静态内容 | 服务器直接返回的文件,如 HTML、图片 | 像"印好的菜单",拿来就看 |
| 动态内容 | 服务器运行脚本生成的内容,如 PHP、JSP | 像"现做的菜",根据你的要求现场制作 |
| 状态码 | HTTP 响应的数字代码,表示请求结果 | 像"服务员的回应",200 是"好的",404 是"没这道菜" |
| 200 OK | 请求成功 | 像"菜上齐了" |
| 301 | 永久重定向,资源已永久移动 | 像"这家店搬到新地址了" |
| 302 | 临时重定向,资源临时在其他位置 | 像"今天在临时摊位营业" |
| 304 | 未修改,可以使用缓存 | 像"菜单没变,用上次的" |
| 404 | 未找到,资源不存在 | 像"没这道菜" |
| 403 | 禁止访问,没有权限 | 像"这道菜不对外卖" |
| 500 | 服务器内部错误 | 像"厨房出问题了" |
| 503 | 服务不可用,服务器过载 | 像"客人太多,暂停接单" |
| Keep-Alive | HTTP 长连接,一个连接可发送多个请求 | 像"包桌",不用每点一道菜就重新排队 |
| 请求报文 | 客户端发给服务器的消息,包含方法、URL、头部、正文 | 像"点菜单",写明要什么菜、几份、什么口味 |
| 响应报文 | 服务器返回给客户端的消息,包含状态码、头部、正文 | 像"上菜",告诉你菜来了,是什么菜 |
HTTP 报文
请求报文格式:
text
<method> <request-URL> <version>
<headers>
<entity-body>
示例:
text
GET / HTTP/1.1
Host: www.magedu.com
Connection: keep-alive
响应报文格式:
text
<version> <status> <reason-phrase>
<headers>
<entity-body>
示例:
text
HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.17
Content-Encoding: gzip
Content-Length: 6931
<html>...</html>
报文组成:
- 起始行(start line):第一行
- 首部域(Header field):name: value 格式
- 实体主体(Body):响应内容
HTTP 状态码
| 类别 | 含义 | 示例 |
|---|---|---|
| 1xx | 纯信息 | 100 Continue |
| 2xx | 成功 | 200 OK、201 Created、202 Accepted |
| 3xx | 重定向 | 301 Moved Permanently、302 Found、304 Not Modified |
| 4xx | 客户端错误 | 404 Not Found、403 Forbidden |
| 5xx | 服务器错误 | 500 Internal Server Error、503 Service Unavailable |
2xx
3xx
4xx
5xx
📨 HTTP 请求
状态?
✅ 成功
200 OK
↗️ 重定向
301/302
❌ 客户端错
404/403
💥 服务器错
500/503
对比:常见状态码
| 状态码 | 含义 | 何时出现 | 客户端该做什么 |
|---|---|---|---|
| 200 | OK | 请求成功 | 正常处理响应 |
| 301 | 永久重定向 | 资源永久移到新 URL | 更新书签,以后用新 URL |
| 302 | 临时重定向 | 资源临时在新 URL | 本次用新 URL,下次仍用旧 URL |
| 304 | 未修改 | 缓存仍有效 | 用本地缓存 |
| 404 | 未找到 | 文件不存在、URL 错 | 检查 URL |
| 403 | 禁止访问 | 权限不足 | 检查权限或登录 |
| 500 | 服务器内部错 | 脚本错误、配置错 | 联系管理员 |
| 503 | 服务不可用 | 服务器过载或维护 | 稍后重试 |
Web 服务器主要操作(七步)
- 建立连接:接受或拒绝客户端连接。
- 接收请求:通过网络读取 HTTP 请求报文。
- 处理请求:解析报文并决定动作。
- 访问资源:读取请求的文件或调用脚本。
- 构建响应:生成 HTTP 响应报文。
- 发送响应:向客户端发送。
- 记录日志:写入访问日志。
Web 服务器并发架构
| 架构 | 说明 | 优缺点 |
|---|---|---|
| 单线程 | 一次处理一个请求 | 简单,但并发差 |
| 多进程/多线程 | 为每个请求生成进程或线程 | 并发好,但大量进程/线程消耗资源 |
| I/O 多路复用 | 同步监控所有连接,状态改变时处理 | 高效,不被空闲连接占用 |
| 多路复用 + 多线程 | 结合多进程与多路复用 | 充分利用多 CPU,避免单进程服务过多请求 |
Web 代理
代理服务器:工作于客户端与服务器之间,接收客户端请求并转发,再将响应回送客户端。
用途:缓存、访问控制、负载均衡。
对比:Web 服务器并发架构
| 架构 | 并发方式 | 优点 | 缺点 | 典型代表 |
|---|---|---|---|---|
| 单线程 | 一次一个 | 简单 | 并发差 | 早期简单服务器 |
| 多进程/多线程 | 一请求一进程/线程 | 并发好 | 大量进程/线程消耗资源 | Apache prefork |
| I/O 多路复用 | 事件驱动,一进程多连接 | 高效,不被空闲连接占用 | 编程复杂 | Nginx、Apache event |
| 多路复用+多线程 | 多进程+每进程多路复用 | 充分利用多 CPU | 更复杂 | Apache worker |
生活例子:Web 并发架构像"餐厅服务"------单线程是"一个服务员,一次只服务一桌";多进程是"来一桌客人就叫一个服务员";I/O 多路复用是"一个服务员盯着所有桌,哪桌需要就去哪桌";多路复用+多线程是"几个服务员,每人盯几桌"。
httpd (Apache) 安装与配置 🖥️
Apache 简介
Apache :开源 Web 服务器,由 ASF(Apache Software Foundation) 维护。
- 来源:NCSA httpd → A Patchy Server = Apache
- 版本:1.3、2.0、2.2、2.4
- 官网:http://httpd.apache.org
特点:
- 事先创建进程,按需维持适当数量。
- 模块化设计:核心小,功能通过模块添加(如 mod_ssl、mod_php)。
- 支持运行时配置,支持单独编译模块。
- 支持多种虚拟主机(基于 IP、端口、域名)。
- 支持 HTTPS(mod_ssl)、用户认证、基于 IP/主机名的 ACL、每目录访问控制、URL 重写。
MPM(多道处理模块)对比
| MPM | 并发模型 | 优缺点 | 适用 |
|---|---|---|---|
| prefork | 一请求一进程 | 稳定性好,但大并发下消耗资源多(进程切换) | 老系统、需稳定 |
| worker | 一请求一线程(启动多进程,每进程多线程) | 资源占用少,并发好 | 现代系统 |
| event | 基于事件驱动,一进程处理多请求 | 高效,适合大量 Keep-Alive 连接 | Apache 2.4+ |
| mpm_winnt | Windows 线程模型 | 仅 Windows | Windows |
prefork
worker
event
📨 多个并发请求
MPM 模式?
🔄 每请求
fork 一个进程
🧵 每请求
一个线程
⚡ 事件驱动
一进程多请求
📊 稳定但资源多
📊 资源少并发好
📊 最高效
生活例子:MPM 像"银行窗口"------prefork 是"来一个客户开一个窗口"(稳但占地方),worker 是"几个窗口,每个窗口同时办多笔业务"(省空间),event 是"一个大厅经理盯着所有客户,谁需要就去服务谁"(最高效)。
选择 MPM(RHEL):
- 默认:
/usr/sbin/httpd(prefork) - worker:
/usr/sbin/httpd.worker - event:
/usr/sbin/httpd.event
在 /etc/sysconfig/httpd 中设置:
bash
HTTPD=/usr/sbin/httpd.worker
安装与文件结构
安装:
bash
yum -y install httpd
rpm -ql httpd | less # 查看安装文件
主要文件/目录:
| 路径 | 说明 |
|---|---|
/usr/sbin/httpd |
二进制程序(prefork) |
/etc/rc.d/init.d/httpd |
服务脚本 |
/etc/httpd/ |
工作根目录 |
/etc/httpd/conf/httpd.conf |
主配置文件 |
/etc/httpd/conf.d/*.conf |
配置片段(会被 Include) |
/etc/httpd/modules/ |
模块目录(链接到 /usr/lib64/httpd/modules/) |
/etc/httpd/logs/ |
日志目录(链接到 /var/log/httpd/) |
/var/www/html/ |
默认 DocumentRoot(静态页面) |
/var/www/cgi-bin/ |
CGI 脚本目录 |
日志:
- access_log:访问日志
- error_log:错误日志
启动与查看
bash
service httpd start
netstat -tnlp | grep :80 # 查看端口
ps aux | grep httpd # 查看进程
进程:
- httpd: root, root(master process):管理进程。
- httpd: apache, apache(worker process):工作进程。
端口:
- 80/tcp:HTTP
- 443/tcp:HTTPS(mod_ssl)
防火墙配置
临时关闭:
bash
service iptables stop
开放端口 (编辑 /etc/sysconfig/iptables):
text
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
bash
service iptables restart
chkconfig 管理:
bash
chkconfig iptables on # 开机启动
chkconfig iptables off # 开机不启动
SELinux 配置
查看 :getenforce
临时关闭:
bash
setenforce 0 # Permissive
setenforce 1 # Enforcing
永久关闭:
bash
vim /etc/sysconfig/selinux
# 改为 SELINUX=permissive 或 disabled
注 :/etc/selinux/config 是 /etc/sysconfig/selinux 的链接。
httpd.conf 三段结构
查看:
bash
cd /etc/httpd/conf
grep "Section" httpd.conf
| 段 | 说明 |
|---|---|
| Section 1: Global Environment | 全局环境(ServerRoot、Timeout、KeepAlive、MPM 等) |
| Section 2: 'Main' server configuration | 主服务器配置(Listen、DocumentRoot、Directory、日志等) |
| Section 3: Virtual Hosts | 虚拟主机(与主服务器不能同时生效) |
配置格式 :directive value(指令 + 值)
- 指令不区分大小写。
- value 根据需要可能区分大小写。
主要配置指令
| 指令 | 说明 | 示例 |
|---|---|---|
| ServerRoot | 服务器根目录 | ServerRoot "/etc/httpd" |
| PidFile | PID 文件 | PidFile run/httpd.pid |
| Timeout | TCP 连接超时 | Timeout 60 |
| KeepAlive | 是否长连接 | KeepAlive On 或 Off |
| MaxKeepAliveRequests | 长连接最大请求数 | MaxKeepAliveRequests 100 |
| KeepAliveTimeout | 长连接超时 | KeepAliveTimeout 15 |
| Listen | 监听端口 | Listen 80 或 Listen 192.168.0.1:80 |
| LoadModule | 加载模块 | LoadModule foo_module modules/mod_foo.so |
| User | 工作进程用户 | User apache |
| Group | 工作进程组 | Group apache |
| ServerAdmin | 管理员邮箱 | ServerAdmin root@localhost |
| DocumentRoot | 文档根目录 | DocumentRoot "/var/www/html" |
MPM 配置(prefork 示例)
apache
<IfModule prefork.c>
StartServers 8 # 启动时创建 8 个空闲进程
MinSpareServers 5 # 最少空闲进程
MaxSpareServers 20 # 最大空闲进程
ServerLimit 256 # 最多允许多少进程
MaxClients 256 # 最大并发连接数
MaxRequestsPerChild 4000 # 每个子进程最多响应多少请求后重启
</IfModule>
注意 :若要调大 MaxClients,必须先调大 ServerLimit,并完全重启(杀死所有进程)。
worker 示例:
apache
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
目录访问控制
Options(目录选项):
| 选项 | 说明 |
|---|---|
| None | 不支持任何选项 |
| Indexes | 允许索引目录(列文件列表);去掉则不允许 |
| FollowSymLinks | 允许访问符号链接指向的原文件(一般不允许,降低性能) |
| Includes | 允许执行 SSI(服务端包含) |
| ExecCGI | 允许运行 CGI 脚本 |
| All | 支持所有选项 |
示例:
apache
<Directory "/var/www/html">
Options Indexes FollowSymLinks
</Directory>
基于主机的访问控制
Order 指令:
apache
Order allow,deny
Allow from 192.168.0.0/24
Deny from 192.168.0.100
Order 逻辑:
- Order allow,deny:先匹配 Allow,再匹配 Deny;默认拒绝。
- Order deny,allow:先匹配 Deny,再匹配 Allow;默认允许。
对比:Order allow,deny 与 Order deny,allow
| Order | 匹配顺序 | 默认策略 | 典型场景 |
|---|---|---|---|
| allow,deny | 先 Allow 再 Deny | 默认拒绝 | 白名单:只允许特定 IP,其余拒绝 |
| deny,allow | 先 Deny 再 Allow | 默认允许 | 黑名单:只拒绝特定 IP,其余允许 |
示例:
apache
# 白名单:仅允许 192.168.0.0/24
Order allow,deny
Allow from 192.168.0.0/24
# 黑名单:拒绝 192.168.0.100,其余允许
Order deny,allow
Deny from 192.168.0.100
地址表示方式:
- IP:
192.168.0.1 - 网段:
192.168.0.0/24 - 部分 IP:
192.168(匹配 192.168.x.x) - 主机名:
www.a.com - 域名:
magedu.com(匹配该域下所有主机)
示例:
apache
<Directory "/var/www/html">
Order deny,allow
Deny from 172.16.100.177 192.168.0.1
</Directory>
基于用户的访问控制
AllowOverride :是否允许 .htaccess 覆盖配置。
apache
<Directory "/var/www/html/private">
AllowOverride AuthConfig
AuthType Basic
AuthName "Restricted Site..."
AuthUserFile "/etc/httpd/conf/htpasswd"
Require valid-user
</Directory>
htpasswd:创建密码文件。
bash
# 第一次创建(-c)
htpasswd -c -m /etc/httpd/conf/htpasswd hadoop
# 添加用户(不用 -c,否则覆盖)
htpasswd -m /etc/httpd/conf/htpasswd tom
Require 指令:
Require user hadoop tom:仅允许 hadoop、tomRequire valid-user:允许文件中所有用户
基于组的认证:
apache
AuthType Basic
AuthName "By Invitation Only"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName
组文件格式:
text
GroupName: rbowen dpitts sungo rshersey
基于 DBM 的认证:
apache
<Directory /www/docs/private>
AuthName "Private"
AuthType Basic
AuthBasicProvider dbm
AuthDBMUserFile /www/passwords/passwd.dbm
Require valid-user
</Directory>
用户个人站点
配置:
apache
UserDir public_html
访问 :http://server/~username/
示例 :用户 tom 的 ~/public_html/index.html 可通过 http://172.16.100.1/~tom/ 访问。
路径别名
Alias:将 URL 路径映射到本地文件系统路径。
apache
Alias /bbs "/www/forum"
访问 :http://172.16.100.1/bbs/images/logo.jpeg → /www/forum/images/logo.jpeg
注意:URL 路径与本地文件系统路径不是一码事;URL 是相对于 DocumentRoot 或 Alias 的。
日志配置
ErrorLog:错误日志。
apache
ErrorLog logs/error_log
LogLevel:日志级别(debug、info、notice、warn、error、crit、alert、emerg)。
LogFormat:定义日志格式。
apache
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog:访问日志。
apache
CustomLog logs/access_log combined
PV / UV:
- PV(Page View):每天的页面访问量。
- UV(User View):每天的独立 IP 访问量。
CGI
CGI(Common Gateway Interface):通用网关接口,让 Web 服务器与应用程序通信的协议/机制。
流程:
text
Client --> httpd (index.cgi) --> Spawn Process (运行 index.cgi) --> httpd --> Client
支持语言:Perl、Python、Java(Servlet、JSP)、PHP 等。
FastCGI:CGI 的改进版,进程常驻,不必每次 spawn。
对比:CGI 与 FastCGI
| 对比项 | CGI | FastCGI |
|---|---|---|
| 进程 | 每次请求 spawn 新进程 | 进程常驻,重复使用 |
| 性能 | 慢(fork 开销大) | 快 |
| 资源 | 高并发时消耗大 | 资源占用少 |
| 适用 | 低频脚本 | 高频动态内容(如 PHP-FPM) |
传统 CGI
FastCGI
💻 客户端
🖥️ httpd
CGI?
🆕 Spawn 进程
运行脚本
🔄 常驻进程池
分配任务
📥 返回结果
配置:
apache
<Directory "/var/www/cgi-bin">
Options ExecCGI
AddHandler cgi-script .cgi .pl
</Directory>
去除欢迎页面
bash
cd /etc/httpd/conf.d
mv welcome.conf welcome.conf.bak
service httpd restart
安装文档与工具
bash
yum -y install httpd-manual # 安装手册
yum -y install tree # 安装 tree
手册配置 :/etc/httpd/conf.d/manual.conf
测试与调试
测试配置:
bash
httpd -t # 测试 httpd.conf 语法
查看模块:
bash
httpd -l # 查看编译进内核的模块
elinks(文本浏览器):
bash
elinks http://172.16.100.1
elinks -dump http://192.168.5.135/a.html # 显示内容后退出
elinks -source http://192.168.5.135/a.html # 显示源码
httpd 虚拟主机与 HTTPS 🌐
虚拟主机
虚拟主机:一台物理服务器运行多个网站。
类型:
| 类型 | 区分方式 | 示例 |
|---|---|---|
| 基于 IP | 不同 IP | <VirtualHost 192.168.0.1:80> |
| 基于端口 | 不同端口 | <VirtualHost *:8080> |
| 基于域名 | 不同 Host 头 | <VirtualHost *:80> + ServerName www.a.com |
配置示例(基于域名):
apache
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot /var/www/a
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.com
DocumentRoot /var/www/b
</VirtualHost>
注意 :虚拟主机与主服务器(Section 2)不能同时生效;定义虚拟主机后,主服务器的 DocumentRoot 失效。
对比:三种虚拟主机
| 类型 | 区分依据 | 配置要点 | 优缺点 |
|---|---|---|---|
| 基于 IP | 不同 IP | <VirtualHost 192.168.0.1:80> |
需多个 IP;配置简单 |
| 基于端口 | 不同端口 | <VirtualHost *:8080> |
一个 IP 即可;用户需记端口 |
| 基于域名 | Host 头 | <VirtualHost *:80> + ServerName www.a.com |
最常用;需 DNS 解析;HTTP/1.1 支持 |
基于 IP
基于端口
基于域名
📨 HTTP 请求
虚拟主机类型?
🌐 匹配 IP
192.168.0.1→站点A
192.168.0.2→站点B
🔌 匹配端口
:80→站点A
:8080→站点B
📛 匹配 Host 头
www.a.com→站点A
www.b.com→站点B
📂 对应 DocumentRoot
生活例子:虚拟主机像"一栋楼多家公司"------基于 IP 是"每家有独立门牌号",基于端口是"同一门牌,按楼层(端口)找",基于域名是"同一门牌同一楼层,按公司名牌(Host 头)找"。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| httpd | HTTP Daemon,Apache HTTP 服务器的守护进程 | 像"餐厅服务员",负责接待客人(处理请求) |
| Apache | 最流行的开源 Web 服务器软件 | 像"连锁餐厅品牌" |
| MPM | Multi-Processing Module,多道处理模块,定义并发处理方式 | 像"餐厅的服务模式",一桌一服务员还是一人服务多桌 |
| prefork | MPM 模式之一,一个请求一个进程 | 像"一桌一服务员",稳定但人多时消耗大 |
| worker | MPM 模式之一,一个请求一个线程 | 像"服务员可同时照顾几桌",效率高 |
| event | MPM 模式之一,事件驱动,一个进程处理多个请求 | 像"大堂经理",哪桌需要就去哪桌,最高效 |
| DocumentRoot | Web 根目录,存放网站文件的目录 | 像"菜品仓库",所有菜都在这里 |
| 虚拟主机 | 一台服务器上运行多个网站 | 像"一栋楼多家公司",共用一个地址 |
| 基于 IP | 通过不同 IP 区分虚拟主机 | 像"每家公司有独立门牌号" |
| 基于端口 | 通过不同端口区分虚拟主机 | 像"同一门牌,按楼层找" |
| 基于域名 | 通过 Host 头区分虚拟主机,最常用 | 像"同一门牌同楼层,看公司名牌" |
| CGI | Common Gateway Interface,通用网关接口,调用外部程序生成动态内容 | 像"叫外卖",餐厅(httpd)叫外面的厨师(CGI 程序)做菜 |
| FastCGI | CGI 的改进版,进程常驻,不用每次启动 | 像"专职厨师",一直在厨房待命,不用每次叫 |
| .htaccess | 目录级配置文件,可覆盖主配置 | 像"部门规章",可以在总公司规定基础上加部门规定 |
| access_log | 访问日志,记录所有 HTTP 请求 | 像"客人登记簿",记录谁来过、点了什么 |
| error_log | 错误日志,记录服务器错误 | 像"事故记录本",记录出了什么问题 |
| Alias | 路径别名,将 URL 映射到文件系统的其他位置 | 像"快捷方式",访问 /images 实际去 /data/pics |
| DirectoryIndex | 目录默认首页文件名 | 像"默认菜单",进餐厅不说要什么就给你看这个 |
| Options | 目录选项,如是否允许列目录、执行 CGI | 像"部门权限",这个部门能做什么不能做什么 |
| Order allow,deny | 访问控制顺序,先允许再拒绝,默认拒绝 | 像"白名单",只允许名单上的人进 |
| Order deny,allow | 访问控制顺序,先拒绝再允许,默认允许 | 像"黑名单",只拒绝名单上的人,其他都能进 |
| AuthType | 认证类型,如 Basic(基本认证) | 像"门禁类型",刷卡还是输密码 |
| htpasswd | 创建和管理 HTTP 基本认证密码文件的工具 | 像"门禁卡管理系统" |
| mod_ssl | Apache 的 SSL/TLS 模块,提供 HTTPS 支持 | 像"保险箱模块",给餐厅加装保险箱 |
| ServerName | 服务器域名,虚拟主机的标识 | 像"公司名称" |
| Listen | 监听的 IP 和端口 | 像"营业地址和电话" |
HTTPS 配置
HTTPS :HTTP over SSL/TLS,监听 443/tcp。
安装 mod_ssl:
bash
yum -y install mod_ssl
生成私钥与证书(自签名示例):
bash
# 生成私钥(权限 600)
(umask 077; openssl genrsa -out /etc/pki/tls/private/server.key 2048)
# 生成自签名证书
openssl req -new -x509 -key /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt -days 365
配置 (/etc/httpd/conf.d/ssl.conf):
apache
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.example.com:443
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
</VirtualHost>
重启:
bash
service httpd restart
访问 :https://server_ip/
对比:HTTP 与 HTTPS
| 对比项 | HTTP | HTTPS(HTTP over SSL/TLS) |
|---|---|---|
| 传输 | 明文 | 加密 |
| 默认端口 | 80/tcp | 443/tcp |
| 身份 | 无服务器证书校验 | 证书验证服务器身份,防中间人 |
| 性能 | 快 | 稍慢(加解密开销) |
| 典型场景 | 内网、测试 | 生产、登录、支付 |
静态与动态内容
静态内容:
.html、.css、.jpeg、.png、.gif- 直接返回文件,无需运行
动态内容:
- 编程语言写的脚本(
.php、.jsp、.py等) - 接受参数→运行一次→生成 HTML→返回
示例(PHP):
php
<?php
echo "<h1>Hello world</h1>";
?>
小结
系统安装与维护
- Kickstart :命令段(keyboard/lang/rootpw/network/part)+ 软件包段(%packages)+ 脚本段(%pre/%post);通过
ks=指定 ks 文件位置。 - 故障排除:五步法(确定特征→重现→收集信息→从简单入手→一次一种);单用户模式(改密码、改配置)、救援模式(MBR/grub/bash 修复);定期备份 /etc,用 svn/git 管理。
- sudo :条目格式 who which_hosts=(runas) TAG:command;四类别名(User/Host/Runas/Cmnd)必须全大写;
sudo -l列出权限,sudo -k清除缓存;日志在 /var/log/secure。
加密与安全
- 加密类型:对称(快,密钥分发难)、单向(摘要,完整性)、非对称(慢,身份认证与密钥交换)。
- PKI/CA:x509 证书;CA 用私钥签名服务器公钥;客户端用 CA 公钥验证证书。
- SSL/TLS:应用层与传输层间加密层;握手协商算法→交换密钥→加密传输。
- OpenSSL :libcrypto + libssl + openssl 命令;
openssl enc加解密、openssl dgst摘要、openssl genrsa生成私钥、openssl req -x509自签名。 - OpenSSH:sshd/ssh;密钥认证三步(ssh-keygen → ssh-copy-id → ssh);scp 传文件、sftp 交互式;安全建议(改端口、禁 root、密钥认证、不用 V1)。
DNS 与 BIND
- DNS:FQDN↔IP;nsswitch(files→dns);递归(客户端一次请求)、迭代(服务器多次查询);正向/反向解析。
- DNS 服务器类型:主(master)、从(slave,按 serial/refresh/retry/expire 同步)、缓存、转发。
- BIND:named.conf(options + zone 定义);区域文件(SOA、NS、A、MX、PTR、CNAME);端口 53/udp、53/tcp、953/tcp(rndc)。
- 工具 :dig(
-t、-x、+trace)、host、nslookup;named-checkconf、named-checkzone、rndc。 - 子域授权 :父域区域文件中写
SUB_ZONE IN NS ns.sub.zone+ns.sub.zone IN A ip。 - ACL 与 view:allow-query、allow-recursion、allow-transfer;view 按客户端来源返回不同结果。
DHCP
- DHCP:动态分配 IP/掩码/网关/DNS;67/udp(服务端)、68/udp(客户端)。
- 流程:DISCOVER→OFFER→REQUEST→ACK。
HTTP 与 httpd
- HTTP:请求报文(method URL version + headers + body)、响应报文(version status reason + headers + body);状态码 1xx~5xx。
- httpd(Apache):MPM(prefork/worker/event);主配置 httpd.conf 三段(Global、Main、VirtualHost);DocumentRoot、Listen、User/Group。
- 目录控制:Options(Indexes/FollowSymLinks/ExecCGI)、Order allow,deny、基于用户认证(AuthType Basic + htpasswd)。
- CGI:httpd 调用外部程序生成动态内容;FastCGI 为改进版。
- 虚拟主机:基于 IP/端口/域名;与主服务器不能同时生效。
- HTTPS :443/tcp;mod_ssl;需证书与私钥;
SSLEngine on+SSLCertificateFile+SSLCertificateKeyFile。 - 日志:access_log(访问)、error_log(错误);LogFormat 定义格式(common/combined);PV/UV 统计。
- 路径别名 :Alias
/url"/local/path"。