目录
- [PHP 配置与架构](#PHP 配置与架构)
- [MySQL 数据库基础](#MySQL 数据库基础)
- [MySQL 用户与权限](#MySQL 用户与权限)
- [LAMP 架构编译安装](#LAMP 架构编译安装)
- 邮件服务系统
- [FTP 文件传输服务](#FTP 文件传输服务)
- [NFS 网络文件系统](#NFS 网络文件系统)
- [iptables 防火墙](#iptables 防火墙)
- [iptables 高级应用](#iptables 高级应用)
- [Samba 文件共享](#Samba 文件共享)
- [xinetd 与 tcp_wrapper](#xinetd 与 tcp_wrapper)
- [Bash 脚本高级编程](#Bash 脚本高级编程)
- 关系型数据库理论
- [CentOS、Ubuntu 等发行版区别](#CentOS、Ubuntu 等发行版区别)
📌 核心概念一览
| 主题 | 核心概念 | 一句话 |
|---|---|---|
| PHP | Zend 引擎、FastCGI、缓存器 | PHP 解释器通过 Zend 引擎解析代码;FastCGI 提高性能;缓存器缓存 opcode |
| MySQL | 关系型数据库、SQL、存储引擎 | 用表存储数据,用 SQL 查询;支持事务、索引、复制 |
| 邮件服务 | MTA、MDA、MUA、SMTP/POP3/IMAP | MTA 传输邮件,MDA 投递邮件,MUA 是客户端;SMTP 发送,POP3/IMAP 接收 |
| FTP | vsftpd、主动/被动模式、虚拟用户 | 文件传输协议;主动模式服务器连客户端,被动模式客户端连服务器 |
| NFS | 网络文件系统、RPC、exportfs | 让远程目录像本地目录一样使用;基于 RPC 实现 |
| iptables | netfilter、四表五链、NAT | Linux 防火墙;filter 过滤、nat 地址转换、mangle 修改报文 |
| Samba | CIFS/SMB、共享、用户认证 | 让 Linux 共享文件给 Windows;基于 SMB 协议 |
| xinetd | 超级守护进程、访问控制、tcp_wrapper | 管理瞬时守护进程;提供统一的访问控制和日志 |
| 数据库理论 | 关系模型、事务、ACID、索引 | 用表存储结构化数据;事务保证一致性;索引加速查询 |
CentOS、Ubuntu 等发行版区别 🐧
本节汇总 CentOS/RHEL 、Ubuntu/Debian 及 其他发行版 在软件安装、服务管理、配置文件路径等方面的差异,便于跨平台运维和排错。
包管理与软件源
| 对比项 | CentOS / RHEL / Fedora | Ubuntu / Debian | 说明 |
|---|---|---|---|
| 包管理工具 | yum(CentOS 7)/ dnf(CentOS 8+/Fedora) | apt / apt-get | 安装、卸载、更新软件 |
| 包格式 | .rpm | .deb | 不能混用 |
| 软件源配置 | /etc/yum.repos.d/*.repo | /etc/apt/sources.list 或 /etc/apt/sources.list.d/ | 源写法不同 |
| 更新软件列表 | yum makecache / dnf makecache | apt update | 相当于刷新"软件目录" |
| 安装软件 | yum install 包名 / dnf install 包名 | apt install 包名 | 包名可能不同 |
| 卸载软件 | yum remove 包名 | apt remove 包名 | - |
| 查已安装 | rpm -qa | grep 名 / dnf list installed | dpkg -l / apt list --installed | - |
常见服务包名差异
| 服务/软件 | CentOS / RHEL | Ubuntu / Debian | 备注 |
|---|---|---|---|
| Web 服务器 | httpd | apache2 | 包名、配置目录都不同 |
| MySQL 服务 | mysql-server / mariadb-server | mysql-server / mariadb-server | 服务名见下表 |
| FTP 服务器 | vsftpd | vsftpd | 包名相同 |
| NFS | nfs-utils | nfs-kernel-server(服务端)/ nfs-common(客户端) | Ubuntu 服务端包名不同 |
| Samba | samba | samba | 包名相同,配置路径可能不同 |
| 邮件 MTA | postfix | postfix | 包名相同 |
| 防火墙 | iptables / firewalld(默认) | ufw(默认)/ iptables | 默认工具不同 |
| PHP | php / php-fpm | php / php-fpm | 扩展包名可能带版本号 php7.4-xxx |
服务管理命令差异
| 操作 | CentOS 6 | CentOS 7+ / RHEL 7+ | Ubuntu(多数版本) | 说明 |
|---|---|---|---|---|
| 启动服务 | service 服务名 start | systemctl start 服务名 | systemctl start 服务名 或 service 服务名 start | Ubuntu 新版本以 systemd 为主 |
| 停止服务 | service 服务名 stop | systemctl stop 服务名 | systemctl stop 服务名 | - |
| 重启服务 | service 服务名 restart | systemctl restart 服务名 | systemctl restart 服务名 | - |
| 开机自启 | chkconfig 服务名 on | systemctl enable 服务名 | systemctl enable 服务名 | - |
| 查看状态 | service 服务名 status | systemctl status 服务名 | systemctl status 服务名 | - |
| 服务名示例 | mysqld、httpd、vsftpd | mysqld 或 mysql、httpd、vsftpd | mysql、apache2、vsftpd | 注意:Apache 在 Ubuntu 叫 apache2 |
配置文件与路径差异
| 组件 | CentOS / RHEL | Ubuntu / Debian |
|---|---|---|
| Apache 主配置 | /etc/httpd/conf/httpd.conf | /etc/apache2/apache2.conf |
| Apache 站点配置 | /etc/httpd/conf.d/ | /etc/apache2/sites-available/、sites-enabled/ |
| Apache 模块目录 | /etc/httpd/conf.modules.d/ | /etc/apache2/mods-available/、mods-enabled/ |
| MySQL 配置 | /etc/my.cnf | /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/ |
| MySQL 数据目录 | /var/lib/mysql | /var/lib/mysql |
| vsftpd 配置 | /etc/vsftpd/vsftpd.conf | /etc/vsftpd.conf |
| NFS 导出配置 | /etc/exports | /etc/exports |
| Samba 配置 | /etc/samba/smb.conf | /etc/samba/smb.conf |
| Postfix 配置 | /etc/postfix/main.cf | /etc/postfix/main.cf |
| 防火墙规则 | /etc/sysconfig/iptables 或 firewalld 配置 | ufw:/etc/ufw/;iptables:规则需自行保存 |
其他常见差异
| 项目 | CentOS / RHEL | Ubuntu / Debian |
|---|---|---|
| 默认 shell | bash | bash(可改为 zsh 等) |
| root 登录 | 默认可 SSH 登录(可关闭) | 部分版本默认禁止 root SSH,用 sudo |
| 网络配置 | CentOS 7+:/etc/sysconfig/network-scripts/ 或 nmcli;RHEL 8+ 多用 NetworkManager | netplan(新版本)或 /etc/network/interfaces |
| SELinux | 默认开启(Enforcing) | 默认未安装,可用 AppArmor |
| RPC 服务名 | portmap(老版本)/ rpcbind | rpcbind |
| 日志位置 | /var/log/ 下各服务日志 | /var/log/ 下,部分在 /var/log/服务名/ |
使用场景建议(按发行版)
| 场景 | 更常见的发行版 | 原因简述 |
|---|---|---|
| 企业服务器、长期稳定 | CentOS / RHEL | 长周期支持、企业生态、文档多 |
| 云/容器基础镜像 | Alpine、Ubuntu、CentOS | 看需求:Alpine 小,Ubuntu 生态好,CentOS 兼容 RHEL |
| 开发/桌面/易用 | Ubuntu | 易安装、驱动支持好、社区活跃 |
| 与 Red Hat 生态一致 | CentOS、Rocky、AlmaLinux | 与 RHEL 兼容,便于迁移 |
| 轻量/嵌入式 | Debian、Alpine | 资源占用少、定制方便 |
各服务安装与管理快速对照
| 服务 | CentOS / RHEL 安装 | Ubuntu / Debian 安装 | 服务名(systemctl) | 主配置 |
|---|---|---|---|---|
| Apache | yum install httpd | apt install apache2 | httpd(CentOS)/ apache2(Ubuntu) | /etc/httpd/conf/(CentOS)/ /etc/apache2/(Ubuntu) |
| MySQL/MariaDB | yum install mariadb-server | apt install mariadb-server | mariadb 或 mysqld | /etc/my.cnf(CentOS)/ /etc/mysql/(Ubuntu) |
| PHP | yum install php php-fpm php-mysql | apt install php php-fpm php-mysql | php-fpm | /etc/php.ini 或 /etc/php/版本/ |
| vsftpd | yum install vsftpd | apt install vsftpd | vsftpd | /etc/vsftpd/vsftpd.conf 或 /etc/vsftpd.conf |
| NFS 服务端 | yum install nfs-utils | apt install nfs-kernel-server | nfs-server(Ubuntu)/ nfs(CentOS) | /etc/exports |
| NFS 客户端 | yum install nfs-utils | apt install nfs-common | 仅 mount 使用 | - |
| Samba | yum install samba | apt install samba | smb nmb | /etc/samba/smb.conf |
| Postfix | yum install postfix | apt install postfix | postfix | /etc/postfix/main.cf |
| 防火墙 | yum install iptables-services 或 firewalld | ufw 默认 / apt install iptables | iptables 无常驻服务 / firewalld / ufw | /etc/sysconfig/iptables 等 |
说明 :同一行内"服务名"和"主配置"在两种发行版可能不同,部署时以当前系统为准;Ubuntu 新版本普遍使用 systemd,服务名可用
systemctl list-units --type=service查看。
PHP 配置与架构 🐘
使用场景
| 场景 | 说明 | 典型选型 |
|---|---|---|
| 企业官网、CMS | 内容管理、文章发布、简单交互 | LAMP + PHP(如 WordPress、DedeCMS) |
| 电商、论坛 | 高并发、会话、支付对接 | Nginx/Apache + PHP-FPM + MySQL + 缓存(Redis) |
| 内部管理系统 | OA、ERP、报表 | Apache/Nginx + PHP + MySQL,可选 FastCGI |
| API 后端 | 提供 RESTful/JSON 接口 | Nginx + PHP-FPM,关闭不必要扩展 |
| 轻量脚本 | 定时任务、命令行小工具 | 仅 CLI 模式 PHP,无需 Web 服务器 |
| 与现有 Apache 集成 | 老项目、共享主机 | mod_php 或 CGI(不推荐高并发) |
安装可能遇到的问题
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 页面空白或 500 | PHP 报错未显示、语法错误、扩展缺失 | 开 display_errors 排查;看 Web 与 PHP 错误日志;检查 php.ini 与扩展 |
| 找不到 php.ini | 编译路径或包安装路径不同 | php --ini 查加载的 php.ini;CentOS 多在 /etc/,Ubuntu 可能在 /etc/php/版本/ |
| 无法连接 MySQL | 未装 php-mysql/php-pdo、socket 或权限 | 安装对应扩展;确认 MySQL 监听与用户 host(如 localhost vs 127.0.0.1) |
| 上传/执行权限问题 | 进程用户无写权限、SELinux 限制 | 改目录属主/权限;setenforce 0 试关 SELinux;用 audit2allow 放行 |
| FastCGI 超时 | 脚本执行久、nginx/apache 超时过短 | 调大 fastcgi_read_timeout、max_execution_time、request_terminate_timeout |
| opcache 不生效 | 未启用或路径不一致 | php.ini 中启用 opcache;确保 php-fpm 加载的是同一 php.ini |
PHP 源码目录结构
PHP 源码结构清晰,主要包含以下子目录:
| 目录 | 作用 | 类比 |
|---|---|---|
| build | 编译相关文件,如 buildconf 脚本、环境检查脚本 | 像"施工工具箱",放着锤子、扳手等工具 |
| ext | 官方扩展目录,包含大多数 PHP 函数的定义和实现(array、pdo、spl 等) | 像"功能模块库",每个模块提供一类功能 |
| main | PHP 核心文件,实现 PHP 基础设施 | 像"发动机",是整个系统的核心 |
| Zend | Zend 引擎实现目录,负责语法解析、opcode 执行、扩展机制 | 像"翻译官",把代码翻译成机器能理解的指令 |
| pear | PHP 扩展与应用仓库,包含 PEAR 核心文件 | 像"应用商店",提供第三方扩展 |
| sapi | 服务器抽象层代码,如 apache 的 mod_php、cgi、fastcgi、fpm 等接口 | 像"适配器",让 PHP 能和不同 Web 服务器对接 |
| TSRM | 线程安全资源管理器,PHP 线程安全基于此实现 | 像"交通警察",管理多线程访问资源的秩序 |
| tests | PHP 测试脚本集合 | 像"质检部门",确保代码质量 |
| win32 | Windows 平台相关实现 | 像"Windows 专用工具包" |

生活例子:PHP 源码结构像"汽车制造厂"------build 是工具车间,ext 是零件仓库,main 是总装车间,Zend 是发动机工厂,sapi 是不同车型的适配部门(轿车、SUV、卡车)。
PHP 工作原理
Zend 引擎工作流程:
📄 PHP 脚本
🔍 词法分析
Lexical Analysis
🔨 语法分析
Syntax Analysis
💾 编译为 opcode
存入内存
▶️ 执行 opcode
📤 输出结果
两个阶段:
- 第一阶段:词法分析 → 语法分析 → 编译为 opcode(操作码)→ 存入内存
- 第二阶段:执行 opcode
PHP 缓存器
为什么需要 PHP 缓存器?
PHP 每次请求都要重新编译脚本为 opcode,浪费 CPU 资源。缓存器将编译好的 opcode 缓存起来,下次直接执行,大幅提升性能。
| 缓存器 | 特点 |
|---|---|
| APC | Alternative PHP Cache,早期流行的 opcode 缓存 |
| eAccelerator | 基于 APC 改进,增加内容缓存功能 |
| XCache | 轻量级,稳定性好,适合生产环境 |
生活例子:PHP 缓存器像"菜谱记忆"------第一次做菜要看菜谱(编译),记住后(缓存)下次直接做,不用再翻菜谱。
httpd 与 PHP 集成方式
对比:CGI、Module、FastCGI
| 方式 | 工作原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| CGI | 每个请求 fork 一个进程执行 PHP | 简单,进程隔离好 | 性能差,资源消耗大 | 低并发场景 |
| Module | PHP 作为 Apache 模块加载 | 性能好,无需 fork | 稳定性差,PHP 崩溃影响 Apache | 中等并发 |
| FastCGI | PHP 进程常驻,通过 socket 通信 | 性能最好,稳定性高,进程隔离 | 配置复杂 | 高并发生产环境 |
CGI
Module
FastCGI
📨 HTTP 请求
🌐 Web 服务器
Apache/Nginx
集成方式?
🆕 Fork 新进程
执行 PHP
📦 加载 PHP 模块
同进程执行
🔄 PHP-FPM
常驻进程池
📤 输出
生活例子:CGI 像"每次叫外卖"(慢),Module 像"厨师住家里"(快但不安全),FastCGI 像"专职厨师在厨房待命"(又快又安全)。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| PHP | Hypertext Preprocessor,超文本预处理器,服务器端脚本语言 | 像"厨师",根据菜谱(代码)做菜(生成网页) |
| Zend 引擎 | PHP 的核心,负责将 PHP 代码编译为 opcode 并执行 | 像"翻译官+执行官",把人话翻译成机器话并执行 |
| opcode | Operation Code,操作码,PHP 编译后的中间代码 | 像"机器指令",电脑能直接理解的命令 |
| FastCGI | 快速通用网关接口,改进的 CGI,进程常驻 | 像"专职厨师",一直在厨房待命,不用每次叫来 |
| PHP-FPM | FastCGI Process Manager,PHP 的 FastCGI 实现 | 像"厨师长",管理一群厨师(进程池) |
| SAPI | Server API,服务器应用程序接口,PHP 与 Web 服务器的接口层 | 像"翻译器",让 PHP 能和不同 Web 服务器对话 |
| mod_php | Apache 的 PHP 模块,将 PHP 嵌入 Apache | 像"内置厨房",厨师住在餐厅里 |
| 扩展(Extension) | PHP 功能模块,提供额外功能 | 像"厨具",不同厨具做不同菜(功能) |
| PEAR | PHP Extension and Application Repository,PHP 扩展和应用仓库 | 像"应用商店",下载第三方扩展 |
| TSRM | Thread Safe Resource Manager,线程安全资源管理器 | 像"交通警察",防止多线程抢资源出事故 |
MySQL 数据库基础 🗄️
使用场景
| 场景 | 说明 | 典型用法 |
|---|---|---|
| Web 应用数据存储 | 用户、订单、文章等结构化数据 | LAMP/LEMP 后端数据库 |
| 内部系统、OA/ERP | 权限、流程、报表数据 | 业务库 + 只读从库(报表) |
| 读写分离、高可用 | 主库写、从库读,主从复制 | 一主多从 + 应用侧分离 |
| 开发/测试环境 | 本地建库、导入导出、调试 SQL | 单实例或 Docker MySQL |
| 数据分析、报表 | 复杂查询、聚合、定时统计 | 从库或专用分析库,建索引/物化视图 |
| 嵌入式/单机应用 | 桌面软件、本地服务存配置与数据 | SQLite 更轻量;需多机则 MySQL |
安装可能遇到的问题
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| yum/apt 找不到 mysql-server | 源里无此包或名称不同 | CentOS 7:可用 mariadb-server;Ubuntu:apt search mysql;CentOS 8+ 用 dnf |
| service mysqld start 失败 | 服务名不同、未初始化 | Ubuntu 多为 mysql;首次安装需执行 mysql_secure_installation 或 mysqld --initialize |
| root 无法登录、无密码 | 未设置 root 密码或 plugin 不对 | mysql_secure_installation;或 UPDATE mysql.user 设密码并 FLUSH PRIVILEGES |
| ERROR 2002 (HY000): Can't connect to local MySQL server | 未启动、socket 路径错、只监听 127.0.0.1 | 检查服务状态;确认 php/应用里用的是 socket 还是 127.0.0.1;看 my.cnf 中 socket 与 bind-address |
| ERROR 1130: Host 'xxx' is not allowed | 用户 @'host' 不匹配 | 创建或修改用户为 @'%' 或对应 IP,并 FLUSH PRIVILEGES |
| 远程连不上 3306 | 防火墙、bind-address=127.0.0.1 | 开放 3306;my.cnf 中 bind-address=0.0.0.0 或注释掉 |
| 表名大小写问题 | lower_case_table_names 不一致 | 统一设为 0(区分)或 1(不区分),与备份/迁移环境一致 |
MySQL 安装与启动
bash
# 安装 MySQL 服务器
yum -y install mysql-server
# 启动 MySQL 服务
service mysqld start
# 查看端口(默认 3306)
netstat -ntlp | grep mysqld
MySQL 连接方式
bash
# 连接本机(socket 方式,Linux)
mysql -uroot -p -h localhost
# 连接本机(TCP 方式)
mysql -uroot -p -h 127.0.0.1
# 连接远程主机
mysql -uroot -p -h 192.168.1.100
对比:localhost 与 127.0.0.1
| 连接方式 | 协议 | 速度 | 适用 |
|---|---|---|---|
| localhost | Unix Socket(Linux)/ Memory(Windows) | 快 | 本机连接 |
| 127.0.0.1 | TCP/IP | 稍慢 | 本机连接(需测试网络) |
| 远程 IP | TCP/IP | 取决于网络 | 远程连接 |
localhost
127.0.0.1
远程 IP
💻 MySQL 客户端
连接方式?
🔌 Unix Socket
文件通信
🌐 TCP/IP
网络通信
🌍 TCP/IP
互联网通信
🗄️ MySQL 服务器
生活例子:localhost 像"家里内线电话"(socket),127.0.0.1 像"打自己手机"(TCP),远程 IP 像"打朋友手机"。
MySQL 客户端模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
| 交互式模式 | 直接在 mysql 命令行输入 SQL | 日常查询、调试 |
| 批处理模式 | 执行 SQL 脚本文件 | 批量操作、自动化脚本 |
bash
# 交互式模式
mysql -uroot -p
mysql> show databases;
# 批处理模式
mysql -uroot -p < script.sql
mysql -uroot -p -e "show databases;"
MySQL 命令类型
对比:客户端命令 vs 服务器端命令
| 类型 | 特点 | 示例 | 是否需要分号 |
|---|---|---|---|
| 客户端命令 | 由 mysql 客户端处理,不发送到服务器 | help、quit、\q、source |
不需要 |
| 服务器端命令 | 发送到 MySQL 服务器执行 | show databases;、select * from t; |
必须用分号结束 |
SQL 语言分类
📝 SQL 语言
🏗️ DDL
数据定义语言
📊 DML
数据操作语言
🔐 DCL
数据控制语言
CREATE
创建
ALTER
修改
DROP
删除
SELECT
查询
INSERT
插入
UPDATE
更新
DELETE
删除
GRANT
授权
REVOKE
撤销权限
对比:DDL、DML、DCL
| 类型 | 全称 | 作用 | 典型命令 | 是否自动提交 |
|---|---|---|---|---|
| DDL | Data Definition Language | 定义数据库结构(库、表、索引) | CREATE、ALTER、DROP | 是 |
| DML | Data Manipulation Language | 操作数据(增删改查) | SELECT、INSERT、UPDATE、DELETE | 否(可回滚) |
| DCL | Data Control Language | 控制访问权限 | GRANT、REVOKE | 是 |
生活例子:DDL 像"盖房子"(建表),DML 像"搬家具"(操作数据),DCL 像"发门禁卡"(授权)。
MySQL 数据类型
字符类型
| 类型 | 长度 | 特点 | 适用场景 |
|---|---|---|---|
| CHAR(n) | 定长,最大 255 | 不足 n 用空格填充,查询快 | 固定长度字段(如手机号、身份证号) |
| VARCHAR(n) | 变长,最大 65535 | 按实际长度存储,节省空间 | 变长字段(如姓名、地址) |
| TEXT | 大文本,最大 64KB | 存储长文本 | 文章内容、评论 |
| BLOB | 二进制大对象 | 存储二进制数据 | 图片、文件(不推荐) |
数值类型
| 类型 | 字节数 | 范围(有符号) | 范围(无符号) |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
修饰符:
- UNSIGNED:无符号,只能存正数,范围扩大一倍
- ZEROFILL :零填充,如
INT(5) ZEROFILL存 23 显示为 00023
日期时间类型
| 类型 | 格式 | 范围 | 适用 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 生日、日期 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 时间段 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 创建时间、更新时间 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 自动更新的时间戳 |
生活例子:CHAR 像"固定车位"(总是占那么大),VARCHAR 像"弹性车位"(车大占大位,车小占小位),TEXT 像"仓库"(放大件)。
数据库和表操作
创建数据库
bash
# 创建数据库
CREATE DATABASE db_name;
# 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS db_name;
# 删除数据库
DROP DATABASE db_name;
# 查看所有数据库
SHOW DATABASES;
# 使用数据库
USE db_name;
创建表
bash
# 创建学生表
CREATE TABLE students (
name CHAR(20) NOT NULL,
age TINYINT UNSIGNED,
gender CHAR(1) NOT NULL
);
# 查看所有表
SHOW TABLES;
# 查看表结构
DESC students;
# 查看建表语句
SHOW CREATE TABLE students;
修改表
bash
# 添加字段
ALTER TABLE students ADD course VARCHAR(100);
# 修改字段属性
ALTER TABLE students MODIFY age INT;
# 修改字段名称和属性
ALTER TABLE students CHANGE course Course VARCHAR(100) AFTER name;
# 删除字段
ALTER TABLE students DROP course;
# 删除表
DROP TABLE students;
插入数据
bash
# 插入单行数据
INSERT INTO students (name, gender, age) VALUES ('令狐冲', 'M', 25);
# 插入多行数据
INSERT INTO students (name, gender) VALUES
('令狐冲', 'M'),
('任盈盈', 'F');
# 插入所有字段(可省略字段列表)
INSERT INTO students VALUES ('岳灵珊', 'F', 20, '华山剑法');
更新数据
bash
# 更新数据
UPDATE students SET age = 26 WHERE name = '令狐冲';
# 更新多个字段
UPDATE students SET age = 27, course = '独孤九剑' WHERE name = '令狐冲';
查询数据
bash
# 查询所有数据
SELECT * FROM students;
# 查询指定字段
SELECT name, age FROM students;
# 条件查询
SELECT * FROM students WHERE age > 20;
# 排序查询
SELECT * FROM students ORDER BY age DESC;
# 限制结果数量
SELECT * FROM students LIMIT 10;
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| MySQL | 开源关系型数据库管理系统,最流行的数据库之一 | 像"图书馆管理系统",管理大量书籍(数据) |
| 数据库(Database) | 存储数据的容器,包含多个表 | 像"图书馆",里面有很多书架(表) |
| 表(Table) | 存储数据的二维结构,由行和列组成 | 像"Excel 表格",行是记录,列是字段 |
| 字段(Field/Column) | 表中的列,定义数据类型和约束 | 像"表格的列标题",如姓名、年龄 |
| 记录(Row/Record) | 表中的一行数据 | 像"表格的一行",一个学生的完整信息 |
| 主键(Primary Key) | 唯一标识每条记录的字段,不能为空,不能重复 | 像"身份证号",每人唯一 |
| 外键(Foreign Key) | 引用其他表主键的字段,建立表间关系 | 像"学生证上的班级号",指向班级表 |
| 索引(Index) | 加速查询的数据结构 | 像"书的目录",快速找到内容 |
| 约束(Constraint) | 限制字段值的规则 | 像"规章制度",年龄不能为负数 |
| 事务(Transaction) | 一组 SQL 操作,要么全成功要么全失败 | 像"转账",扣钱和加钱必须同时成功 |
| SQL | Structured Query Language,结构化查询语言 | 像"数据库的普通话",所有数据库都懂 |
| 存储引擎 | 表的底层实现方式,如 InnoDB、MyISAM | 像"汽车发动机类型",汽油、柴油、电动 |
MySQL 用户与权限 🔐
创建用户
bash
# 创建用户
CREATE USER 'jerry'@'%' IDENTIFIED BY 'jerry';
# 创建本地用户
CREATE USER 'tom'@'localhost' IDENTIFIED BY 'password';
# 创建指定 IP 用户
CREATE USER 'admin'@'192.168.1.100' IDENTIFIED BY 'password';
# 创建网段用户
CREATE USER 'dev'@'192.168.1.%' IDENTIFIED BY 'password';
HOST 通配符
| 通配符 | 含义 | 示例 | 匹配范围 |
|---|---|---|---|
| % | 匹配任意长度的任意字符 | 'user'@'%' |
所有主机 |
| _ | 匹配任意单个字符 | 'user'@'192.168.0.__' |
192.168.0.01 ~ 192.168.0.99 |
| IP | 精确匹配 IP | 'user'@'192.168.1.100' |
仅该 IP |
| 网段 | 匹配网段 | 'user'@'192.168.1.%' |
192.168.1.0/24 |
| 域名 | 匹配域名 | 'user'@'%.example.com' |
example.com 所有子域名 |
%
IP
网段
localhost
👤 MySQL 用户
HOST 限制?
🌍 任何主机
可连接
🏠 指定 IP
可连接
🏘️ 指定网段
可连接
💻 仅本机
可连接
生活例子:HOST 限制像"门禁卡权限"------% 是"万能卡"(所有门都能开),IP 是"指定房间卡"(只能开一个房间),网段是"楼层卡"(能开一层楼的门)。
授权
bash
# 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'jerry'@'%';
# 授予特定权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'jerry'@'%';
# 授予所有数据库权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'redhat';
# 查看用户权限
SHOW GRANTS FOR 'jerry'@'%';
# 撤销权限
REVOKE INSERT, UPDATE ON mydb.* FROM 'jerry'@'%';
# 刷新权限(使生效)
FLUSH PRIVILEGES;
权限类型
| 权限 | 说明 | 适用对象 |
|---|---|---|
| SELECT | 查询数据 | 表、列 |
| INSERT | 插入数据 | 表、列 |
| UPDATE | 更新数据 | 表、列 |
| DELETE | 删除数据 | 表 |
| CREATE | 创建数据库、表 | 数据库、表 |
| DROP | 删除数据库、表 | 数据库、表 |
| ALTER | 修改表结构 | 表 |
| INDEX | 创建/删除索引 | 表 |
| ALL PRIVILEGES | 所有权限 | 所有 |
授权格式
text
GRANT 权限列表 ON 数据库.表 TO '用户'@'主机' [IDENTIFIED BY '密码'];
- 权限列表:SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 等
- 数据库.表 :
*.*表示所有库所有表,db.*表示 db 库所有表,db.table表示特定表 - 用户@主机:指定用户和允许连接的主机
- IDENTIFIED BY:设置或修改密码(可选)
修改密码
bash
# 方法 1:SET PASSWORD
SET PASSWORD FOR 'jerry'@'%' = PASSWORD('new_password');
# 方法 2:mysqladmin 命令
mysqladmin -uroot -p password 'new_password'
# 方法 3:UPDATE user 表
UPDATE mysql.user SET password=PASSWORD('new_password')
WHERE user='root' AND host='127.0.0.1';
FLUSH PRIVILEGES;
# 方法 4:GRANT 同时授权和设置密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'redhat';
FLUSH PRIVILEGES;
对比:四种修改密码方式
| 方法 | 命令 | 是否需要 FLUSH | 适用场景 |
|---|---|---|---|
| SET PASSWORD | SET PASSWORD FOR 'user'@'host' = PASSWORD('pwd') |
否 | 推荐,安全 |
| mysqladmin | mysqladmin -u user -p password 'new_pwd' |
否 | 命令行快速修改 |
| UPDATE user | UPDATE mysql.user SET password=... |
是 | 批量修改 |
| GRANT | GRANT ... IDENTIFIED BY 'pwd' |
否 | 授权时顺便设置密码 |
生活例子:修改密码像"换锁"------SET PASSWORD 是"找锁匠换锁"(专业),mysqladmin 是"自己换锁"(快速),UPDATE 是"直接改锁芯"(危险,要重启),GRANT 是"换锁+配钥匙一起做"。
远程连接配置
允许远程连接
bash
# 创建远程用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'redhat';
FLUSH PRIVILEGES;
# 检查防火墙(确保 3306 端口开放)
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
图形化客户端工具
| 工具 | 平台 | 特点 |
|---|---|---|
| phpMyAdmin | Web | 基于 Web,无需安装客户端 |
| MySQL Workbench | Windows/Linux/Mac | 官方工具,功能强大 |
| Navicat for MySQL | Windows/Mac | 商业软件,界面友好 |
| MySQL Front | Windows | 轻量级,免费 |
| Toad for MySQL | Windows | 专业 DBA 工具 |
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| 用户(User) | 访问 MySQL 的账号,由用户名和主机组成 | 像"会员卡",卡号+姓名才能用 |
| 权限(Privilege) | 用户可以执行的操作 | 像"会员等级",普通会员、VIP、SVIP 权限不同 |
| 授权(GRANT) | 给用户赋予权限 | 像"发会员卡",给你权限 |
| 撤销权限(REVOKE) | 收回用户权限 | 像"降级会员",收回部分权限 |
| FLUSH PRIVILEGES | 刷新权限表,使权限立即生效 | 像"刷新系统",让改动立即生效 |
| mysql.user 表 | 存储用户信息和全局权限的系统表 | 像"会员数据库",记录所有会员信息 |
| HOST | 用户允许连接的主机 | 像"门禁限制",只有特定地方能刷卡 |
| PASSWORD() | MySQL 密码加密函数 | 像"密码加密器",把明文变成密文 |
LAMP 架构编译安装 🏗️
使用场景
| 场景 | 说明 | 选型建议 |
|---|---|---|
| 企业官网、博客、CMS | 内容展示、后台管理、模板多 | LAMP 即可;WordPress、DedeCMS 等 |
| 中小型电商、论坛 | 注册登录、订单、帖子、搜索 | LAMP + Redis 缓存 + 可选 CDN |
| 内部办公/运维系统 | 审批、工单、监控展示 | LAMP 或 LEMP,内网可简化安全配置 |
| 学习与实验 | 熟悉 Apache、PHP、MySQL | 虚拟机或 Docker 一键 LAMP |
| 高并发、需优化 | 大流量、动态请求多 | Nginx + PHP-FPM(LEMP)+ 缓存 + 数据库优化 |
安装可能遇到的问题
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| configure 报错缺少 xxx | 缺开发库或头文件 | CentOS:yum install xxx-devel;Ubuntu:apt install libxxx-dev;按报错补全依赖 |
| make 报错 | 依赖不全、gcc 版本、权限 | 装全 devel 包;看报错行,缺啥装啥;不用 root 编译时检查 PREFIX 权限 |
| httpd/apache2 启动失败 | 端口占用、配置语法错误、SELinux | netstat 查 80/443;apachectl configtest 或 apache2ctl configtest;临时关 SELinux 测试 |
| PHP 不解析,直接下载 .php 文件 | 未配置 PHP 处理、未加载 mod_php 或 PHP-FPM | Apache:加载 mod_php 或 proxy_fcgi 到 php-fpm;Nginx:配 fastcgi_pass 到 php-fpm |
| 访问 403 Forbidden | 目录无 index、权限、Options/AllowOverride | 检查 DirectoryIndex;目录权限与运行用户;AllowOverride 与 .htaccess |
| 数据库连接失败 | MySQL 未启动、用户名密码/host 错、防火墙 | 先保证本机 mysql 能连;再查应用配置与 GRANT 的 host |
| CentOS 上 Apache 叫 httpd | 包名与 Ubuntu 不同 | 安装 httpd;配置在 /etc/httpd/;Ubuntu 为 apache2、/etc/apache2/ |
LAMP 架构概述
LAMP = Linux + Apache + MySQL + PHP
👤 用户浏览器
🌐 Apache
Web 服务器
🐘 PHP
脚本解释器
🗄️ MySQL
数据库
生活例子:LAMP 像"餐厅系统"------Apache 是"服务员"(接待客人),PHP 是"厨师"(做菜),MySQL 是"仓库"(存储食材和菜谱)。
编译安装目录规范
对比:RPM 包 vs 编译安装
| 对比项 | RPM 包安装 | 编译安装 |
|---|---|---|
| 安装位置 | 分散(/bin、/usr/bin、/etc、/usr/lib) | 集中(/usr/local/软件名/) |
| 配置文件 | /etc/ | /usr/local/软件名/etc/ |
| 二进制 | /bin、/sbin、/usr/bin、/usr/sbin | /usr/local/软件名/bin、sbin |
| 库文件 | /lib、/usr/lib | /usr/local/软件名/lib |
| 文档 | /usr/share/doc、/usr/share/man | /usr/local/软件名/share/doc、man |
| 优点 | 安装快,管理方便 | 可定制,版本灵活 |
| 缺点 | 版本固定,难定制 | 编译慢,管理复杂 |
编译安装标准目录结构
text
/usr/local/软件名/
├── bin/ # 可执行文件
├── sbin/ # 系统管理命令
├── lib/ # 库文件
├── include/ # 头文件
├── etc/ # 配置文件
└── share/ # 文档和手册
├── doc/
└── man/
httpd 2.4 新特性
Apache 2.4 主要改进
| 特性 | 说明 | 优势 |
|---|---|---|
| MPM 运行时装载 | --enable-mpms-shared=all --with-mpm=event |
无需重新编译即可切换 MPM |
| Event MPM | 事件驱动模型,改进 worker MPM | 更高效处理 Keep-Alive 连接 |
| 异步读写 | 支持异步 I/O | 提升性能 |
| 条件配置 | <If>、<ElseIf>、<Else> |
灵活的配置逻辑 |
| 毫秒级 KeepAlive | KeepAlive Timeout 支持毫秒 | 更精细的超时控制 |
| 新模块 | mod_proxy_fcgi、mod_ratelimit、mod_remoteip 等 | 功能更强大 |
访问控制变化(2.2 → 2.4)
Apache 2.2
Order allow,deny
Allow from all
Apache 2.4
Require all granted
Require ip 192.168.1.0/24
Require host example.com
对比:Apache 2.2 vs 2.4 访问控制
| Apache 2.2 | Apache 2.4 | 说明 |
|---|---|---|
Order allow,deny |
Require all granted |
允许所有 |
Order deny,allow |
Require all denied |
拒绝所有 |
Allow from 192.168.1.0/24 |
Require ip 192.168.1.0/24 |
允许特定 IP |
Allow from .example.com |
Require host example.com |
允许特定域名 |
Deny from all |
Require all denied |
拒绝所有 |
MySQL 配置文件
MySQL 配置文件查找顺序
text
/etc/my.cnf → /etc/mysql/my.cnf → $BASEDIR/my.cnf → ~/.my.cnf
配置文件格式(INI 格式)
ini
[mysql]
# MySQL 客户端配置
[mysqld]
# MySQL 服务器配置
port = 3306
datadir = /var/lib/mysql
[client]
# 所有客户端通用配置
MySQL 变量类型
| 变量类型 | 说明 | 查看命令 | 作用域 |
|---|---|---|---|
| 服务器变量 | 定义 MySQL 服务器运行特性 | SHOW GLOBAL VARIABLES |
全局/会话 |
| 状态变量 | 保存 MySQL 运行时统计数据 | SHOW GLOBAL STATUS |
全局/会话 |
bash
# 查看所有服务器变量
SHOW GLOBAL VARIABLES;
# 查看特定变量
SHOW VARIABLES LIKE 'max_connections';
# 查看状态变量
SHOW GLOBAL STATUS LIKE '%select%';
# 查看当前数据库
SELECT database();
# 查看当前用户
SELECT user();
压力测试工具
对比:常用 Web 压力测试工具
| 工具 | 特点 | 适用场景 |
|---|---|---|
| ab | Apache Bench,Apache 自带,简单易用 | 快速测试,单一 URL |
| http_load | 支持多 URL,模拟真实用户行为 | 多页面测试 |
| webbench | 轻量级,支持 HTTP/HTTPS | 简单压测 |
| siege | 功能强大,支持并发、事务 | 复杂场景测试 |
ab 压力测试示例
bash
# 100 个并发,总共 1000 个请求
ab -c 100 -n 1000 http://www.example.com/index.html
# 调整系统打开文件数限制
ulimit -n 10000
# 生成测试文件
dd if=/dev/zero of=/www/test.html bs=1M count=2
# 查看 httpd 进程模型
ps aux | grep httpd
# 监控系统性能
vmstat 1
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| LAMP | Linux + Apache + MySQL + PHP 的组合 | 像"餐厅全套设备",厨房+厨师+仓库 |
| 编译安装 | 从源码编译安装软件 | 像"定制家具",按需求定制 |
| ./configure | 配置编译选项,检查依赖 | 像"量房",看看能不能装 |
| make | 编译源码为二进制 | 像"加工原材料",把木头做成家具 |
| make install | 安装编译好的软件 | 像"安装家具",把家具放到家里 |
| --prefix | 指定安装目录 | 像"选择安装位置",装在客厅还是卧室 |
| 依赖关系 | 软件运行需要的其他软件或库 | 像"配套设施",装空调需要先有电 |
| apr/apr-util | Apache Portable Runtime,Apache 可移植运行库 | 像"工具箱",提供基础工具 |
| 压力测试 | 模拟大量用户访问,测试性能 | 像"压力测试桥梁",看能承受多少重量 |
| ab | Apache Bench,Apache 自带的压力测试工具 | 像"测速仪",测试网站速度 |
| 并发数 | 同时访问的用户数 | 像"同时进餐厅的客人数" |
| ulimit | 限制用户资源使用的命令 | 像"限流",限制最多开多少个文件 |
邮件服务系统 📧
邮件系统架构
📨 发件人
📮 MUA
邮件客户端
🚚 MTA
邮件传输代理
SMTP
🚚 MTA
收件服务器
SMTP
📬 MDA
邮件投递代理
📪 邮箱
Mailbox
📭 MRA
邮件检索代理
POP3/IMAP
📮 MUA
邮件客户端
📩 收件人
生活例子:邮件系统像"快递系统"------MUA 是"寄件人/收件人",MTA 是"快递公司"(顺丰、圆通),MDA 是"快递员"(送到小区),MRA 是"快递柜"(取件),Mailbox 是"收件箱"。
邮件系统组件
对比:邮件系统各组件
| 组件 | 全称 | 作用 | 协议 | 软件示例 |
|---|---|---|---|---|
| MUA | Mail User Agent | 邮件客户端,发送和接收邮件 | - | Outlook、Foxmail、Thunderbird、mutt |
| MTA | Mail Transfer Agent | 邮件传输代理,负责邮件路由和传输 | SMTP | Sendmail、Postfix、Qmail、Exim |
| MDA | Mail Delivery Agent | 邮件投递代理,将邮件投递到用户邮箱 | - | Procmail、Maildrop |
| MRA | Mail Retrieval Agent | 邮件检索代理,用户从服务器取邮件 | POP3、IMAP4 | Dovecot、Cyrus-IMAP |
| WebMail | Web Mail | 基于 Web 的邮件客户端 | HTTP | Openwebmail、Squirrelmail、Extmail |
常用 MTA 对比
| MTA | 特点 | 优点 | 缺点 |
|---|---|---|---|
| Sendmail | 老牌 MTA,功能强大 | 功能全面,兼容性好 | 配置复杂(m4 语法),单体结构 |
| Postfix | 模块化设计,安全高效 | 配置简单,性能好,兼容 Sendmail | - |
| Qmail | 安全性高 | 模块化,安全 | 配置复杂 |
| Exim | 灵活性强 | 配置灵活 | 学习曲线陡 |
邮件协议
对比:SMTP、POP3、IMAP4
| 协议 | 全称 | 端口 | 作用 | 特点 |
|---|---|---|---|---|
| SMTP | Simple Mail Transfer Protocol | 25/tcp | 发送邮件 | 只能发送,不能接收 |
| ESMTP | Extended SMTP | 25/tcp | 扩展 SMTP,支持认证 | 支持 SASL 认证 |
| POP3 | Post Office Protocol v3 | 110/tcp | 接收邮件 | 下载后删除服务器邮件 |
| IMAP4 | Internet Mail Access Protocol v4 | 143/tcp | 接收邮件 | 邮件保留在服务器,支持文件夹 |
| SMTPS | SMTP over SSL/TLS | 465/tcp | 加密发送邮件 | 安全 |
| POP3S | POP3 over SSL/TLS | 995/tcp | 加密接收邮件 | 安全 |
| IMAPS | IMAP4 over SSL/TLS | 993/tcp | 加密接收邮件 | 安全 |
发送
接收
下载删除
保留服务器
是
是
是
📧 邮件操作
操作类型?
📤 SMTP
25/tcp
接收方式?
📥 POP3
110/tcp
📬 IMAP4
143/tcp
需要加密?
需要加密?
需要加密?
🔒 SMTPS
465/tcp
🔒 POP3S
995/tcp
🔒 IMAPS
993/tcp
生活例子:SMTP 像"寄快递",POP3 像"取快递回家"(快递柜清空),IMAP 像"在快递柜看快递"(快递还在柜子里)。
Postfix 配置
Postfix 配置文件
| 文件 | 作用 |
|---|---|
| /etc/postfix/main.cf | 主配置文件,定义 Postfix 运行参数 |
| /etc/postfix/master.cf | 进程管理配置,定义 Postfix 各模块 |
postconf 命令
bash
# 显示默认配置
postconf -d
# 显示修改过的配置
postconf -n
# 显示支持的查找表类型
postconf -m
# 显示支持的 SASL 客户端插件
postconf -A
# 显示支持的 SASL 服务器插件
postconf -a
# 修改配置并保存
postconf -e 'myhostname=mail.example.com'
SMTP 协议命令
bash
# 连接 SMTP 服务器
telnet localhost 25
# SMTP 会话示例
HELO localhost
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
Subject: Test Email
This is a test email.
.
QUIT
SMTP 状态码
| 状态码 | 含义 | 示例 |
|---|---|---|
| 1xx | 纯信息 | 正在处理 |
| 2xx | 成功 | 250 OK |
| 3xx | 需要更多信息 | 354 Start mail input |
| 4xx | 暂时性错误 | 450 Mailbox unavailable |
| 5xx | 永久性错误 | 550 User unknown |
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| MUA | Mail User Agent,邮件用户代理,邮件客户端 | 像"手机邮件 App",用来收发邮件 |
| MTA | Mail Transfer Agent,邮件传输代理,负责邮件路由 | 像"快递公司",负责把邮件送到目的地 |
| MDA | Mail Delivery Agent,邮件投递代理,投递到邮箱 | 像"快递员",把快递送到你家门口 |
| MRA | Mail Retrieval Agent,邮件检索代理,从服务器取邮件 | 像"快递柜",你去取快递 |
| SMTP | Simple Mail Transfer Protocol,简单邮件传输协议 | 像"快递运输协议",规定怎么寄快递 |
| POP3 | Post Office Protocol v3,邮局协议第 3 版 | 像"取快递回家",取完快递柜就空了 |
| IMAP4 | Internet Mail Access Protocol v4,互联网邮件访问协议 | 像"在快递柜看快递",快递还在柜子里 |
| Postfix | 流行的 MTA 软件,模块化设计 | 像"顺丰快递",专业快递公司 |
| Sendmail | 老牌 MTA 软件,功能强大但配置复杂 | 像"老字号快递",历史悠久但流程复杂 |
| SASL | Simple Authentication and Security Layer,认证和安全层 | 像"身份验证",确认你是寄件人 |
| 中继(Relay) | 邮件服务器帮其他服务器转发邮件 | 像"快递中转站",帮忙转发快递 |
| 邮件别名 | 一个邮箱地址指向另一个或多个邮箱 | 像"转发电话",打 A 号码转到 B 号码 |
使用场景(邮件服务)
| 场景 | 说明 | 典型选型 |
|---|---|---|
| 企业自建邮箱 | 内部 + 对外收发,可控数据 | Postfix + Dovecot + WebMail(如 Roundcube) |
| 邮件网关/中继 | 只转发,不落地存储 | Postfix 仅 MTA,配置 relay_domains、transport |
| 收件服务器 | 只收不发或主要收 | Dovecot(IMAP/POP3)+ 可选反垃圾 |
| 开发/测试发信 | 本地发测试邮件 | 本机 Postfix + mail 或 mutt |
| 与 LDAP/MySQL 集成 | 账号统一、虚拟域 | Postfix + SASL + MySQL/LDAP 查用户 |
安装可能遇到的问题(邮件服务)
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 25 端口被占用 | sendmail 或其他 MTA 已运行 | systemctl stop sendmail;chkconfig sendmail off;再启 postfix |
| 发信被拒收 | 无 PTR、SPF/DKIM 未配、进黑名单 | 配好反向解析、SPF/DKIM;先发自家或测试邮箱验证 |
| 收不到信 | MX 未指过来、防火墙、Dovecot 未配 | 查 MX 与 A 记录;放行 25/110/143/995/993;检查 Dovecot 与 mailbox 路径 |
| SASL 认证失败 | saslauthd 未起、mechanism 不匹配 | 启 saslauthd;postconf -a 看支持;配置 smtpd_sasl_* |
FTP 文件传输服务 📁
使用场景
| 场景 | 说明 | 典型选型 |
|---|---|---|
| 公共软件/镜像下载 | 匿名只读,大量用户下载 | vsftpd 匿名用户 + 只读;可配合 CDN |
| 内部文件交换 | 部门间传大文件、安装包 | vsftpd 本地用户或虚拟用户 + chroot |
| 网站上传目录 | 前端页面上传文件到服务器 | vsftpd 虚拟用户映射到 Web 运行用户;或 SFTP 替代 |
| 备份/归档上传 | 定时任务上传备份到 FTP | 脚本 + 被动模式;注意防火墙放行 pasv 端口 |
| 跨平台传文件(含 Windows) | 无需装 Samba,简单共享 | vsftpd;Windows 资源管理器或 FileZilla 访问 |
安装可能遇到的问题
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| 连接超时、无法列出目录 | 被动模式端口未放行、防火墙 | 配置 pasv_min_port/pasv_max_port,防火墙开放该范围;或改用主动模式(客户端支持时) |
| 530 Login incorrect | 用户/密码错、PAM 配置、user_list | 检查 /etc/vsftpd/user_list、ftpusers;PAM 配置是否指向正确 auth |
| 500 OOPS: vsftpd: refusing to run with writable root | chroot 时用户家目录可写 | 家目录改为 555 或 755,或 allow_writeable_chroot=YES(有风险) |
| 匿名无法上传 | 未开 anon_upload_enable、目录权限 | anon_upload_enable=YES;匿名映射用户(如 ftp)对 upload 目录有写权限 |
| CentOS vs Ubuntu 路径 | 配置路径略不同 | CentOS 多在 /etc/vsftpd/vsftpd.conf;Ubuntu 可能为 /etc/vsftpd.conf,包名均为 vsftpd |
FTP 工作原理
FTP 双连接机制
主动模式
被动模式
💻 FTP 客户端
📞 命令连接
21/tcp
持续连接
数据连接
按需建立
📤 服务器 20/tcp
→ 客户端随机端口
📥 客户端随机端口
→ 服务器随机端口
🖥️ FTP 服务器
生活例子:FTP 像"打电话订外卖"------命令连接是"打电话"(一直通着),数据连接是"送外卖"(送完就断开);主动模式是"外卖员主动送上门",被动模式是"你下楼取外卖"。
对比:主动模式 vs 被动模式
| 对比项 | 主动模式(PORT) | 被动模式(PASV) |
|---|---|---|
| 数据连接发起方 | 服务器主动连接客户端 | 客户端主动连接服务器 |
| 服务器端口 | 20/tcp(固定) | 随机端口 |
| 客户端端口 | 随机端口 | 随机端口 |
| 防火墙问题 | 客户端防火墙可能阻止 | 服务器防火墙需开放随机端口范围 |
| NAT 问题 | 客户端在 NAT 后无法使用 | 可以使用 |
| 适用场景 | 服务器到客户端网络通畅 | 客户端在 NAT/防火墙后(常用) |
服务器 客户端 服务器 客户端 主动模式(PORT) 被动模式(PASV) 命令连接 21/tcp PORT 命令(告知客户端端口) 20/tcp → 客户端端口(数据连接) 命令连接 21/tcp PASV 命令 227 Entering Passive Mode(告知服务器端口) 客户端端口 → 服务器端口(数据连接)
FTP 服务器软件
对比:常用 FTP 服务器
| 软件 | 特点 | 平台 | 适用 |
|---|---|---|---|
| vsftpd | Very Secure FTP Daemon,非常安全,性能好 | Linux | 生产环境首选 |
| wu-ftpd | Washington University FTP,老牌 FTP 服务器 | Unix/Linux | 已较少使用 |
| ProFTPD | 功能强大,配置灵活 | Linux | 需要高级功能时 |
| Pure-FTPd | 轻量级,安全性好 | Linux | 简单场景 |
| Serv-U | 商业软件,界面友好 | Windows | Windows 平台 |
vsftpd 配置
vsftpd 文件结构
| 路径 | 说明 |
|---|---|
| /etc/vsftpd/ | 配置文件目录 |
| /etc/vsftpd/vsftpd.conf | 主配置文件 |
| /etc/vsftpd/user_list | 用户列表(黑/白名单) |
| /etc/vsftpd/ftpusers | 禁止登录的用户列表 |
| /etc/init.d/vsftpd | 服务脚本 |
| /usr/sbin/vsftpd | 主程序 |
| /var/ftp/ | 匿名用户根目录 |
vsftpd 用户类型
匿名用户
系统用户
虚拟用户
👤 FTP 用户
用户类型?
🌐 anonymous
映射为 ftp 系统用户
👨💼 本地系统用户
直接使用系统账号
🎭 虚拟用户
映射为指定系统用户
📁 /var/ftp/
🏠 用户家目录
🗄️ MySQL/文件存储
对比:三种 FTP 用户
| 用户类型 | 认证方式 | 映射 | 家目录 | 权限 | 适用场景 |
|---|---|---|---|---|---|
| 匿名用户 | 无需密码或 email | ftp 系统用户 | /var/ftp/ | 受限 | 公共下载 |
| 系统用户 | 系统账号密码 | 自己 | 用户家目录 | 灵活 | 内部使用 |
| 虚拟用户 | 独立用户数据库 | 指定系统用户 | 可配置 | 灵活 | 大量用户,安全隔离 |
vsftpd 常用配置
bash
# 编辑配置文件
vi /etc/vsftpd/vsftpd.conf
# 是否允许匿名用户
anonymous_enable=YES
# 是否允许本地用户
local_enable=YES
# 是否允许匿名用户上传
anon_upload_enable=YES
# 是否允许匿名用户创建目录
anon_mkdir_write_enable=YES
# 禁锢用户在家目录
chroot_local_user=YES
# 监听模式(独立守护进程)
listen=YES
# 被动模式端口范围
pasv_min_port=30000
pasv_max_port=31000
启动 vsftpd
bash
# 安装 vsftpd
yum install -y vsftpd
# 启动服务
service vsftpd start
# 设置开机启动
chkconfig vsftpd on
# 查看端口
netstat -tunlp | grep vsftpd
FTP 客户端
对比:FTP 客户端工具
| 类型 | 工具 | 平台 | 特点 |
|---|---|---|---|
| CLI | ftp | Linux/Windows | 命令行,简单 |
| CLI | lftp | Linux | 功能强大,支持脚本 |
| GUI | FileZilla | 跨平台 | 开源,功能全 |
| GUI | FlashFXP | Windows | 商业,界面友好 |
| GUI | WinSCP | Windows | 支持 FTP/SFTP/SCP |
FTP 常用命令
bash
# 连接 FTP 服务器
ftp 192.168.1.100
# 常用命令
ls # 列出服务器文件
cd # 切换服务器目录
lcd # 切换本地目录
get file # 下载文件
mget *.txt # 下载多个文件
put file # 上传文件
mput *.txt # 上传多个文件
binary # 二进制模式
ascii # 文本模式
bye/quit # 退出
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| FTP | File Transfer Protocol,文件传输协议 | 像"快递服务",专门传输文件 |
| vsftpd | Very Secure FTP Daemon,非常安全的 FTP 守护进程 | 像"顺丰快递",安全可靠 |
| 命令连接 | FTP 的控制连接,21/tcp,持续连接 | 像"打电话",一直通着 |
| 数据连接 | FTP 的数据传输连接,按需建立 | 像"送快递",送完就走 |
| 主动模式 | 服务器主动连接客户端传输数据 | 像"外卖员送上门" |
| 被动模式 | 客户端主动连接服务器传输数据 | 像"你下楼取外卖" |
| chroot | 将用户禁锢在指定目录,无法访问上级目录 | 像"关在房间里",出不去 |
| 匿名用户 | 无需密码即可登录的用户 | 像"游客",随便进 |
| 虚拟用户 | 不是系统用户,存储在数据库或文件中 | 像"会员卡",只在这个店用 |
| PAM | Pluggable Authentication Modules,可插拔认证模块 | 像"门禁系统",可以换不同的锁 |
NFS 网络文件系统 🗂️
使用场景
| 场景 | 说明 | 典型选型 |
|---|---|---|
| Web 集群共享存储 | 多台 Web 服务器共用一个目录(代码/上传) | NFS 导出 /var/www;各节点 mount 同一 NFS |
| 开发/测试共享代码 | 多人共用一套代码或数据 | NFS 导出项目目录;注意 UID/GID 一致或 all_squash |
| 备份集中存储 | 各机把备份写到同一 NFS 目录 | NFS 只写或读写;配合 cron 备份脚本 |
| 容器/虚拟机持久化 | 容器或 VM 挂载宿主机目录 | 宿主机做 NFS 服务端;容器/VM 做客户端 |
| Linux 间大文件共享 | 无需 Samba,纯 Linux 环境 | NFS 性能好、配置简单;注意 ro/rw、root_squash |
安装可能遇到的问题
| 现象 | 可能原因 | 处理思路 |
|---|---|---|
| showmount -e 报错或无输出 | rpcbind 未启、exports 未生效、防火墙 | 先启 rpcbind 再启 nfs;exportfs -rav;放行 111(tcp/udp)、2049(tcp/udp)、mountd/quotad 端口 |
| mount.nfs: Connection refused | 服务端 NFS 未起、端口被拦 | 服务端 netstat/rpcinfo -p 确认 nfsd、mountd 在监听;防火墙放行 |
| Permission denied 或 权限错乱 | root_squash、UID/GID 不一致 | 需写且用 root 时 no_root_squash(慎用);或 all_squash + anonuid/anongid 统一为某用户 |
| CentOS 用 rpcbind,老版用 portmap | 服务名不同 | CentOS 6+ 多为 rpcbind;Ubuntu 也是 rpcbind;先启 rpcbind 再 nfs |
| Ubuntu 服务端包名 | 不是 nfs-utils | 服务端装 nfs-kernel-server;客户端装 nfs-common |
NFS 工作原理
NFS 架构
💻 NFS 客户端
📞 RPC 客户端
🌐 网络
📞 RPC 服务端
portmap/rpcbind
🗄️ NFS 服务器
🔧 内核空间
nfsd
📁 文件系统
ext4/xfs
生活例子:NFS 像"云盘"------你在自己电脑(客户端)上看到的文件,实际存在别人电脑(服务器)上;RPC 像"翻译官",帮你和服务器对话。
为什么 NFS 需要 RPC?
NFS 服务器的端口不固定(除了 nfsd 的 2049),客户端不知道其他服务(mountd、quotad)的端口。RPC(portmap/rpcbind)就像"电话总机",客户端先问 RPC"mountd 在哪个端口",RPC 告诉客户端端口号,客户端再去连接。
NFS 服务组件
| 组件 | 端口 | 作用 |
|---|---|---|
| nfsd | 2049/tcp、2049/udp(固定) | NFS 主服务,处理文件操作 |
| mountd | 随机(半随机) | 处理客户端挂载请求 |
| quotad | 随机(半随机) | 磁盘配额管理 |
| portmap/rpcbind | 111/tcp、111/udp | RPC 端口映射服务 |
对比:NFS vs Samba vs FTP
| 对比项 | NFS | Samba | FTP |
|---|---|---|---|
| 协议 | NFS(RPC) | SMB/CIFS | FTP |
| 平台 | Unix/Linux | 跨平台(Linux/Windows) | 跨平台 |
| 使用方式 | 挂载为本地目录 | 网络邻居/挂载 | 上传下载 |
| 性能 | 快(内核级) | 中等 | 中等 |
| 权限 | Unix 权限 | Windows 权限 | FTP 权限 |
| 适用场景 | Linux 服务器间共享 | Linux 与 Windows 共享 | 文件传输 |
NFS 配置
安装和启动
bash
# 安装 NFS
yum install -y nfs-utils
# 启动 RPC(必须先启动)
service rpcbind start # CentOS 6+
service portmap start # CentOS 5
# 启动 NFS
service nfs start
# 查看 RPC 服务
rpcinfo -p localhost
# 查看端口
netstat -tunlp | grep -E '(nfs|rpc)'
/etc/exports 配置文件
格式:
text
/共享目录 客户端1(选项1,选项2) 客户端2(选项3,选项4)
客户端表示方式
| 方式 | 示例 | 说明 |
|---|---|---|
| IP | 192.168.1.100 | 单个 IP |
| 网段 | 192.168.1.0/24 或 192.168.1.0/255.255.255.0 | 整个网段 |
| 主机名 | client.example.com | 单个主机 |
| 域名 | *.example.com | 域内所有主机 |
| 通配符 | * | 所有主机(不推荐) |
常用选项
| 选项 | 说明 | 默认值 |
|---|---|---|
| ro | 只读 | - |
| rw | 读写 | - |
| sync | 同步写入磁盘 | 推荐 |
| async | 异步写入(先写缓存) | 快但不安全 |
| root_squash | 将 root 映射为匿名用户 | 默认开启 |
| no_root_squash | root 不映射 | 不安全 |
| all_squash | 所有用户都映射为匿名用户 | - |
| anonuid=UID | 指定匿名用户 UID | - |
| anongid=GID | 指定匿名用户 GID | - |
配置示例
bash
# 编辑 /etc/exports
vi /etc/exports
# 示例 1:只读共享给整个网段
/shared 192.168.1.0/24(ro,sync)
# 示例 2:读写共享,root 不映射
/data 192.168.1.0/24(rw,sync,no_root_squash)
# 示例 3:多个客户端不同权限
/public 192.168.1.0/24(ro,sync) 192.168.1.100(rw,sync)
# 重新导出(使配置生效)
exportfs -rav
# 查看已导出的文件系统
exportfs -v
客户端挂载
bash
# 查看服务器共享的目录
showmount -e 192.168.1.100
# 挂载 NFS
mount -t nfs 192.168.1.100:/shared /mnt/nfs
# 查看挂载
df -h
# 卸载
umount /mnt/nfs
# 开机自动挂载(/etc/fstab)
192.168.1.100:/shared /mnt/nfs nfs defaults 0 0
NFS 管理命令
bash
# showmount - 查看 NFS 服务器信息
showmount -e 服务器IP # 查看导出的文件系统
showmount -a 服务器IP # 查看所有挂载
showmount -d 服务器IP # 查看被挂载的目录
# exportfs - 管理导出的文件系统
exportfs -rav # 重新导出所有
exportfs -uav # 取消导出所有
exportfs -v # 显示详细信息
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| NFS | Network File System,网络文件系统 | 像"云盘",远程文件像本地文件一样用 |
| RPC | Remote Procedure Call,远程过程调用 | 像"翻译官",帮不同程序对话 |
| portmap/rpcbind | RPC 端口映射服务 | 像"电话总机",告诉你服务在哪个端口 |
| nfsd | NFS 守护进程,处理文件操作 | 像"文件管理员",负责文件读写 |
| mountd | 处理客户端挂载请求的守护进程 | 像"门卫",检查你能不能挂载 |
| quotad | 磁盘配额守护进程 | 像"限额管理",限制你能用多少空间 |
| exportfs | 管理 NFS 导出文件系统的命令 | 像"共享管理器",管理哪些目录共享 |
| showmount | 查看 NFS 服务器信息的命令 | 像"查看共享列表" |
| root_squash | 将客户端 root 映射为匿名用户 | 像"降权",root 变成普通用户 |
| /etc/exports | NFS 导出配置文件 | 像"共享配置表",定义谁能访问什么 |