linux网络服务+linux数据库4
1.lamp
1.1 介绍
LAMP 是怎么一起工作的?(完整流程)
举个 “用户访问博客并查看文章” 的例子,你就能看懂它们的配合:
- 用户发起请求:你在浏览器里输入博客网址(比如
http://www.myblog.com/article/1
),点击回车; - Apache 接收请求:服务器上的 Apache 服务监听到这个请求,发现需要 “动态内容”(文章是存在数据库里的,不是静态文件),就把请求交给 PHP 处理;
- PHP 处理逻辑:PHP 脚本接收到 “查看第 1 篇文章” 的需求,会写代码去 MySQL 数据库里查询 “id=1 的文章”;
- MySQL 提供数据:MySQL 接收到 PHP 的查询请求,从数据库表中找到第 1 篇文章的标题、内容、发布时间等数据,返回给 PHP;
- PHP 生成网页:PHP 把 MySQL 返回的数据,套进网页模板(比如加上博客的导航栏、样式),生成一个完整的 HTML 网页;
- Apache 返回内容:PHP 把生成的 HTML 交给 Apache,Apache 再把这个网页发送回用户的浏览器,最后你就能看到文章了。
LAMP 的优点:为什么大家都用它搭网站?
- 免费开源:四个组件全是免费的,不用花一分钱就能用,对个人开发者、小公司特别友好;
- 跨平台 + 兼容性强:Linux 支持各种服务器硬件,Apache 能跑在 Windows/Linux 上,PHP/MySQL 也能和其他工具搭配(比如把 Apache 换成 Nginx,就成了 LNMP);
- 容易上手 + 资料多:用了几十年,网上教程、问题解决方案特别多,哪怕是新手,跟着步骤也能搭起来;
- 稳定可靠:Linux 系统很少死机,Apache 能抗住大量用户同时访问,MySQL 存数据安全不易丢,适合长期运行的网站。
1.2 准备工作
1.3 源码软件安装
1.4 centos7环境搭建
......
2.apache
2.1 讲在apache之前
2.2 概述&工作模式
2.3 配置文件详解
apache配置文件严格区分大小写
2.4实验-- 目录别名
一、实验原理
Apache 的目录别名(Alias)功能,是将URL 路径与服务器本地真实目录做映射。比如,把 http://域名/icons/
映射到服务器的 /usr/local/apache2/icons/
目录,用户访问 icons/
时,实际访问的是服务器上的这个真实目录,无需移动文件到网站根目录(DocumentRoot
),实现 “URL 伪路径” 访问真实文件。
二、详细步骤及验证(以 Apache 2.4 为例,路径需根据实际安装调整)
步骤 1:编辑主配置文件,启用子配置
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/conf/httpd.conf
- 找到并取消注释(删除行首的
#
)以下配置,启用子配置文件httpd-autoindex.conf
:Include etc/extra/httpd-autoindex.conf
- 保存并退出(
vim
中按Esc
,输入:wq
回车)。
原理
Apache 主配置文件通过 Include
指令加载子配置文件,httpd-autoindex.conf
用于配置目录列表、别名等功能,取消注释后才能让子配置生效。
验证
执行 grep -v "^#" /usr/local/apache2/conf/httpd.conf | grep Include
,若输出包含 Include etc/extra/httpd-autoindex.conf
,说明启用成功。
步骤 2:编辑子配置文件,添加目录别名
操作
- 打开子配置文件
httpd-autoindex.conf
:vim /usr/local/apache2/conf/extra/httpd-autoindex.conf
- 在文件中添加自定义别名配置(以映射
URL 路径 /myfiles
到真实目录/data/my_shared_files
为例):# 定义别名:访问 /myfiles 时,实际访问 /data/my_shared_files Alias /myfiles/ "/data/my_shared_files/"# 配置别名对应的目录权限 <Directory "/data/my_shared_files">Options Indexes FollowSymLinks # 允许目录列表、跟随符号链接AllowOverride None # 不允许.htaccess覆盖配置Require all granted # 允许所有用户访问 </Directory>
- 保存并退出。
- 创建真实目录并添加测试文件:
mkdir -p /data/my_shared_files echo "Test file for Alias" > /data/my_shared_files/test.txt
原理
Alias /myfiles/ "/data/my_shared_files/"
:核心配置,将URL 路径 /myfiles/
映射到真实目录/data/my_shared_files/
(注意:别名和真实目录末尾都要加/
,否则可能报错)。<Directory>
块:配置真实目录的访问权限,Require all granted
确保所有用户都能访问。
验证
- 执行
cat /usr/local/apache2/conf/extra/httpd-autoindex.conf
,查看是否包含上述Alias
和<Directory>
配置; - 执行
ls /data/my_shared_files/
,确认test.txt
存在。
步骤 3:重启 Apache 服务,使配置生效
操作
# 检查配置语法(确保无错误)
/usr/local/apache2/bin/apachectl configtest# 重启 Apache
/usr/local/apache2/bin/apachectl restart
原理
修改配置后,必须重启 Apache 才能加载新配置,configtest
用于提前检查配置文件语法,避免重启失败。
验证
执行 ps -ef | grep httpd
,若能看到 Apache 进程(如 root
启动的主进程和 nobody
启动的工作进程),说明重启成功;若 configtest
报错,根据提示修正配置后重新执行。
步骤 4:验证目录别名访问
操作
在客户端浏览器中访问:http://Apache服务器IP/myfiles/
原理
客户端通过浏览器发送 HTTP 请求,Apache 接收到 /myfiles/
的请求后,根据 Alias
配置,转发到真实目录 /data/my_shared_files/
,并返回该目录的文件列表或具体文件内容。
验证
- 若能看到
test.txt
文件列表,且点击test.txt
能打开并显示Test file for Alias
,说明别名配置生效; - 额外测试:在服务器的
/data/my_shared_files/
中新增文件(如touch new.txt
),刷新浏览器,若能看到new.txt
,说明实时同步。
三、额外验证:命令行访问(非浏览器)
操作
在客户端执行(替换 Apache服务器IP
为实际 IP):
curl http://Apache服务器IP/myfiles/test.txt
原理
curl
是命令行 HTTP 工具,用于模拟浏览器请求,测试更高效。
验证
若输出 Test file for Alias
,说明通过命令行也能成功访问别名映射的文件。
通过以上步骤,可完整验证 Apache 目录别名的配置与访问,实现 “URL 伪路径” 到真实目录的映射,无需移动文件即可对外共享。
2.5 目录登录保护
一、实验原理
Apache 的基于文件的权限认证(mod_auth_basic
模块),是通过在目录中放置 .htaccess
文件,要求用户输入 “用户名 + 密码” 才能访问该目录。核心流程:
- 配置 Apache 允许目录使用
.htaccess
覆盖权限; - 编写
.htaccess
定义认证规则(如认证类型、密码文件路径); - 用
htpasswd
生成密码文件,添加允许访问的用户; - 重启 Apache 使配置生效,用户访问时需输入密码验证。
二、详细步骤及验证(以 Apache 2.4 为例,路径需根据实际安装调整)
步骤 1:编辑 Apache 主配置文件,允许 .htaccess
覆盖
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/etc/httpd.conf
- 找到目标目录的
<Directory>
配置块(如/usr/local/apache2/htdocs/admin
),修改为:<Directory "/usr/local/apache2/htdocs/admin">Options Indexes FollowSymLinksAllowOverride All # 允许.htaccess覆盖配置Require all granted </Directory>
- 保存并退出(
vim
中按Esc
,输入:wq
回车)。
原理
AllowOverride All
:允许该目录下的.htaccess
文件覆盖 Apache 主配置中的权限规则;Options Indexes FollowSymLinks
:允许目录列表、跟随符号链接(可选,方便查看目录内容)。
验证
执行 grep -A 3 "<Directory.*admin>" /usr/local/apache2/etc/httpd.conf
,确认 AllowOverride All
已配置。
步骤 2:创建 .htaccess
权限认证文件
操作
- 进入目标目录:
cd /usr/local/apache2/htdocs/admin
- 创建并编辑
.htaccess
文件:vim .htaccess
- 添加以下内容:
AuthName "Welcome to admin area" # 认证提示信息(弹窗显示) AuthType basic # 认证类型(basic 为基本认证) AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd # 密码文件路径 Require valid-user # 允许密码文件中所有用户访问
- 保存并退出。
原理
AuthName
:用户访问时,浏览器弹窗的提示文字;AuthType basic
:使用 HTTP 基本认证(明文传输密码,仅适合测试或内网环境);AuthUserFile
:指定存储用户名密码的文件路径;Require valid-user
:只要是密码文件中存在的用户,都允许访问该目录。
验证
执行 cat /usr/local/apache2/htdocs/admin/.htaccess
,确认内容与上述一致。
步骤 3:创建密码文件并添加用户
操作
- 添加第一个用户(如
test1
):htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1
123456
)。 - 添加第二个用户(如
test2
,注意:添加多个用户时,去掉-c
避免覆盖文件):htpasswd /usr/local/apache2/htdocs/admin/apache.passwd test2
abc123
)。
原理
htpasswd
是 Apache 自带的密码文件管理工具;-c
:创建新的密码文件(仅第一次用,后续添加用户需去掉-c
,否则会覆盖已有用户);- 无
-c
:向现有密码文件中追加用户。
验证
- 执行
cat /usr/local/apache2/htdocs/admin/apache.passwd
,应看到test1:$apr1$xxx...
和test2:$apr1$yyy...
(密码已被加密); - 执行
htpasswd -bv /usr/local/apache2/htdocs/admin/apache.passwd test3 123
(-bv
用于验证用户密码),若输出Adding password for user test3
,说明密码设置符合规则。
步骤 4:重启 Apache 服务,使配置生效
操作
- 检查配置语法(避免错误):
/usr/local/apache2/bin/apachectl configtest
- 重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
修改配置或密码文件后,必须重启 Apache 才能加载新的认证规则。configtest
用于提前检查配置文件语法,防止重启失败。
验证
- 若
configtest
输出Syntax OK
,说明配置无语法错误; - 执行
ps -ef | grep httpd
,若能看到 Apache 进程(如root
启动的主进程和nobody
启动的工作进程),说明重启成功。
步骤 5:验证密码认证(浏览器访问)
操作
在客户端浏览器中访问:http://Apache服务器IP/htdocs/admin/
原理
浏览器发送请求到 Apache 后,Apache 会检测到目标目录有 .htaccess
认证配置,弹出 “用户名 + 密码” 输入框,验证通过后才会返回目录内容。
验证
- 输入
test1
和密码123456
,应能成功进入目录,看到目录下的文件(若目录为空,至少能看到 “目录列表”); - 输入错误密码(如
wrong
),会提示 “认证失败”,无法访问; - 用
test2
和密码abc123
登录,同样应能成功访问,验证多用户生效。
三、额外验证:命令行访问(非浏览器)
操作
在客户端执行(替换 Apache服务器IP
为实际 IP):
curl -u test1:123456 http://Apache服务器IP/htdocs/admin/
原理
curl -u 用户名:密码
用于模拟浏览器的基本认证,测试更高效。
验证
若输出包含目标目录的内容(如目录列表或文件内容),说明命令行认证也成功。
通过以上步骤,可完整验证 Apache 基于 .htaccess
的目录权限认证,实现 “指定目录需密码才能访问” 的效果,适合测试内网环境的简单权限控制。
2.6 虚拟主机
2.6.1 区别
用大白话来说,虚拟机是 “模拟一台完整电脑”,虚拟主机是 “在一台真实电脑里分割出的多个‘网站空间’”—— 两者的核心区别在于 “功能范围” 和 “使用场景”,一个能当完整电脑用,一个只能用来放网站。
核心定义:本质是啥?
先搞懂最基础的区别,用 “房子” 类比更直观:
类型 | 核心定义 | 类比场景 |
---|---|---|
虚拟机(VM) | 通过软件(如 VMware、VirtualBox、KVM)在 “真实电脑” 上模拟出的 “完整独立电脑” | 你买了一套毛坯房,能自己装修、买家具,想当卧室、书房、健身房都可以 |
虚拟主机(VH) | 在 “真实服务器” 上通过软件(如 Apache、Nginx)分割出的 “独立网站存储空间” | 你租了公寓里的一个单间,只能用来住(放网站),不能改房子结构,也不能当健身房 |
核心区别:6 个维度对比
从 “功能、资源、独立性、使用场景” 等关键维度,把差异讲透:
对比维度 | 虚拟机(VM) | 虚拟主机(VH) |
---|---|---|
1. 功能范围 | 能做 “完整电脑” 的所有事:装操作系统(Windows/Linux)、装软件(浏览器、Office、数据库、服务器)、玩游戏、跑程序,甚至再装虚拟机 | 只能做 “放网站” 的事:存储网站文件(HTML、PHP、图片)、对接数据库(MySQL),不能装操作系统,也不能跑非网站相关的软件(如 Office、游戏) |
2. 资源占用 | 资源 “独占且灵活”:你得给它分配固定的 CPU 核心、内存、硬盘(比如 2 核 4G 内存 50G 硬盘),这些资源只给这台虚拟机用,不够了可以手动加 | 资源 “共享且有限”:所有虚拟主机共享真实服务器的 CPU、内存、硬盘(比如一台服务器有 16 核 32G 内存,分给 100 个虚拟主机用),每个虚拟主机的资源有上限(比如 1 核 1G 内存 5G 硬盘),不能随便加 |
3. 系统独立性 | 完全独立的 “小电脑”:虚拟机里的操作系统崩溃、中毒,不会影响真实电脑;多个虚拟机之间也互不干扰(比如 A 虚拟机装 Linux,B 虚拟机装 Windows,各自独立) | 高度依赖 “母服务器”:所有虚拟主机共用母服务器的操作系统(比如 Linux),如果母服务器崩溃,所有虚拟主机都用不了;而且虚拟主机之间可能互相影响(比如 A 虚拟主机占用太多 CPU,B 虚拟主机的网站就会变卡) |
4. 管理权限 | 拥有 “root / 管理员权限”:你能像操作自己的真实电脑一样,修改虚拟机的系统设置、装驱动、管理所有文件,甚至格式化虚拟机的硬盘 | 只有 “网站管理权限”:你只能管理自己虚拟主机里的网站文件(上传 / 删除网页)、数据库,不能修改母服务器的系统设置,也看不到其他虚拟主机的文件 |
5. 性能表现 | 性能 “接近真实电脑”:只要给虚拟机分配足够的资源,跑程序、开服务的速度和真实电脑差不多(比如用虚拟机搭服务器,能扛中等并发) | 性能 “受限于共享资源”:如果同一服务器的其他虚拟主机访问量高,你的网站会变卡;而且虚拟主机通常不支持高并发(比如每秒几百人访问就可能崩) |
6. 适用人群 | 开发者、测试人员、需要独立环境的用户:比如程序员用虚拟机装 Linux 测程序,运维人员用虚拟机模拟多服务器环境,普通人用虚拟机装旧系统玩老游戏 | 个人站长、小企业:比如你想搭个人博客、小公司官网,不想花太多钱,也不想管服务器维护,买个虚拟主机就能用 |
举例子:什么时候用虚拟机?什么时候用虚拟主机?
用实际场景帮你判断:
场景 1:你想搭一个个人博客
- 选虚拟主机:花几十块钱买个虚拟主机,把博客程序(如 WordPress)上传上去,不用管服务器配置,直接就能用,省心又便宜;
- 不用虚拟机:如果用虚拟机,你得先装 Linux 系统,再搭 Apache/MySQL/PHP 环境,还要配置域名、端口,对新手来说太复杂,而且虚拟机得一直开着电脑才能访问,不方便。
场景 2:你是程序员,需要测 Linux 下的程序
- 选虚拟机:在 Windows 电脑上装个 VMware,再在虚拟机里装 Linux 系统,然后在 Linux 里跑程序,就算程序崩了,也不会影响 Windows 系统,测试完关掉虚拟机就行;
- 不用虚拟主机:虚拟主机只能放网站,不能装 Linux 系统,也不能跑你的测试程序,完全用不了。
场景 3:你想搭一个能扛 100 人同时访问的小型企业官网
- 选虚拟主机:企业官网访问量不大,虚拟主机的资源足够用,而且服务商负责维护服务器,你只要更新官网内容就行;
- 不用虚拟机:除非你有技术团队能自己维护虚拟机,否则虚拟机需要自己管安全、备份,反而麻烦。
场景 4:你想模拟 “多服务器集群” 测试
- 选虚拟机:在一台高性能电脑上开 3 个虚拟机,分别装 Linux 当 “Web 服务器”“数据库服务器”“缓存服务器”,模拟真实的集群环境,测试程序在多服务器下的运行情况;
- 不用虚拟主机:虚拟主机连独立系统都没有,根本没法模拟多服务器集群。
容易混淆的点:虚拟主机 vs 云服务器(ECS)
很多人会把 “虚拟主机” 和 “云服务器” 搞混,其实云服务器本质是 “在云上的虚拟机”—— 比如阿里云 ECS、腾讯云 CVM,就是服务商在他们的物理服务器上开的虚拟机,你买了之后能像用自己的虚拟机一样,装系统、管权限,性能比虚拟主机强很多,但价格也更贵。
简单总结:
- 虚拟主机:只能放网站,便宜、省心,适合新手;
- 云服务器(虚拟机):能当完整电脑用,灵活、性能强,适合需要独立环境的开发者 / 企业;
- 本地虚拟机:自己电脑上开的,适合测试、学习,不用花钱,但需要自己维护。
2.6.2 实验
步骤 1:实验准备(域名解析 + 网站目录)
1.1 域名解析(修改本地 hosts
文件模拟)
- Windows 客户端:打开
C:\Windows\System32\drivers\etc\hosts
,添加以下内容(将域名指向 Apache 服务器 IP,假设服务器 IP 为192.168.10.80
):plaintext
192.168.10.80 www.sina.com 192.168.10.80 www.sohu.com
- Linux 客户端(可选):打开
/etc/hosts
,添加同样内容。
1.2 网站目录与测试文件
在 Apache 服务器上执行:
# 创建新浪网站目录及测试文件
mkdir -p /usr/local/apache/htdocs/sina
echo "This is Sina Website" > /usr/local/apache/htdocs/sina/index.html# 创建搜狐网站目录及测试文件
mkdir -p /usr/local/apache/htdocs/sohu
echo "This is Sohu Website" > /usr/local/apache/htdocs/sohu/index.html
原理
hosts
文件是本地 “域名 -> IP” 的映射表,优先于 DNS 解析,用于实验环境快速模拟域名访问;- 每个网站需要独立的目录存放文件,
index.html
是默认首页。
验证
- 执行
cat /usr/local/apache/htdocs/sina/index.html
,应输出This is Sina Website
; - 执行
cat /usr/local/apache/htdocs/sohu/index.html
,应输出This is Sohu Website
。
步骤 2:修改 Apache 主配置,启用虚拟主机
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache/etc/httpd.conf
- 找到并取消注释(删除行首
#
)以下配置,启用虚拟主机子配置:Include etc/extra/httpd-vhosts.conf
- 保存并退出(
vim
中按Esc
,输入:wq
回车)。
原理
Apache 主配置通过 Include
加载子配置文件 httpd-vhosts.conf
,该文件专门用于配置虚拟主机。
验证
执行 grep -v "^#" /usr/local/apache/etc/httpd.conf | grep Include
,应输出 Include etc/extra/httpd-vhosts.conf
。
步骤 3:配置虚拟主机子配置文件
操作
- 打开虚拟主机配置文件
httpd-vhosts.conf
:vim /usr/local/apache/etc/extra/httpd-vhosts.conf
- 添加以下内容(配置两个虚拟主机,分别对应
www.sina.com
和www.sohu.com
):# 配置新浪虚拟主机 <VirtualHost *:80>ServerAdmin webmaster@sina.comDocumentRoot "/usr/local/apache/htdocs/sina"ServerName www.sina.comErrorLog "logs/sina_error_log"CustomLog "logs/sina_access_log" common </VirtualHost># 配置搜狐虚拟主机 <VirtualHost *:80>ServerAdmin webmaster@sohu.comDocumentRoot "/usr/local/apache/htdocs/sohu"ServerName www.sohu.comErrorLog "logs/sohu_error_log"CustomLog "logs/sohu_access_log" common </VirtualHost>
- 保存并退出。
原理
<VirtualHost *:80>
:监听所有 IP 的 80 端口(HTTP 默认端口);DocumentRoot
:指定该虚拟主机对应的网站根目录;ServerName
:指定该虚拟主机对应的域名;ErrorLog/CustomLog
:指定错误日志和访问日志的路径。
验证
执行 cat /usr/local/apache/etc/extra/httpd-vhosts.conf
,确认配置与上述一致。
步骤 4:重启 Apache 服务,使配置生效
操作
- 检查配置语法(避免错误):
/usr/local/apache/bin/apachectl configtest
- 重启 Apache:
/usr/local/apache/bin/apachectl restart
原理
修改配置后必须重启 Apache 才能加载新的虚拟主机配置,configtest
用于提前检查配置文件语法。
验证
- 若
configtest
输出Syntax OK
,说明配置无语法错误; - 执行
ps -ef | grep httpd
,若能看到 Apache 进程(如root
启动的主进程和nobody
启动的工作进程),说明重启成功。
步骤 5:验证虚拟主机访问(客户端测试)
操作
在客户端浏览器中分别访问:
http://www.sina.com
http://www.sohu.com
原理
客户端通过 hosts
文件将域名解析到服务器 IP,服务器 Apache 根据 ServerName
匹配虚拟主机,返回对应目录的 index.html
。
验证
- 访问
www.sina.com
,应显示This is Sina Website
; - 访问
www.sohu.com
,应显示This is Sohu Website
; - 额外验证:在服务器
sina
目录新增文件test.txt
,客户端访问http://www.sina.com/test.txt
应能正常显示文件内容,说明目录映射正确。
2.6.3、额外验证:命令行访问(非浏览器)
操作
在客户端执行(替换 192.168.10.80
为服务器 IP):
# 访问新浪
curl -H "Host: www.sina.com" http://192.168.10.80# 访问搜狐
curl -H "Host: www.sohu.com" http://192.168.10.80
原理
curl -H "Host: 域名"
用于模拟浏览器的 Host
请求头,测试虚拟主机的域名匹配逻辑。
验证
- 新浪请求应输出
This is Sina Website
; - 搜狐请求应输出
This is Sohu Website
。
2.7 域名跳转
Apache 的 mod_rewrite
模块通过规则匹配和重写引擎,实现 URL / 域名的 “重定向” 或 “重写”。本实验通过 .htaccess
文件配置规则,将对 www.sohu.com
的请求永久重定向到 www.sina.com
,核心是利用 RewriteCond
匹配域名,RewriteRule
执行重定向。
步骤(以 Apache 2.4 为例,路径需根据实际安装调整):
步骤 1:实验条件准备
1.1 确保虚拟主机可正常访问
- 参考之前 “虚拟主机配置” 步骤,确保
www.sina.com
和www.sohu.com
能通过浏览器正常访问(显示各自的index.html
内容)。
1.2 开启 mod_rewrite
模块
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/conf/httpd.conf
- 找到并取消注释(删除行首
#
)以下配置,启用mod_rewrite
:LoadModule rewrite_module modules/mod_rewrite.so
- 保存并退出,重启 Apache 使模块生效:
/usr/local/apache2/bin/apachectl restart
原理
mod_rewrite
是 Apache 的 “重写模块”,默认可能被注释,需手动启用才能使用 URL 重写功能。
验证
执行 httpd -M | grep rewrite
,若输出 rewrite_module (shared)
,说明模块已加载。
步骤 2:修改虚拟主机配置,允许 .htaccess
覆盖
操作
- 打开虚拟主机配置文件
httpd-vhosts.conf
(路径如/usr/local/apache2/conf/extra/httpd-vhosts.conf
):vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
- 找到
www.sohu.com
对应的<VirtualHost>
块,在其内部添加<Directory>
配置:<VirtualHost *:80>ServerAdmin webmaster@sohu.comDocumentRoot "/usr/local/apache2/htdocs/sohu"ServerName www.sohu.comErrorLog "logs/sohu_error_log"CustomLog "logs/sohu_access_log" common# 新增:允许.htaccess覆盖权限<Directory "/usr/local/apache2/htdocs/sohu">Options Indexes FollowSymLinksAllowOverride All # 允许.htaccess覆盖配置Require all granted</Directory> </VirtualHost>
- 保存并退出。
原理
AllowOverride All
允许 www.sohu.com
对应的网站目录(/usr/local/apache2/htdocs/sohu
)使用 .htaccess
文件覆盖 Apache 主配置的权限规则,为 mod_rewrite
提供配置入口。
验证
执行 cat /usr/local/apache2/conf/extra/httpd-vhosts.conf
,确认 <Directory>
块配置正确。
步骤 3:创建 .htaccess
规则匹配文件
操作
- 进入
www.sohu.com
对应的网站根目录:cd /usr/local/apache2/htdocs/sohu
- 创建并编辑
.htaccess
文件:vim .htaccess
- 添加以下内容
RewriteEngine on # 开启重写引擎 # 条件:当请求的域名是 www.sohu.com 时 RewriteCond %{HTTP_HOST} ^www\.sohu\.com$ # 规则:将所有请求永久重定向到 www.sina.com,并保留原路径($1 表示原请求的路径) RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
- 保存并退出。
原理
RewriteEngine on
:启用当前目录的重写功能;RewriteCond %{HTTP_HOST} ^www\.sohu\.com$
:匹配请求头中的域名是否为www.sohu.com
(正则中.
需转义为\.
);RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
:^(.*)$
:匹配所有 URL 路径(*
表示任意字符,()
捕获路径到$1
);http://www.sina.com/$1
:重定向目标,$1
替换为捕获的原路径;[R=permanent]
:返回 301 永久重定向状态码;[L]
:表示此规则为最后一条,匹配后不再执行后续规则。
验证
执行 cat /usr/local/apache2/htdocs/sohu/.htaccess
,确认内容与上述修正后一致。
步骤 4:检查配置并重启 Apache
操作
- 检查配置语法(避免错误):
/usr/local/apache2/bin/apachectl configtest
- 重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
configtest
用于提前检查 Apache 配置(包括 .htaccess
)的语法错误,重启服务使新的重写规则生效。
验证
- 若
configtest
输出Syntax OK
,说明配置无语法错误; - 执行
ps -ef | grep httpd
,确认 Apache 进程正常运行。
步骤 5:验证域名重定向(客户端测试)
操作
在客户端浏览器中访问:http://www.sohu.com
原理
客户端请求 www.sohu.com
时,Apache 会先匹配到 www.sohu.com
的虚拟主机,然后根据 .htaccess
中的规则,将请求永久重定向到 www.sina.com
。
验证
- 浏览器地址栏应自动跳转为
http://www.sina.com
,且页面显示www.sina.com
的内容(如之前配置的This is Sina Website
); - 查看浏览器 “网络请求”(按 F12 打开开发者工具,选 “Network”),请求
www.sohu.com
的响应状态码应为301 Moved Permanently
,且 “Location” 头为http://www.sina.com/
。
额外验证:命令行访问(非浏览器)
操作
在客户端执行(替换 服务器IP
为实际 Apache 服务器 IP):
curl -I -H "Host: www.sohu.com" http://服务器IP
原理
curl -I
仅显示响应头,-H "Host: www.sohu.com"
模拟浏览器的 Host
请求头,测试重定向逻辑。
验证
输出应包含:
HTTP/1.1 301 Moved Permanently
Location: http://www.sina.com/
说明重定向成功。
2.8 https
生存环境的证书需要到真实的专门网站购买,自己做实验自己创建即可
一、实验原理
- SSL/TLS 与 HTTPS:SSL(Secure Sockets Layer)/TLS(Transport Layer Security)是加密协议,HTTPS 是 “HTTP + SSL/TLS”,用于在客户端和服务器间建立加密通信通道,防止数据被窃听或篡改。
- 自签名证书:实验环境下,可通过 OpenSSL 生成 “自己签发给自己” 的证书(生产环境需从受信任的 CA 机构购买),用于模拟 HTTPS 通信。
mod_ssl
模块:Apache 依赖该模块支持 SSL/TLS 协议,需启用后才能配置 HTTPS。- URL 重写(
mod_rewrite
):通过规则将 HTTP 请求强制重定向到 HTTPS,确保所有通信加密。
二、步骤(以 Apache 2.4 为例,路径需根据实际安装调整)
步骤 1:生成自签名 SSL 证书(实验用)
操作
- 创建证书存储目录:
mkdir -p /usr/local/apache2/conf/cert cd /usr/local/apache2/conf/cert
- 生成 RSA 私钥(
server.key
)openssl genrsa -out server.key 2048
- 生成 证书签名请求(CSR)(
server.csr
):openssl req -new -key server.key -out server.csr
localhost
)。 - 生成 自签名证书(
server.crt
):openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
原理
genrsa
:生成 RSA 算法的私钥,用于加密通信;req -new
:基于私钥生成 CSR(包含服务器身份信息);x509 -req
:用私钥给 CSR 签名,生成自签名证书(有效期 365 天)。
验证
执行 ls /usr/local/apache2/conf/cert
,应看到 server.key
、server.csr
、server.crt
。
步骤 2:启用 mod_ssl
模块
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/conf/httpd.conf
- 找到并取消注释(删除行首
#
)以下配置,启用mod_ssl
:LoadModule ssl_module modules/mod_ssl.so Include conf/extra/httpd-ssl.conf
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
mod_ssl
是 Apache 处理 SSL/TLS 协议的核心模块,httpd-ssl.conf
是 SSL 相关的子配置文件。
验证
执行 httpd -M | grep ssl
,若输出 ssl_module (shared)
,说明模块已加载。
步骤 3:配置 SSL 虚拟主机(修改 httpd-ssl.conf
)
操作
- 打开 SSL 配置文件
httpd-ssl.conf
:vim /usr/local/apache2/conf/extra/httpd-ssl.conf
- 找到
<VirtualHost _default_:443>
块,修改为(确保与证书路径一致):<VirtualHost _default_:443>DocumentRoot "/usr/local/apache2/htdocs" # 网站根目录ServerName localhost:443 # 服务器域名+端口SSLEngine on # 启用 SSL 引擎SSLCertificateFile "/usr/local/apache2/conf/cert/server.crt" # 证书文件SSLCertificateKeyFile "/usr/local/apache2/conf/cert/server.key" # 私钥文件SSLCertificateChainFile "/usr/local/apache2/conf/cert/server.crt" # 证书链(自签名可与证书同文件)# 可选:配置加密套件、协议等,实验用默认即可 </VirtualHost>
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
SSLEngine on
:开启当前虚拟主机的 SSL 功能;SSLCertificateFile/KeyFile/ChainFile
:指定证书、私钥、证书链的路径,Apache 用这些文件建立加密连接。
验证
执行 cat /usr/local/apache2/conf/extra/httpd-ssl.conf
,确认配置与上述一致。
步骤 4:验证 HTTPS 访问
操作
在客户端浏览器中访问:https://服务器IP
(或 https://localhost
,若本地测试)。
原理
浏览器与服务器通过 SSL/TLS 握手,验证证书(自签名会提示 “不安全”,实验环境忽略即可),建立加密通道后传输 HTTP 数据。
验证
- 浏览器应能打开页面(显示
htdocs
下的index.html
内容); - 地址栏显示 “小锁” 图标(或提示 “不安全”,但能正常访问);
- 查看 “网络请求”(F12 开发者工具),协议应为
https
,响应状态码为200 OK
。
步骤 5:强制 HTTPS 访问(配置 URL 重写)
操作
- 确保
mod_rewrite
已启用(参考之前 “mod_rewrite
启用” 步骤)。 - 打开 Apache 主配置文件
httpd.conf
,确保网站根目录的<Directory>
块中AllowOverride All
(允许.htaccess
覆盖):<Directory "/usr/local/apache2/htdocs">Options Indexes FollowSymLinksAllowOverride All # 允许.htaccessRequire all granted </Directory>
- 进入网站根目录,创建
.htaccess
并编辑:cd /usr/local/apache2/htdocs vim .htaccess
RewriteEngine On # 条件:若请求端口不是 443(HTTPS 默认端口) RewriteCond %{SERVER_PORT} !^443$ # 规则:将所有 HTTP 请求永久重定向到 HTTPS RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R=permanent,L]
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
RewriteCond %{SERVER_PORT} !^443$
:匹配 “请求端口不是 443” 的 HTTP 请求;RewriteRule
:将这些请求 ** 永久重定向(301)** 到 HTTPS 协议,确保所有通信加密。
验证
- 在浏览器访问
http://服务器IP
,应自动跳转为https://服务器IP
; - 查看 “网络请求”,HTTP 请求的响应状态码应为
301 Moved Permanently
,且 “Location” 头为 HTTPS 地址。
2.9 日志切割&不记录指定类型文件
2.9.1 日志切割
步骤 1:设置日志路径与格式(基础配置)
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/etc/httpd.conf
- 添加 / 修改以下日志配置(确保
logs
目录存在,若不存在则创建:mkdir /usr/local/apache2/logs
):# 错误日志路径:记录服务器错误 ErrorLog "logs/error.log"# 访问日志路径与格式:combined 是预定义的详细格式(包含用户代理、referer 等) CustomLog "logs/access.log" combined# 定义 combined 格式(若配置文件中已有,可跳过) LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
- 保存并退出(
vim
中按Esc
,输入:wq
回车)。 - 重启 Apache 使配置生效:
/usr/local/apache2/bin/apachectl restart
原理
ErrorLog
:指定错误日志的存储路径;CustomLog
:指定访问日志路径,并通过combined
格式定义日志内容的详细程度;LogFormat
:定义日志格式的模板,combined
是 Apache 预定义的 “包含完整请求信息” 的格式。
验证
- 执行
ls /usr/local/apache2/logs
,应看到error.log
和access.log
(若有访问,文件会生成); - 访问 Apache 服务器(如浏览器输入
http://服务器IP
),然后执行cat /usr/local/apache2/logs/access.log
,应能看到包含访问 IP、时间、请求路径的日志记录。
步骤 2:配置日志自动分割(rotatelogs
工具)
操作
- 再次打开
httpd.conf
:vim /usr/local/apache2/etc/httpd.conf
- 修改日志配置为管道到
rotatelogs
(实现按天分割,保留 1 天的旧日志,时间格式为%Y%m%d
,即年 - 月 - 日):# 错误日志:每 86400 秒(1 天)生成一个新文件,命名为 error_20241001.log ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"# 访问日志:同样按天分割,命名为 access_20241001.log CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
|
(管道符):将日志输出 “交给”rotatelogs
工具处理;rotatelogs -l
:-l
表示使用本地时间(否则默认 UTC 时间,会与北京时间差 8 小时);/usr/local/apache2/logs/error_%Y%m%d.log
:日志文件命名格式,%Y%m%d
会被替换为当前年月日;86400
:日志分割的时间间隔(秒),86400 秒 = 1 天,即每天生成一个新日志。
验证
- 执行
ls /usr/local/apache2/bin | grep rotatelogs
,确认rotatelogs
工具存在; - 访问 Apache 服务器后,执行
ls /usr/local/apache2/logs
,应看到以当前日期命名的日志文件(如error_20251005.log
、access_20251005.log
)。
步骤 3:验证日志分割效果(时间模拟或等待)
操作(方法 1:时间模拟,适合快速验证)
- 修改
rotatelogs
的分割间隔为1 分钟(将86400
改为60
):ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d_%H%M.log 60" CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d_%H%M.log 60" combined
- 重启 Apache:
/usr/local/apache2/bin/apachectl restart
- 等待 1 分钟,然后多次访问 Apache 服务器。
操作(方法 2:等待 1 天,适合真实验证)
- 保持步骤 2 的配置(间隔 86400 秒),第二天查看
logs
目录,会生成新日期的日志文件。
原理
通过缩短分割间隔,可快速验证 rotatelogs
是否按预期生成新日志文件;真实环境则依赖自然时间流逝。
验证
- 方法 1:
logs
目录会生成多个以 “时分” 结尾的日志文件(如error_20251005_1530.log
、error_20251005_1531.log
),且内容对应不同时间的访问; - 方法 2:第二天会生成
error_20251006.log
、access_20251006.log
,与前一天的日志文件区分开。
步骤 4:HTTPS 环境下的日志配置(补充)
若 Apache 启用了 HTTPS(参考之前 SSL 配置步骤),需同时修改 httpd-ssl.conf
中的日志:
操作
- 打开
httpd-ssl.conf
:vim /usr/local/apache2/etc/extra/httpd-ssl.conf
- 修改 SSL 虚拟主机的日志配置为管道到
rotatelogs
:<VirtualHost _default_:443># ... 其他 SSL 配置 ...ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/ssl_error_%Y%m%d.log 86400"TransferLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/ssl_access_%Y%m%d.log 86400" </VirtualHost>
- 重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
HTTPS 的请求会被 httpd-ssl.conf
中的虚拟主机处理,因此需单独配置其错误日志(ErrorLog
)和传输日志(TransferLog
,对应 HTTP 的 CustomLog
)。
验证
访问 https://服务器IP
后,logs
目录会生成 ssl_error_日期.log
和 ssl_access_日期.log
2.9.2 不访问指定文件类型
2.10 静态缓存
步骤 1:启用缓存模块
操作
- 打开 Apache 主配置文件
httpd.conf
:vim /usr/local/apache2/conf/httpd.conf
- 找到并取消注释(删除行首
#
)以下模块(若未启用):mod_expires
:LoadModule expires_module modules/mod_expires.so
mod_headers
:(通常默认启用,若未启用则取消注释)LoadModule headers_module modules/mod_headers.so
- 保存并退出,重启 Apache 使模块生效:
/usr/local/apache2/bin/apachectl restart
原理
mod_expires
和 mod_headers
是 Apache 的 “缓存控制模块”,需手动启用才能使用缓存配置指令。
验证
执行 httpd -M | grep -E "expires|headers"
,若输出 expires_module (shared)
和 headers_module (shared)
,说明模块已加载。
步骤 2:用 mod_expires
配置缓存(方法 1)
操作
- 继续编辑
httpd.conf
,在<IfModule mod_expires.c>
块中添加缓存规则:<IfModule mod_expires.c>ExpiresActive On # 启用 expires 功能# 图片(jpg/gif/png)缓存 1 天ExpiresByType image/jpeg "access plus 1 days"ExpiresByType image/gif "access plus 1 days"ExpiresByType image/png "access plus 1 days"# CSS/JS 缓存 1 小时ExpiresByType text/css "access plus 1 hours"ExpiresByType application/javascript "access plus 1 hours"# HTML 不缓存(实时更新)ExpiresByType text/html "access plus 0 seconds" </IfModule>
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
ExpiresActive On
:开启mod_expires
功能;ExpiresByType MIME类型 "时间规则"
:对指定 MIME 类型的资源,设置 “相对于访问时间的缓存有效期”(如access plus 1 days
表示 “访问后缓存 1 天”)。
验证
- 在网站根目录(如
/usr/local/apache2/htdocs
)放入测试图片test.jpg
; - 用
curl
访问并查看响应头:curl -I http://服务器IP/test.jpg
- 响应头应包含
Expires
(如Expires: Fri, 28 Oct 2025 08:00:00 GMT
,表示缓存到指定时间)和Cache-Control
(如max-age=86400
,即 1 天的秒数)。
步骤 3:用 mod_headers
配置缓存(方法 2,更灵活)
操作
- 编辑
httpd.conf
,添加<FilesMatch>
或<Directory>
块配置Cache-Control
:# 对所有 .jpg/.png/.gif 图片,缓存 1 天(86400 秒) <FilesMatch "\.(jpg|png|gif)$">Header set Cache-Control "max-age=86400" </FilesMatch># 对所有 .css/.js 文件,缓存 1 小时(3600 秒) <FilesMatch "\.(css|js)$">Header set Cache-Control "max-age=3600" </FilesMatch># 对 HTML 文件,不缓存 <FilesMatch "\.html$">Header set Cache-Control "no-cache, no-store, must-revalidate" </FilesMatch>
- 保存并退出,重启 Apache:
/usr/local/apache2/bin/apachectl restart
原理
FilesMatch 正则
:匹配指定后缀的文件;Header set Cache-Control "规则"
:直接设置Cache-Control
响应头,max-age
指定缓存秒数,no-cache
表示不缓存。
验证
- 访问测试图片
test.jpg
,执行curl -I http://服务器IP/test.jpg
; - 响应头应包含
Cache-Control: max-age=86400
,无Expires
头(因为mod_headers
直接控制Cache-Control
,优先级更高)。
步骤 4:验证缓存效果(浏览器 + 命令行)
方法 1:浏览器开发者工具
- 打开浏览器(如 Chrome),访问
http://服务器IP/test.jpg
; - 按
F12
打开 “开发者工具”,切换到 “Network” 标签; - 刷新页面,查看
test.jpg
的请求:- 第一次请求:状态码
200 OK
,大小为 “实际大小”; - 第二次请求:状态码
304 Not Modified
(或 “来自缓存”),大小为 “from disk cache” 或 “from memory cache”,说明缓存生效。
- 第一次请求:状态码
方法 2:命令行 curl
- 第一次请求(获取资源,触发缓存):
curl -I http://服务器IP/test.jpg
Cache-Control: max-age=86400
(或Expires
时间)。 - 等待几秒后,再次请求:
curl -I -H "If-Modified-Since: 第一次请求的Last-Modified时间" http://服务器IP/test.jpg
Last-Modified
可从第一次响应头中获取) - 响应状态码应为
304 Not Modified
,说明服务器告诉浏览器 “资源未变,用缓存”。
2.11 禁止解析php
需要打开主配置目录