菜单
本页目录

8 Apache

一 前提

html语言:超文本传输协议(将多种文件关联)

http:超文本传输协议(应用层)

url:统一资源定位符

    http://www/kernel.com:80/image/a.jpg
	协议	网络地址	端口	路径及资源名称

uri:统一资源标志符(比url更广)

二 apache

1 概述

垂直扩展:硬件方面提升(内存)

水平扩展:增加服务器

tomcat、httpd、等是apache下的其中项目(tomcat与java相关)

2 工作模式

三种:prefork、worker、event

(mpm:多线程处理模块)

1)prefork

(多进程、单线程)

启动之初,预先fork一些子进程;每个子进程中只有一个线程

稳定、但利用率差

2)worker

(多进程、多线程)(常用)

预先fork几个子进程(数量比较少);每个子进程由一些线程,单个线程内存占用少了些

利用率高、但不稳定,需考虑线程安全问题

keepalive(可极大减少重复握手次数):保持存货,设置一个连接中断倒计时

3)event

(一般不用)若资源占用过多,则会释放一些keepalive

查看当前apache工作模式

[root@localhost ~]# httpd -V |grep -i "server mpm"
Server MPM:     worker

默认apache工作模式:

        源码包安装的:worker
		rpm包安装的:prefork

3 相关文件

