当前位置: 首页 > article >正文

九APACHE

## 一 、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可查看详细数值


http://www.kler.cn/news/340430.html

相关文章:

  • 基于vue框架的大学生在线教育jp6jw(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • C++、Ruby和JavaScript
  • No.7 笔记 | 数据库基础(含端口号)
  • 小程序知识付费的优势 知识付费服务 知识付费平台 知识付费方法
  • QT实现QMessageBox中文按钮
  • C语言基础题(力扣):最低加油次数
  • Navicat for MySQL 常见问题
  • 【重学 MySQL】四十八、DCL 中的 commit 和 rollback
  • 【Linux报错】“-bash: cd: too many arguments“
  • Python | Leetcode Python题解之第457题环形数组是否存在循环
  • C++竞赛初阶—— 石头剪子布
  • Ubuntu 上安装 MySQL 并且实现远程登录
  • 李沐 X动手学深度学习 数据操作+数据预处理 学习笔记(无代码,纯理论部分)
  • 测试-BUG篇
  • 宏队列和微队列
  • YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测
  • 计算机网络:数据链路层 —— 数据链路层概述
  • java脚手架系列1--模块化、多环境
  • 百度文心智能体平台开发萌猫科研加油喵
  • FFMpeg源码分析,关键结构体分析(一)