## 一 、HTTP协议与URL
* HTTP协议:超文本传输协议,用于从Web服务器传输超文本到本地浏览器的传输协议,属于应用层协议。 超文本语言,用来创建超文本文件的标签
* URL:统一资源定位符,是互联网上标准资源的地址,格式为http://www.kernel.com:80/image/a.jpg。 80:代表这个/usr/local/apache2/htdocs/路径
* URI:统一资源标志符,是比URL更广泛的资源标识方法,URL是URI的一个具体实例。
![[Pasted image 20240924200814.png]]
#### Apache Web服务器概述
- **Apache**:是全球使用最广泛的Web服务器软件,支持跨平台运行,具有高度的安全性和可扩展性。
- **市场占有率**:约60%,是Web服务器市场的领导者。
- **支持功能**:支持SSL技术,多虚拟主机,以及Perl/Python/php等脚本语言的集成。
## ==二、服务文件介绍==
### apache2/etc/httpd.conf标签介绍
* httpd软件的相关路径:
/usr/local/apache2/ #安装目录
/usr/local/apache2/etc/ #主配置文件目录**** /etc/httpd/conf/
/usr/local/apache2/etc/extra/ #子配置文件目录****
/usr/local/apache2/logs/ #日志目录 /var/log/httpd/
/usr/local/apache2/htdocs/ #网页目录**** /var/www/html/
/usr/local/apache2/error/ #报错网页页面(404,500)
/usr/local/apache2/modules/ #存放函数的目录
* httpd.conf 配置解释
* ServerRoot /usr/local/apache2 #apache主目录
* Listen 80 #监听端口{Listen 192.168.88.10:80}
* LoadModule php7 #加载的相关模块 像LoadModule php7_module modules/libphp7.so
* User Group #用户和组
* ServerName #服务器名 没有域名时用localhost:80
* ErrorLog "logs/error_log #服务器错误日志 代码404、500这类访问失败信息记录其中
* CustomLog "logs/access_log" common #访问记录日志 common是开启 代码100,200这类访问信息记录其中
* DirectoryIndex index.html index.php #默认网页首页文件 优先级顺序
* Include etc/extra/httpd-vhosts.conf #子配置文件中内容也会加载生效
* DocumentRoot "/usr/local/apache2/htdocs" #网页文件存放目录(默认)
* <Directory "/usr/local/apache2/htdocs"> #定义指定目录的权限
* Options Indexes FollowSymLinks
None #没有任何额外权限
All #所有权限(除去MultiViews以外)
Indexes #浏览权限(当此目录下没有默认网页文件时,显示目录内容)
FollowSymLinks #准许软链接到其他目录
MultiViews #准许文件名泛匹配(模糊匹配)(需要手动开启模块才有效模块negotiation)
AllowOverride None
#定义是否允许目录下**.htaccess****(像身份验证和域名转换使用)**文件中的权限生效
None #.htaccess中权限不生效
All #文件中所有权限都生效
AuthConfig #文件中,只有网页认证的权限生效
Require all granted(denied) #访问控制列表
</Directory>
DirectoryIndex #声明网页目录的首页文件
* 标签
``` shell
<IfModule dir_module>
#在这里添加首页文件 比如想index.php
DirectoryIndex index.html
</IfModule>
```
保存warn之后级别的错误
![[Pasted image 20240924200601.png]]
使用案例
Indexes #开启该选项,允许没有首页时显示文件列表,关闭则不允许
``` shell
cd /usr/local/apache2/htdocs/
mv index.html /root/ #会显示文件目录
vim /usr/local/apache2/etc/httpd.conf
#删除选项 会发现没有权限访问
Options FollowSymLinks
#重新启动服务
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
#把文件复制回来
cd /usr/local/apache2/htdocs/
mv /root/index.html ./
```
FollowSymLinks #该选项用来识别软链接
``` shell
mkdir /abc
echo "testinn......" >> /abc/index.html
ln -s /abc/ /usr/local/apache2/htdocs/
#创建软链接
vim /usr/local/apache2/etc/httpd.conf
#删除选项 会发现输入http://192.168.90.101/abc/没有权限访问
Options Indexes
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
* 标签
``` shell
<Directory />
#设置目录有没有权限
AllowOverride none
Require all denied
</Directory>
<IfModule log_config_module>
#保存日志的格式像access.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
</IfModule>
```
## ==三、Apache的工作模式==
- **Prefork多进程的单线程模式**:每个子进程只有一个线程,有资源隔离性和安全性高等优点,但资源利用率低
![[Pasted image 20240924200833.png]]
- **Worker多进程的多线程模式(常用)**:采用多进程和多线程混合模式,适合高并发(并发是指用户同时访问服务器的用户量)场景,在多进程中通过管理线程预先创建空闲线程来提高响应速度和效率,但需关注线程安全问题,适用于处理动态资源,但在处理静态资源方面相对较弱。
![[Pasted image 20240924200847.png]]
- **Event**:优化了Worker模式,特别适合处理大量Keep-Alive连接,提高高并发下的性能。
- 长连接:Keep-Alive是什么?:在互联网访问中,频繁地建立和断开TCP连接会浪费时间和资源。为了提高效率,服务器采用了长连接机制,即“Keep-Alive”。通过“Keep-Alive”,Apache服务器可以在一定时间内维持客户端与服务器之间的连接,减少了TCP握手的开销, 但在高并发环境下,导致服务器无法为新进来的请求快速创建新的线程进行处理
- 查看工作模式方法: /usr/local/apache2/bin/httpd -V | grep -i "server mpm"
## 四、知识扩展
* Apache需要自身的rotatelog(/usr/local/apache2/bin/rotatelogs)命令来实现日志文件的自动轮替与管理优化日志管理,减少不必要的日志记录以减小日志体积
* Apache服务器配置中的别名模块,用于解决网页目录资源共享的问题。
``` shell
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
```
* MIME模块用于帮助Apache识别不同类型的文件后缀
``` shell
例子
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
```
*
``` shell
vim /usr/local/apache2/etc/httpd.conf
#把这个注释取消掉 这个文件有目录浏览功能
Include etc/extra/httpd-autoindex.conf
cd /usr/local/apache2/etc/extra/
vim httpd-autoindex.conf
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
httpd-autoindex.conf 包含这些 访问IP/icons/链接
![[Pasted image 20240924195807.png]]
* 应对高并发负载需求? 根据实际需求进行性能扩展,增加单机硬件配置还是增加服务器节点
* HTML不具备传统编程语言必备的语言特性,如变量、函数、流程控制及逻辑判断等
* l inux中的日志涉及轮替和切割两种基本策略,轮替是在日志过大之前就确定,切割是日志已经过大才使用
* /usr/local/mysql/bin/mysql -uroot -p123456
* #创建用户,指定用户的登录方式 create user typecho@'localhost' identified by '123456';
* #创建数据库 create database typecho;
* #授予某用户对指定数据库的权限 grant all on typecho.* to typecho@'localhost';
* 在用户登录mysql时修改密码 set password=password('123456')
管理源码包安装apache服务规则文件
``` shell
#apache服务管理识别文件 请先/usr/local/apache2/bin/apachectl stop
在cp -a /root/httpd.service /usr/lib/systemd/system/
[Unit]
Description=apache
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecStop=/usr/local/apache2/bin/apachectl stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
```
* 请求状态码及其含义
* 500服务器内部错误 一个普通的错误信息,
* 502错误的网关 服务器作为一个网关或者代理,从上游的服务器中接收到无效的响应
* 503 服务不可用 504 网关超时
* 444 无响应 被使用在Nginx的日志中表明服务器没有返回信息给客户端并且关闭了连接
* 400 错误请求 401 未授权 **403** 禁止访问 **404** 找不到 **408** 请求超时
* 305使用代理 306 切换代理 不再使用。原意是随后的请求应该使用指定的代理
* ==301状态码表示客户端访问时,服务器进行了重定向,从旧域名跳转到新域名。这种重定向是永久性== 302 临时重定向
* 为什么在生产环境中要使用301重定向而非302?在生产环境中,通常要求客户端被永久重定向,因此使用301状态码。301状态码能够确保在缓存和历史记录中使用新域名,减少跳转次数,提高用户体验和效率。
* 200 成功 201 已创建
* 在生产环境中,虚拟主机的应用场景有哪些?在生产环境中,虚拟主机是非常重要的技术手段。例如,在将两个不同网站隔离时,可能需要使用虚拟主机来确保各站点的安全独立性。此外,在网站加密连接时,也会利用虚拟主机的概念,通过设置80端口和443端口的两个虚拟主机来分别承载非加密和加密流量,实现安全传输。或来当一些公司的门户网站
## ==五、apache实验==
### 1) Apache的目录别名
场景:通过别名功能实现第三方软件的网页共享,避免与Apache默认目录的冲突。可以为了第三方软件在不去破坏原有网页项目的情况下,能够被共享的一种方式(用比较少)
1、编辑主配置文件
``` shell
vim /usr/local/apache2/etc/httpd.conf
Include etc/extra/httpd-autoindex.conf #去掉注释,开启调用子配置文件,这个文件有目录浏览功能
LoadModule negotiation_module modules/mod_negotiation.so #去掉注释开启模糊匹配
```
2、编辑子配置文件
``` shell
mkdir -p /aa/bb/cc/w3/
echo "sssSs" >> /aa/bb/cc/w3/index.html
vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
# 结构:别名 "真实目录" 真实目录的结尾要有/,否则报
Alias /w3/ "/aa/bb/cc/w3/"
<Directory "/aa/bb/cc/w3/">
Options Indexes MultiViews#模糊匹配
AllowOverride None
Require all granted
</Directory>
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
可以根据模板编写一个自己需要的目录别名
### 2) Apache的用户认证
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身份认证。
1、编辑配置文件
``` shell
#安装项目
mkdir /usr/local/apache2/htdocs/typecho
unzip /root/typecho.zip
cp -a /root/build/* /usr/local/apache2/htdocs/typecho/
cd /usr/local/apache2/htdocs/
useradd -s /sbin/nologin -r www
chown -R www.www *
#在添加数据库用户 用命令或者别的 并要改变apache主配置文件默认网页文件优先级
#修改配置文件
vim /usr/local/apache2/etc/httpd.conf
我要对htdocs/typecho/admin目录加密可以进行对Directory标签进行修改AllowOverride 的none改成 ALL
<Directory "/usr/local/apache2/htdocs/"> #声明被保护目录
Options Indexes FollowSymLinks
AllowOverride ALL #开启权限认证文件.htaccess
Require all granted
</Directory>
```
2、在指定目录下创建权限文件
切换到/usr/local/apache2/htdocs/typecho/admin,创建 .htaccess文件,并添加下面的内容
``` shell
vim .htaccess
#提示信息
AuthName "Welcome to kernel"
#加密类型
AuthType basic
#密码文件,文件名自定义。(使用绝对路径)
AuthUserFile /usr/local/apache2/htdocs/typecho/admin/apache.passwd
#允许密码文件中所有用户访问
require valid-user
```
**3****、建立密码文件,加入允许访问的用户。(此用户和系统用户无关)**
``` shell
/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/typecho/admin/apache.passwd test1
-c 建立密码文件,只有添加第一个用户时,才能-c
/usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/typecho/admin/apache.passwd test2
-m 再添加更多用户时,使用-m 参数
```
==注意: htpasswd 该命令是httpd的命令,需要绝对路径==
4、重启apache服务
``` shell
/usr/local/apache2/bin/apachectl -t 用于检测Apache配置文件的语法正确性
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
pidof httpd | wc -l 用显示当前正在运行的 `httpd` 进程的进程ID并用wc统计行数
```
## 3) ==虚拟主机==
* 虚拟机:
通过宿主机进行硬件虚拟化,使用构建的虚拟硬件进行操作系统安装和环境运行的机器。
* vmware workstation 寄居式架构 #PC级虚拟化软件 像vmware需要以Windows为底层的虚拟化软件
* vmware esxi 裸金属架构 #企业级虚拟化软件 用ESXi部署虚拟机来运行关键服务,如网络盘,以及通过跳板机提高安全管理的效率。
* 虚拟主机 - web服务器上的一种功能
* 功能:让一个web平台可以同时运行多个网站,==并且网站之间相互隔离==
* 方法:
1. 基于IP地址的虚拟主机 基于IP的方法受限于公共IP地址的稀缺
2. 基于端口的的虚拟主机 基于端口的方法虽技术上可行但使用不便
3. 基于域名的虚拟主机(常用)
**实验目的:** ==实现这多个网站看起来就是个独立网站,实则是同一台服务器上同一个LAMP平台==
**1.** **域名解析:准备两个域名**
在windows添加
C:\Windows\System32\drivers\etc 的hotos文件添加
192.168.90.101 www.typecho.com
192.168.90.101 www.bbs.com
#使用本地hosts文件进行解析
**2.** **网站主页目录规划**
在/htdocs/目录下分别创建typecho和 bbs两个目录,并在新建目录内创建index.html文件(分别写不一样的内容)
``` shell
mkdir /usr/local/apache2/htdocs/typecho
mkdir /usr/local/apache2/htdocs/bbs
unzip /root/typecho.zip
cp -a /root/build/* /usr/local/apache2/htdocs/typecho/
cp -a /root/upload/* /usr/local/apache2/htdocs/bbs/
cd /usr/local/apache2/htdocs/
useradd -s /sbin/nologin -r www
chown -R www.www *
vim /usr/local/apache2/etc/httpd.conf
<IfModule dir_module>
DirectoryIndex index.php index.html #改变apache主配置文件默认网页文件优先级
</IfModule>
User www
Group www
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
* 实验步骤:
**1.** **修改主配置文件开启文件关联**
``` shell
vim /usr/local/apache2/etc/httpd.conf
Include etc/extra/httpd-vhosts.conf #此行取消注释
```
``` shell
#添加临时IP的方法
cd /etc/sysconfig/network-scripts/
cp -a ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
```
**2.** **编辑子配置文件,编写虚拟主机标签**
``` shell
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
#添加下方内容,有几个虚拟主机就写几组
#IP地址的虚拟主机配置IP要变,可通过添加临时IP地址进行实验
<VirtualHost 192.168.90.120:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2/htdocs/typecho/"
ServerName www.typecho.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
#端口的虚拟主机配置端口要变,记得vim /usr/local/apache2/etc/httpd.conf添加Listen 81
<VirtualHost 192.168.90.100:81>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2/htdocs/typecho/"
ServerName www.typecho.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
#端口的的虚拟主机配置IP和端口不变,弄好域名
<VirtualHost 192.168.90.100:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2/htdocs/typecho/"
ServerName www.typecho.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
#每一行代表含义#虚拟主机标签 #管理员邮箱 #网站主目录 #完整域名 #错误日志 #访问日志
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
**3.** **重启服务,验证结果:要让客户端自己解析**
Windows 下:浏览器下输入两个不同的域名验证网页内容(提前修改windows的hosts文件)
在windows添加
C:\Windows\System32\drivers\etc 的hotos文件添加
192.168.90.101 www.typecho.com
192.168.90.101 www.bbs.com
Linux下:通过elinks/curl命令验证:elinks/curl URL地址(提前修改Linux的hosts文件)
``` shell
vim /etc/hosts
192.168.90.101 www.typecho.com
192.168.90.101 www.bbs.com
reboot
curl www.typecho.com
curl www.bbs.com
```
==注意事项:如果一个项目在你当前规划好了的环境上已经安装了。比如说我是做基于域名的虚拟主机,我把这个项目正常的创建数据过程中装完了,注意不要再拿装完了的这个环境再去测基于IP的,基于端口的。因为它的数据库里面记录的是域名==
### 4) ==域名跳转==(重难点)
原理:一个客户端通过域名访问时,然后服务器匹配条件里边发现是就已经符合条件了。然后利用规则把URL地址重写,让这个用户重新用新的URL地址再重新访问的重写机制。注意,是重新让客户端重新访问的一种机制,叫做重写(重定向)。
**实验条件:**
1. 虚拟主机能正常访问 (在虚拟主机已经搭建完的基础上)
**2.** **打开主配置文件开启重写模块**
``` shell
vim /usr/local/apache2/etc/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so #取消注释开启重写模块
```
**实验步骤:**
**1.** **修改虚拟主机配置文件**
``` shell
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
<VirtualHost 192.168.90.101:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2/htdocs/typecho/"
#指定服务器的主域名
ServerName www.blog.com
# 指定服务器的别名,可以通过这些别名访问该虚拟主机
ServerAlias www.typecho.com
# 指定错误日志文件的路径
ErrorLog "logs/dummy-host.example.com-error_log"
# 指定访问日志文件的路径,并指定日志格式为common
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/typecho">
Options Indexes FollowSymLinks
# 允许.htaccess文件覆盖配置,要开启rewrite模块主配置文件也要
AllowOverride All
# 允许所有客户端访问该目录
Require all granted
</Directory>
```
**2.** **创建规则匹配文件**
``` shell
cd /usr/local/apache2/htdocs/typecho/
vim .htaccess
#旧域名跳转新域名:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.typecho.com [NC]
RewriteRule ^(.*)$ http://www.blog.com/$1 [L,R=301]
#旧域名跳转新域名:
#开启rewrite功能
RewriteEngine on
#只有当请求的客户端请求的域名是 www.typecho.com 时,后续的重写规则才会生效。
#[NC] 标志表示匹配时不区分大小写。
RewriteCond %{HTTP_HOST} ^www.typecho.com [NC]
# ^(.*)$ 指代客户端要访问的资源是任意的
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 在多条重定向规则中,如果规则前有L,当前规则执行成功则后续的规则将不再执行,只要规则没执行成功,才执行后续的规则。
RewriteRule ^(.*)$ http://www.blog.com/$1 [L,R=301]
```
**3.** **重启服务器并测试**
``` shell
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```
### 5) Apache+openssl实现https(重难点)
HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,用于安全的HTTP数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。
流程:首先检查Apache是否支持SSL模块,然后创建证书和密钥文件,并将其放置在Apache能够调用的适当位置。在Apache的配置文件中引入SSL相关设置,并确保引用正确的证书和密钥路径以及写入相关的配置文件。最后重启Apache服务以使配置生效。
**1.** **准备工作:**
检查Apache是否支持SSL,检查相应模块是否安装,若安装则将模块启用,并且是在前面两个实验完成的基础上实验
**模块存放目录:**/usr/local/apache2/modules
**检查模块是否启用**:/usr/local/apache2/bin/apachectl -M | grep ssl
``` shell
vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注释
Include etc/extra/httpd-ssl.conf #取消注释
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so #取消注释ssl配置文件需要开启的模块
#打开全局dns把dns删除在重启服务
vim /etc/resolv.conf
```
![[Pasted image 20240926195700.png]]
2. CA证书申请
``` shell
#因为配置文件默认写来这个路径并且要求生成的名字是server后缀的密钥
cd /usr/local/apache2/etc
#建立服务器私钥,生成RSA私钥
openssl genrsa -out server.key 1024
#生成的csr文件交给CA签名后形成服务端自己的证书
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt
#使用CA服务器签发证书,设置证书的有效期等信息
注意1:生成完秘钥和证书文件后,将文件存放在Apache的安装目录下的cert目录下
注意2:在生产环境中必须要在https证书厂商注册(否则浏览器不识别
```
ssl配置文件
* 默认生成密钥的目录
![[Pasted image 20240926211940.png]]
* 要修改的配置路径
![[Pasted image 20240926212028.png]]
**3.** 配置文件修改
* 修改httpd-ssl.conf配置文件,调用证书等文件
``` shell
vim /usr/local/apache2/etc/extra/httpd-ssl.conf
在<VirtualHost _default_:443>下修改这两行
DocumentRoot "/usr/local/apache2/htdocs/typecho"
ServerName www.blog.com:443
```
4 创建规则匹配文件设置强制跳转https
* 在httpd-vhosts.conf写入的配置文件
* 技巧:跳转规则可以写入httpd-vhosts.conf这个文件,比如htaccess文件可以写入
``` shell
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
<VirtualHost 192.168.90.101:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2/htdocs/typecho/"
ServerName www.blog.com
ServerAlias www.typecho.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/typecho">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
#旧域名跳转新域名 + 80跳转443
#开启转发规则
RewriteEngine on
#逻辑旧域名访问:无论使用HTTP (80) 还是HTTPS (443),都会被重定向到新的加密域名(HTTPS 443)这个规则必须在前面
RewriteCond %{HTTP_HOST} ^www.typecho.com [NC]
RewriteRule ^(.*)$ https://www.blog.com/$1 [L,R=301]
#逻辑访问端口只要目标不是443时跳转到HTTPS (443),已使用HTTPS (443) 则不跳转。这个规则必须在后面
RewriteCond %{SERVER_PORT} !^443$ [NC]
#全都使用https重新访问
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
</Directory>
5 结果测试
``` shell
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
http://www.typecho.com/
https://www.typecho.com/
http://www.blog.com/
#是否都跳转到https://www.blog.com/
```
### 6) Apache日志轮替
我们每访问一次网站,那么就会记录若干条日志。如果日志不去管理,时间长了日志文件会越来越大,如何避免产生大的日志文件?其实apache有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。
``` shell
vim /usr/local/apache2/etc/httpd.conf
#设置apache日志分割
#同样编辑配置文件vim /usr/local/apache2/etc/httpd.conf
#Y年m月d日
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access-%Y%m%d.log 86400" common
#刷新后查看日志文件
ls /usr/local/apache2/logs
#看是否有 access-20240926.log
可编辑添加内容如下:
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
指定了日志存放在/usr/local/apache2/logs目录下分别为error.log和access.log,combined为日志显示的格式,日志格式可以参考配置文件httpd.conf中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
```
ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义。
### 7) 不记录指定文件类型的日志
如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
1、配置日志不记录图片的访问
``` shell
vim /usr/local/apache2/etc/httpd.conf
SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access-%Y%m%d.log 86400" common env=!image-request
#测试用看日志变化
tail -f access-20240926.log
```
说明:在原来的访问日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全标记为image-request,然后在配置日志后加一个标记env=!image-request,表示取反。
### 8) Apache配置静态缓存
所说的静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
1、配置静态缓存
/usr/local/apache2/etc/httpd.conf
``` shell
LoadModule expires_module modules/mod_expires.so #去掉注释开启这个模块
<IfModule mod_expires.c> #此模块默认未启用,请手动启用
ExpiresActive on
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hours"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
```
**2****、重启服务器并验证**
``` shell
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
验证:
在另一个虚拟机用 curl -I 'http://192.168.90.101/linux.gif'
```
![[Pasted image 20240926211701.png]]
### 9) 禁止解析PHP
场景:我们做网站安全的时候,这个用的很多,例如平台网站存在头像上传文件类型漏洞,采用临时解决方案禁止解析特定目录下的非图片文件,后续需在后台代码中加入对上传文件类型的过滤。
**配置禁止解析php**
``` shell
<Directory /usr/local/apache2/htdocs/data>
php_admin_flag engine off
<filesmatch "(.*)\.php$">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
```
### 10)apache状态统计模块的配置:
``` shell
vim /usr/local/apache2/etc/httpd.conf
LoadModule status_module modules/mod_status.so #开启这个模块
<Location "/server-status">
SetHandler server-status
Require all granted #就这儿要改要给全部权限
</Location>
#客户端访问网址:http://IP/server_status 用?auto可查看详细数值