##### 配置文件
	源码安装的:
		PREFIX/etc/httpd.conf(主配置文件)
        PREFIX/etc/etxra/*.conf	(子配置文件)
    rpm安装的:
    	/etc/httpd/conf/httpd.conf(主配置文件)
        /usr/share/doc/httpd-* 复制到 /etc/httpd/conf.d/	(子配置文件)

##### 网页文件位置
    源码安装的:PREFIX/htdocs/
    rpm安装的:/var/www/html/

##### 日志文件
    源码安装的:PREFIX/logs/
    rpm安装的:/vat/log/httod/

4 配置文件详解

注意:apache配置文件严格区分大小写

针对主机环境的基本配置参数

	ServerRoot		/usr/local/apache2 	#apache主目录
	Listen			:80					#监听端口{Listen 192.168.88.10:80}
	LoadModule		php7				#加载的相关模块
	User
	Group						#用户和组
	ServerAdmin					#管理员邮箱
	ServerName					#服务器名(没有域名解析时,使用临时解析。默认不开启)
	ErrorLog "logs/error_log					#服务器错误日志
	CustomLog "logs/access_log" common			#访问记录日志
	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 >

  <IfModule dir_module>      									#此标签用来指定访问到指定目录时自动加载哪个页面文件
     			 DirectoryIndex index.php index.html   		#可以写多个,但是有优先级之分
  < /IfModule > 


实验:客户端通过域名访问主页,客户端修改hosts文件

Windows的hosts文件在:
		C:\Windows\System32\drivers\etc\hosts
		
Linux的hosts文件在:
		/etc/hosts

实验:给网页添加ico图标

*.ico		#图标类文件

将 favicon.ico 放入 /usr/local/apache2/htdocs/ 目录下,重启apache

![image-20221029095558144](08 Apache.assets\image-20221029095558144.png)

网页日志常见数字提示:

    200			#首次访问,在日志中后接文件大小
    304			#缓存访问
    404			#错误

5 实验

1)目录别名

功能:将某些不在默认网页目录下的文件进行共享

注意:alias给目录设置时,配置文件/usr/local/apache2/etc/extra/httpd-autoindex.conf 中最后需要加 /

拓展:看软链接目录时,若在最后加上 / 则显示的是软链接源文件属性,而不是软链接属性

1、编辑主配置文件

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
  Include etc/extra/httpd-autoindex.conf                   #去掉注释,开启调用子配置文件

2、编辑子配置文件

[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
  alias /icons/ "/usr/local/apache2/icons/"			#结构:别名 "真实目录"   #真实目录的结尾要有/,否则报错
  <Directory "/usr/local/apache2/icons">
         Options Indexes FollowSymLinks
         AllowOverride None
         Require all granted
  </Directory>
#可以根据模板编写一个自己需要的目录别名

2)apache用户认证

功能:保护目录

拓展:mysql命令(前提:已经给源码包安装的mysql创建软链接到PATH中)

[root@localhost htdocs]# mysql -uroot -p123			#进入数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)

mysql> create database blog;					#创建bbs库
Query OK, 1 row affected (0.00 sec)

mysql> grant all on blog.* to blog@'localhost' identified by '123456';		#创建bbs库的用户密码,并授权
Query OK, 0 rows affected (0.01 sec)

1、编辑配置文件

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf

在需要进行登录认证的目录标签中加入如下配置:

<Directory "/usr/local/apache2/htdocs/build/admin"> 		#声明被保护目录
         Options Indexes FollowSymLinks
         AllowOverride All                     				#开启权限认证文件.htaccess
         Require all granted
</Directory>

2、在指定目录下创建权限文件

切换到/usr/local/apache2/htdocs/build/admin,创建 .htaccess文件,并添加内容

[root@localhost ~]# cd /usr/local/apache2/htdocs/build/admin/
[root@localhost admin]# vim .htaccess
[root@localhost admin]# cat .htaccess
AuthName "Welcome to YQ's blog"
#提示信息
AuthType basic
#加密类型
AuthUserFile /usr/local/apache2/htdocs/build/admin/apache.passwd
#密码文件,文件名自定义。(使用绝对路径)
require valid-user
#允许密码文件中所有用户访问

3、建立密码文件,加入允许访问的用户。(此用户和系统用户无关)

-c 建立密码文件,只有添加第一个用户时,才能-c

-m 再添加更多用户时,使用-m 参数

注意: htpasswd 该命令是httpd的命令,(若未创建软链接,需要绝对路径)

[root@localhost admin]# htpasswd -c /usr/local/apache2/htdocs/build/admin/apache.passwd yq1
New password: 
Re-type new password: 
Adding password for user yq1
[root@localhost admin]# htpasswd -m /usr/local/apache2/htdocs/build/admin/apache.passwd yq2
New password: 
Re-type new password: 
Adding password for user yq2

4、重启apache服务

[root@localhost admin]# apachectl stop
[root@localhost admin]# apachectl start

先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。

![image-20221029105118858](08 Apache.assets\image-20221029105118858.png)

3)虚拟主机

介绍

(可实现web平台共享多个网页资源,与vsftpd联系,从而分给不同用户)

虚拟机:将物理设备虚拟化,多系统同时运行

虚拟主机:
		web网站平台的技术,同时运行、共享多个网站网页资源
        对外表现为:独立运行两个网站

注意:当开启虚拟主机模式时,则主配置文件的网站就会失效,无法访问(除非单独设置)
			以虚拟主机配置文件作为最高优先级客户端
			此时访问顺序为:虚拟主机配置文件中网页标签顺序

实现虚拟主机的方法:
            1、多个IP		IP不同
            2、多个端口	端口不同,需在主配置文件中加:	Listen	端口
            3、多个域名(常用)
实验:开启虚拟主机模式
1. 在http.conf中	调用	etc/extra/httpd-vhosts.conf

2. 在httpd-vhosts.conf中修改(备份后修改)
	一个网站配一个目录权限
1 多个IP 需要添加ens33:0 实现多个ip
[root@localhost ~]# cp -a  /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
[root@localhost ~]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sina">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<Directory "/usr/local/apache2/htdocs/sohu">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<VirtualHost 192.168.88.201:80>
	ServerAdmin webmaster@sohu.com
	DocumentRoot "/usr/local/apache2/htdocs/sohu"
	ServerName www.sohu.com
	ErrorLog "logs/sohu-error_log"
	CustomLog "logs/sohu-access_log" common
</VirtualHost>

<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@sina.com
	DocumentRoot "/usr/local/apache2/htdocs/sina"
	ServerName www.sina.com
	ErrorLog "logs/sina-error_log"
	CustomLog "logs/sina-access_log" common
</VirtualHost>
[root@localhost ~]# apachectl restart

测试:在测试机hosts文件中

​ 192.168.18.201 www.sina.com

​ 192.168.88.201 www.sohu.com

浏览器访问:

![image-20221029183551014](08 Apache.assets\image-20221029183551014.png)

![image-20221029183600421](08 Apache.assets\image-20221029183600421.png)

2 同一个IP,不同端口访问
[root@localhost ~]# rm -rf /etc/sysconfig/network-scripts/ifcfg-ens33:0		
[root@localhost ~]# systemctl restart network

[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
[root@localhost ~]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf

<Directory "/usr/local/apache2/htdocs/sina">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<Directory "/usr/local/apache2/htdocs/sohu">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<VirtualHost 192.168.18.201:90>						#对比多IP方式,只改了此处
	ServerAdmin webmaster@sohu.com
	DocumentRoot "/usr/local/apache2/htdocs/sohu"
	ServerName www.sohu.com
	ErrorLog "logs/sohu-error_log"
	CustomLog "logs/sohu-access_log" common
</VirtualHost>

<VirtualHost 192.168.18.201:80>							
	ServerAdmin webmaster@sina.com
	DocumentRoot "/usr/local/apache2/htdocs/sina"
	ServerName www.sina.com
	ErrorLog "logs/sina-error_log"
	CustomLog "logs/sina-access_log" common
</VirtualHost>
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# grep -i "^listen" /usr/local/apache2/etc/httpd.conf
Listen 80
Listen 90
[root@localhost ~]# apachectl restart						#重启apache、并检查端口是否监听
[root@localhost ~]# netstat -anpt |egrep ":80|:90"
tcp6       0      0 :::80                   :::*                    LISTEN      7279/httpd          
tcp6       0      0 :::90                   :::*                    LISTEN      7279/httpd          
[root@localhost ~]# 

测试:

浏览器通过 192.168.18.201:80 访问

​ 192.168.18.201:90 访问

![image-20221029184338515](08 Apache.assets\image-20221029184338515.png)

![image-20221029184345379](08 Apache.assets\image-20221029184345379.png)

3 多个域名访问
[root@localhost ~]# rz -E						#建立blog和论坛项目
rz waiting to receive.
[root@localhost ~]# rz -E
rz waiting to receive.
[root@localhost ~]# ls
1.1-17.10.30-release.tar.gz  anaconda-ks.cfg  Discuz_X3.3_SC_UTF8.zip  ifcfg-ens33
[root@localhost ~]# tar -xf 1.1-17.10.30-release.tar.gz 
[root@localhost ~]# unzip Discuz_X3.3_SC_UTF8.zip 
[root@localhost ~]# cp -a ./build /usr/local/apache2/htdocs/blog
[root@localhost ~]# cp -a ./upload /usr/local/apache2/htdocs/bbs
[root@localhost ~]# cd /usr/local/apache2/htdocs/
[root@localhost htdocs]# ls
bbs  blog  index.html  phpmyadmin  test.php
[root@localhost htdocs]# chown -R www.www ./*
[root@localhost htdocs]# ll
总用量 20
drwxr-xr-x 12 www www 4096 4月   1 2017 bbs
drwxr-xr-x  6 www www  111 10月 30 2017 blog
-rw-r--r--  1 www www   45 6月  12 2007 index.html
drwxr-xr-x 10 www www 4096 10月 27 20:50 phpmyadmin
-rw-r--r--  1 www www   21 10月 26 17:57 test.php
[root@localhost htdocs]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf		#修改配置文件
[root@localhost htdocs]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf		#一个网站配一个目录权限、分别指向bbs、blog、phpmyadmin

<Directory "/usr/local/apache2/htdocs/blog">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<Directory "/usr/local/apache2/htdocs/bbs">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<Directory "/usr/local/apache2/htdocs/phpmyadmin">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@blog.com
	DocumentRoot "/usr/local/apache2/htdocs/blog"
	ServerName www.blog.com
	ErrorLog "logs/blog-error_log"
	CustomLog "logs/blog-access_log" common
</VirtualHost>

<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@bbs.com
	DocumentRoot "/usr/local/apache2/htdocs/bbs"
	ServerName www.bbs.com
	ErrorLog "logs/bbs-error_log"
	CustomLog "logs/bbs-access_log" common
</VirtualHost>
<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@phpmyadmin.com
	DocumentRoot "/usr/local/apache2/htdocs/phpmyadmin"
	ServerName www.phpmyadmin.com
	ErrorLog "logs/phpmyadmin-error_log"
	CustomLog "logs/phpmyadmin-access_log" common
</VirtualHost>
[root@localhost htdocs]# vim /usr/local/apache2/etc/httpd.conf					#关闭多个端口的监听
[root@localhost htdocs]# grep -i "^listen" /usr/local/apache2/etc/httpd.conf
Listen 80
[root@localhost htdocs]# apachectl restart 

测试:

​ 测试机的hosts文件中改为:

192.168.18.201	www.blog.com
192.168.18.201	www.bbs.com
192.168.18.201	www.phpmyadmin.com

浏览器分别访问域名:

image-20221029190423782

image-20221029190433036

image-20221029190444625

4)域名跳转

==为了更换域名。==

方法一:
在 httpd-vhosts.conf 文件中:
        1、在原有的 virtual 标签中写入跳转规则
        2、新增virtual标签(仅修改ServerName 为新域名)
        3、主配置文件中开启 rewrite.so 模块、开启调用 httpd-vhosts.conf 子配置文件

注意:也可以直接在原有virtual标签中,新增一行 ServerAlias 新域名(不用写新增virtual标签)

例如:

<Directory "/usr/local/apache2/htdocs/blog">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
	RewriteEngine on
	RewriteCond %{HTTP_HOST} ^www.blog.com
	RewriteRule  ^(.*)$   https://www.boke.com$1 [R=302,L]
</Directory>	

<VirtualHost 192.168.18.202:80>
	ServerAdmin webmaster@blog.com
	DocumentRoot "/usr/local/apache2/htdocs/blog"
	ServerName www.blog.com
	ServerAlias www.boke.com
	ErrorLog "logs/blog-error_log"
	CustomLog "logs/blog-access_log" common
</VirtualHost>
#跳转规则
RewriteEngine on							# 开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.blog.com		# 把以 www.blog.com 开头的内容赋值给HTTP_HOST变量
RewriteRule  ^(.*)$   http://www.boke.com$1 [R=302,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
#[R=permanent,L]
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
实验:将 www.blog.com -->www.boke.com
[root@localhost htdocs]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
[root@localhost htdocs]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/blog">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>	

<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@blog.com
	DocumentRoot "/usr/local/apache2/htdocs/blog"
	ServerName www.blog.com
	ErrorLog "logs/blog-error_log"
	CustomLog "logs/blog-access_log" common
	RewriteEngine on
	RewriteCond %{HTTP_HOST} ^www.blog.com
	RewriteRule  ^(.*)$   http://www.boke.com$1 [L]
</VirtualHost>
<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@blog.com
	DocumentRoot "/usr/local/apache2/htdocs/blog"
	ServerName www.boke.com
	ErrorLog "logs/blog-error_log"
	CustomLog "logs/blog-access_log" common
</VirtualHost>
[root@localhost htdocs]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost htdocs]# grep "rewrite.so" /usr/local/apache2/etc/httpd.conf 
LoadModule rewrite_module modules/mod_rewrite.so
[root@localhost htdocs]# apachectl restart

[root@localhost htdocs]# apachectl restart

测试:

​ 客户端 hosts 文件中为:

192.168.18.201	www.blog.com
192.168.18.201	www.boke.com				

浏览器输入域名测试:

blog到boke

方法二:
在 httpd-vhosts.conf 文件中:
            1、修改对应目录标签的权限,改为 AllowOverride	All	(不用写入跳转规则)
            2、新增virtual标签(仅修改ServerName 为新域名)
            3、在 bbs 目录下创建隐藏文件	.htaccess	,并在其中写入规则
            4、主配置文件中开启 rewrite.so 模块、开启调用 httpd-vhosts.conf 子配置文件

注意:也可以直接在原有virtual标签中,新增一行 ServerAlias 新域名(不用写新增virtual标签)
#跳转规则
RewriteEngine on							# 开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.bbs.com		# 把以 www.blog.com 开头的内容赋值给HTTP_HOST变量
RewriteRule  ^(.*)$   http://www.yq.com/$1 [L]		#此处对比方法一,其中$1前加了/
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
#[R=permanent,L]
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
实验:将 www.bbs.com-->www.yq.com
[root@localhost ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
[root@localhost ~]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/bbs">
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>	

<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@bbs.com
	DocumentRoot "/usr/local/apache2/htdocs/bbs"
	ServerName www.bbs.com
	ErrorLog "logs/bbs-error_log"
	CustomLog "logs/bbs-access_log" common
</VirtualHost>
<VirtualHost 192.168.18.201:80>
	ServerAdmin webmaster@bbs.com
	DocumentRoot "/usr/local/apache2/htdocs/bbs"
	ServerName www.yq.com
	ErrorLog "logs/bbs-error_log"
	CustomLog "logs/bbs-access_log" common
</VirtualHost>
[root@localhost ~]# vim /usr/local/apache2/htdocs/bbs/.htaccess
[root@localhost ~]# cat /usr/local/apache2/htdocs/bbs/.htaccess
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.bbs.com
        RewriteRule  ^(.*)$   http://www.yq.com/$1 [L]
[root@localhost ~]# grep "rewrite.so" /usr/local/apache2/etc/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
[root@localhost ~]# apachectl restart

测试:

​ 客户端的 hosts 文件中为:

192.168.18.201	www.bbs.com
192.168.18.201	www.yq.com

浏览器中测试:

bbs到yq

5)apache+openssl实现https

前提:开启 ssl.so 模块和调用 httpd-ssl.conf 子配置文件

[root@localhost ~]# apachectl -M |grep ssl
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# egrep "write.so|shmcb.so|ssl.conf|ssl.so" /usr/local/a
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
Include etc/extra/httpd-ssl.conf

步骤:

​ 1、创建密钥和证书

​ 在 etc 下创建 ssl 目录,存放密钥和证书

​ 使用命令创建证书:

openssl genrsa -out bbs.key 1024
openssl req -new -key bbs.key -out bbs.csr
openssl x509 -req -days 365 -sha256 -in bbs.csr -signkey bbs.key -out bbs.crt

​ 2、修改 ssl 目录权限为500、ssl目录中的文件为600

​ 3、修改 httpd-ssl.conf 中的域名、ssl加密文件路径指向

提示:在此处已经能实现加密访问

​ 4、在 httpd-vhosts,conf 中,增加端口跳转代码

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=302,L]
实验:
要求:
	1、访问旧域名,跳转到加密的新域名
    2、访问新域名,跳转到加密的新域名
[root@localhost bbs]# vim /usr/local/apache2/etc/httpd.conf					#开启相关模块
[root@localhost bbs]# egrep "ssl.so|ssl.conf|rewrite.so|shmcb.so" /usr/local/apache2/etc/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
Include etc/extra/httpd-ssl.conf
[root@localhost bbs]# mkdir /usr/local/apache2/etc/ssl						#创建证书
[root@localhost bbs]# cd /usr/local/apache2/etc/ssl
[root@localhost ssl]# openssl genrsa -out bbs.key 1024
Generating RSA private key, 1024 bit long modulus
........++++++
...++++++
e is 65537 (0x10001)
[root@localhost ssl]# openssl req -new -key bbs.key -out bbs.csr

[root@localhost ssl]# openssl x509 -req -days 365 -in bbs.csr -signkey bbs.key -out bbs.crt
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=XXHF/OU=2206/CN=www.bbs.com/emailAddress=www.bbs.com
Getting Private key
[root@localhost ssl]# ll
总用量 12
-rw-r--r-- 1 root root 891 10月 30 00:02 bbs.crt
-rw-r--r-- 1 root root 672 10月 30 00:02 bbs.csr
-rw-r--r-- 1 root root 887 10月 30 00:01 bbs.key
[root@localhost ssl]# chmod 600 ./*
[root@localhost ssl]# chmod 500 /usr/local/apache2/etc/ssl

#修改 httpd-ssl.conf 中的域名、ssl加密文件路径指向若有多个目录需要加密,则需要写多个 <VirtualHost_default_:443> 标签 
[root@localhost ssl]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf 
[root@localhost network-scripts]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf		#在 httpd-vhosts,conf 中,增加端口跳转代码
[root@localhost network-scripts]# cat /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/blog">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
	RewriteEngine on
	RewriteCond %{HTTP_HOST} ^www.blog.com
	RewriteRule  ^(.*)$   https://www.boke.com$1 [R=302,L]
	RewriteCond %{SERVER_PORT} !^443$
	RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=302,L]
</Directory>	
<Directory "/usr/local/apache2/htdocs/bbs">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
	RewriteEngine on
	RewriteCond %{HTTP_HOST} ^www.bbs.com
	RewriteRule  ^(.*)$   https://www.luntan.com$1 [R=302,L]
	RewriteCond %{SERVER_PORT} !^443$
	RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=302,L]
</Directory>	

<VirtualHost 192.168.18.202:80>
	ServerAdmin webmaster@blog.com
	DocumentRoot "/usr/local/apache2/htdocs/blog"
	ServerName www.blog.com
	ServerAlias www.boke.com
	ErrorLog "logs/blog-error_log"
	CustomLog "logs/blog-access_log" common
</VirtualHost>
<VirtualHost 192.168.18.202:80>
	ServerAdmin webmaster@bbs.com
	DocumentRoot "/usr/local/apache2/htdocs/bbs"
	ServerName www.bbs.com
	ServerAlias www.luntan.com
	ErrorLog "logs/bbs-error_log"
	CustomLog "logs/bbs-access_log" common
</VirtualHost>
[root@localhost ssl]# apachectl -t
Syntax OK
[root@localhost ssl]# apachectl stop
[root@localhost ssl]# apachectl start

测试:

​ 客户端 hosts 文件为:

192.168.18.201	www.blog.com
192.168.18.201	www.boke.com
192.168.18.201	www.bbs.com
192.168.18.201	www.yq.com

浏览器测试:

旧域名到加密新域名

6)apache日志轮替(访问日志轮替)

在主配置文件中修改 CustomLog

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apach2/logs/access_%Y%m%d.log 86400" common

轮替与切割:

    轮替:日志产生前设置的规则,再根据规则生成日志
    切割:日志产生后,对日志进行切割

spilt 切割命令

注意:建议用 split 	-l	切割(行切割)
        	split	-b	(按照文件大小进行切割)

实验:

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# grep "    CustomLog" /usr/local/apache2/etc/httpd.conf
    CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# apachectl restart
[root@localhost ~]# ls /usr/local/apache2/logs/
access_log  error_log  httpd.pid
[root@localhost ~]# ls /usr/local/apache2/logs/						#客户端访问后出现轮替的日志
access_20221101.log  access_log  error_log  httpd.pid
[root@localhost ~]# date -s 20221102								#修改时间
2022年 11月 02日 星期三 00:00:00 CST		
[root@localhost ~]# ls /usr/local/apache2/logs/						#客户端访问后出现轮替的日志					
access_20221101.log  access_20221102.log  access_log  error_log  httpd.pid

7)不记录指定类型的文件访问日志

在主配置文件中

(1)CustomLog 前写入 (定义)

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

(2)CustomLog 最后追加

env=!image-request

实验:

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# grep -B8 "    CustomLog" /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
    SetEnvIf Request_URI ".*\.ico$" image-request
    CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common env=!image-request
[root@localhost ~]# apachectl restart

不记录图片日志

静态日志分析工具(以网页形式显示)
特点:静态分析apache、nginx的日志

    webalizer  web服务器日志分析工具{httpd/nginx}
    静态日志分析工具{已经产生的了}

源码:
    先安装依赖:
        yum -y install lrzsz gd-devel libpng-devel zlib-devel gcc httpd
    下载webalizer源码包
        http://www.webalizer.org/	

操作流程:

1.	创建首页文件{防止访问到测试页面}
	echo "hello world. " >> /var/www/html/index.html

2.	创建一个用来存放分析结果的目录
	mkdir /var/www/html/webalizer

3.	安装前的准备{解压缩的文件}
	a.	修改lang/webalizer_lang.simplified_chinese的编码类型
	#借助windows下的NotePad++工具进行修改{修改为utf-8类型,再重新上传到服务器的lang目录下}
	
	b.	修改解压缩目录下的:graphs.c	{文件内追加一下信息}
	voidgdImageString(gdImagePtr im,gdFontPtr font,int x,int y,unsigned char *s,int color){
	gdImageStringFT(im,0,color,"/usr/share/fonts/chinese/TrueType/fsong.ttf",9,0.0,x,y+9,s);
	}
	voidgdImageStringUp(gdImagePtr im,gdFontPtr font,int x,int y,unsigned char *s,int color){
	gdImageStringFT(im,0,color,"/usr/share/fonts/chinese/TrueType/fsong.ttf",9,-PI/2,x,y-9,s);
	}
	
	c.	创建目录,并上传字体文件
        mkdir -p /usr/share/fonts/chinese/TrueType
	从windows中的字体库中随便找一个改名上传到此目录即可
	#文件名要和配置文件中写的文件名一致,否则没有意义
	
4.	编译安装
	./configure --prefix=/usr/local/webalizer --with-language=simplified_chinese
	make
	make install

5.	利用模板生成配置文件
	cd /usr/local/webalizer/etc
	cp -a webalizer.conf.sample webalizer.conf

6.	修改配置文件{让webalizer找到需要分析的日志,并将分析结果存放到指定目录下}
	vim /usr/local/webalizer/etc/webalizer.conf
	LogFile        /var/log/httpd/access_log		#分析谁的日志(哪个文件)	
	OutputDir      /var/www/html/webalizer			#分析后的结果保存在哪里

7.	执行此命令进行分析:
/usr/local/webalizer/bin/webalizer -c /usr/local/webalizer/etc/webalizer.conf

8.	访问分析结果:
192.168.88.102/webalizer

image-20221105111007936

8)apache配置静态缓存

​ 提高用户体验、降低服务器压力

注意: expires 与 headers 不能同时设置

1、expires 实现静态缓存

​ 主配置文件中开启 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>

​ 重启服务

​ 测试 jpg、png缓存时间

​ curl '地址' -I

实验:

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# grep "expires.so" /usr/local/apache2/etc/httpd.conf
LoadModule expires_module modules/mod_expires.so
[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
[root@localhost ~]# tail -n11 /usr/local/apache2/etc/httpd.conf
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/gif "access plus 1 days"
    ExpiresByType image/jpeg "access plus 12 hours"
    ExpiresByType image/png "access plus 5 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>
[root@localhost ~]# cd /usr/local/apache2/htdocs/
[root@localhost htdocs]# ls
index.html  kn.jpg  kn.png  phpmyadmin  run.gif  test.php
[root@localhost htdocs]# curl '192.168.18.201/kn.jpg' -I

Cache-Control: max-age=43200					#对应规则里的jpg缓存时间

[root@localhost htdocs]# curl '192.168.18.201/kn.png' -I

Cache-Control: max-age=18000					#对应规则里的png缓存时间

[root@localhost htdocs]# curl '192.168.18.201/run.gif' -I

Cache-Control: max-age=86400					#对应规则里的gif缓存时间

2、使用 mod_headers 模块实现缓存

​ 检查mod_headers.so 已模块启用

​ 主配置文件中写入规则

<IfModule mod_headers.c>
    <filesmatch "\.(html|htm|txt)$">
        header set cache-control "max-age=3600"
    </filesmatch>
    
    <filesmatch "\.(css|js|swf)$">
        header set cache-control "max-age=604800"
    </filesmatch>

    <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
        header set cache-control "max-age=29030400"
    </filesmatch>
</IfModule>

​ 重启服务

​ 测试

实验:

[root@localhost htdocs]# vim /usr/local/apache2/etc/httpd.conf							#检查mod_headers.so 已模块启用
[root@localhost htdocs]# grep "mod_headers.so" /usr/local/apache2/etc/httpd.conf			
LoadModule headers_module modules/mod_headers.so
[root@localhost htdocs]# tail -n13 /usr/local/apache2/etc/httpd.conf					#主配置文件中写入规则
<IfModule mod_headers.c>
    <filesmatch "\.(html|htm|txt)$">				    # htm,html,txt 类的文件缓存一个小时
        header set cache-control "max-age=3600"
    </filesmatch>
    
    <filesmatch "\.(css|js|swf)$">						    # css, js, swf 类的文件缓存一个星期
        header set cache-control "max-age=604800"
    </filesmatch>
    
    <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">		    # jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
        header set cache-control "max-age=29030400"
    </filesmatch>
</IfModule>

[root@localhost htdocs]# apachectl restart						#重启进行测试
[root@localhost htdocs]# curl '192.168.18.201/index.html' -I
HTTP/1.1 200 OK
Date: Tue, 01 Nov 2022 15:17:31 GMT
Server: Apache/2.4.7 (Unix) PHP/7.0.7
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
cache-control: max-age=3600									#对应规则里的index.html文件缓存时间
Content-Type: text/html

9)禁止解析php (后手)

(为了避免上传文件有木马,从而禁止这个目录下的访问解析php)

#配置禁止解析php
<Directory /usr/local/apache2/htdocs/data>
    php_admin_flag engine off 
    <filesmatch "(.*)\.php$">
        Order deny,allow
        Deny from all 
    </filesmatch>
</Directory>

实验: