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

网页日志常见数字提示:
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
先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。

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
浏览器访问:


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 访问


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
浏览器分别访问域名:



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
浏览器输入域名测试:

方法二:
在 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
浏览器中测试:

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

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>
实验: