1、基础认识
HTML语言: 超文本标记语言,使用html语言编写的文本叫超本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
HTTP协议: 超文本传输协议
HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。
URL: 统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
格式:
http://www.liangjiaweie.net:80/image/a.jpg
URI:统一资源标志符:
URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。
2、apache概述
概述:
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python/php等解释器编译到服务器中。
Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。
工作模式:
Apache一共有3种稳定的MPM模式(MPM:多进程处理模块),它们分别是 prefork、worker、event;
init进程----->HTTP守护进程(root)---->PHP解析-->mysql
http会开启很多的子进程--->用于处理客户的需求
一个进程处理一个用户的需求
prefork 工作模式
Apache在启动之初, 就预先fork一些子进程, 然后等待请求进来。之所以这样做, 是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程, 在一个时间点内,只能处理一个请求。
● 优点: 成熟稳定,兼容所有新老模块。同时, 不需要担心线程安全的问题。
● 缺点: 一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
worker 工作模式
使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建 一些线程, 同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量, 因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下, 因为比起prefork有更多的可用线程, 表现会更优秀一些。
● 优点: 占据更少的内存, 高并发下表现更优秀。
● 缺点: 必须考虑线程安全的问题。
event 工作模式
它和worker模式很像,最大的区别在于, 它解决了keep-alive场景下, 长期被占用的线程的资源浪费 问题。 event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的 时候, 将请求传递给服务线程, 执行完毕后, 又允许它释放。这样增强了高并发场景下的请求处理能力。
HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁 忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型, 它把服务进程从连接中分离出来。在服务器处理速度很快, 同时具有非常高的点击率时, 可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的, 但不能在HTTPS访问下工作。
#做个软连接到/usr/bin/目录下
[root@localhost ~]# ln -s /usr/local/apache2/bin/* /usr/local/bin/
#如何查看使用的是哪种工作模式;
[root@node0 ~]# httpd -V |grep -i 'Server MPM:'
Server MPM: worker
#如果想要指定工作的模式--为worker
#在编译的时候,在选项中指定:--with-mpm=worker
3、apache的相关文件
配置文件位置:
● 源码包安装:
PREFIX/etc/httpd.conf(主配置文件)
PREFIX/etc/extra/*.conf(子配置文件)
● rpm安装:
/etc/httpd/conf/httpd.conf
网页文件位置:
源码包安装:指定的位置/htdocs/
rpm安装:/var/www/html/
日志文件位置:
源码包安装:指定的位置/logs
rpm安装:/var/log/httpd
4、配置文件讲解
注意:apache配置文件严格区分大小写
针对主机环境的基本配置参数:
#apache主目录
ServerRoot "/usr/local/apache2"
#监听端口
Listen 0.0.0.0: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>
5、apache实验讲解
5.1、apache的目录别名实验
当apache接受请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将某一不在DocumentRoot目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录
#修改主配置文件-->开启调用自配置文件
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
...........
456 #Include etc/extra/httpd-autoindex.conf
457 Include etc/extra/httpd-autoindex.conf #复制一行并且取消注释
#编辑子配置文件
[root@node0 ~]# cd /usr/local/apache2/
[root@node0 apache2]# vim etc/extra/httpd-autoindex.conf
#默认的模板:
Alias /icons/ "/usr/local/apache2/icons/"
<Directory "/usr/local/apache2/icons">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
#自己写一个模板
Alias /liangjiawei/ "/usr/local/apache2/liangjiawei/"
#结构:别名 "真实目录" #真实目录的结尾要有/,否则报错
<Directory "/usr/local/apache2/liangjiawei">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
#到服务器上面创建这个目录
[root@node0 apache2]# mkdir liangjiawei
[root@node0 apache2]# touch liangjiawei/index.html
[root@node0 apache2]# vim liangjiawei/index.html
This is liangjiawei.net
#重启apache服务
[root@node0 apache2]# /usr/local/apache2/bin/apachectl stop
[root@node0 apache2]# /usr/local/apache2/bin/apachectl start
#然后认证目录别名的功能
[root@node0 apache2]# curl 192.168.75.130/liangjiawei/index.html
This is liangjiawei.net
5.2、apache的用户认证试验
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身份认证。
#修改主配置文件-->在需要进行登录认证的目录标签中加入如下配置:
[root@node0 apache2]# vim etc/httpd.conf
.............
Include etc/extra/httpd-vhosts.conf #这个要打开
[root@node0 ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
#声明一下被保护的目录
<Directory "/usr/local/apache2/ljw">
AllowOverride all
#开启权限认证文件.htaccess
Options Indexes FollowSymLinks
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/usr/local/apache2/htdocs/ljw"
<Directory "/usr/local/apache2/ljw">
AllowOverride all
Options Indexes FollowSymLinks
Require all granted
</Directory>
</VirtualHost>
#在指定的目录下创建权限文件
#创建权限文件,一定是要.htaccess隐藏文件
[root@node0 apache2]# mkdir htdocs/ljw
[root@node0 apache2]# vim htdocs/ljw/index.html
Auth-liangjiawei-mmm
[root@node0 apache2]# vim htdocs/ljw/.htaccess
#添加提示信息
AuthName "hello liangjiawei.net"
#指定加密类型
AuthType basic
#密码文件,文件名自定义。(使用绝对路径)
AuthUserFile /usr/local/apache2/htdocs/ljw/apache.passwd
#允许密码文件中所有用户访问
require valid-user
#创建密码文件,加入指定用户(这个用户和系统用户无关)
#-c 建立密码文件,只有添加第一个用户时,才能-c
[root@node0 apache2]# htpasswd -c /usr/local/apache2/htdocs/ljw/apache.passwd zhangsan
New password:
Re-type new password:
Adding password for user zhangsan
#-m 再添加更多用户时,使用-m 参数
[root@node0 apache2]# htpasswd -m /usr/local/apache2/htdocs/ljw/apache.passwd lisi
New password:
Re-type new password:
Adding password for user lisi
#检查一下apache的配置文件
[root@node0 apache2]# apachectl -t
Syntax OK
#重启配置文件认证
[root@node0 apache2]# /usr/local/apache2/bin/apachectl stop
[root@node0 apache2]# /usr/local/apache2/bin/apachectl start
#最后在网页上面输入http://192.168.75.130/ljw/
5.3、apache的虚拟主机实验
虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
虚拟主机的分类:
● 基于 IP 的虚拟主机:一台服务器,多个 ip,搭建多个网站
● 基于端口的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网络使用不同端口访问
● 基于域名的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网站使用不同域名访问
实验准备:
域名解析–>准备两个域名
● www.liangjiawei.net
● blog.liangjiawei.net
● 这里需要注意一个点:使用本地hosts文件来解析,公网是不存在这两个域名的
#使用另外一台服务器当做客户端-->并且编写一下hosts文件
[root@Node1 ~]# vim /etc/hosts
#添加这一行
192.168.75.130 www.liangjiawei.net blog.liangjiawei.net
实验过程:
主页的编写:在/htdocs/目录下分别创建 sohu 和 sina 两个目录,并在新建目录内创建 index.html 文件(分别写不一样的内容)
#创建两个网站的主页目录
[root@node0 ~]# cd /usr/local/apache2/htdocs/
[root@node0 htdocs]# mkdir www blog
[root@node0 htdocs]# echo "this is www.liangjiawei.net" > www/index.html
[root@node0 htdocs]# echo "BLOG BLOG blog.liangjiawei.net" > blog/index.html
修改服务器的配置文件–>开启自配置文件的启动
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
#找到以下这一行,取消注释
468 Include etc/extra/httpd-vhosts.conf
编辑子配置文件,编写虚拟主机标签
[root@node0 ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
#添加以下内容--->注意格式要求
...........
<VirtualHost 192.168.75.130:80>
#虚拟主机标签
ServerAdmin www.liangjiawei.net
#管理员邮箱
DocumentRoot "/usr/local/apache2/htdocs/www"
#网站主目录
ServerName www.liangjiawei.net
#完整域名
ErrorLog "logs/www-error_log"
#错误日志
CustomLog "logs/www-access_log" common
#访问日志
</VirtualHost>
<VirtualHost 192.168.75.130:80>
#虚拟主机标签
ServerAdmin blog.liangjiawei.net
#管理员邮箱
DocumentRoot "/usr/local/apache2/htdocs/blog"
#网站主目录
ServerName blog.liangjaiwei.net
#完整域名
ErrorLog "logs/blog-error_log"
#错误日志
CustomLog "logs/blog-access_log" common
#访问日志
</VirtualHost>
#验证一下配置文件修改是否有问题
[root@node0 ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
#然后重启apache
[root@node0 ~]# /usr/local/apache2/bin/apachectl start
#去到另外一台设备调试查看
[root@Node1 ~]# curl www.liangjiawei.net
this is www.liangjiawei.net
[root@Node1 ~]# curl blog.liangjiawei.net
BLOG BLOG blog.liangjiawei.net
5.4、域名跳转实验
一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.liangjiawei.net 和blog.liangjiawei.net
但大家发现不管我用哪个域名访问,最终都会跳转到 www.liangjiawei.net 上来。这个行为就叫做域名跳转;
状态码:
● 301 是永久跳转,
● 302 是临时跳转,
● 网站上一定要设置为 301;
基于上面的虚拟主机成功的前提下跟着做以下实验:
#修改服务器的主配置文件-->开启重写功能
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
148 LoadModule rewrite_module modules/mod_rewrite.so
.........
#修改子配置文件
[root@node0 ~]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
...........
#修改一下目录的功能-->指定一下只要访问blog就跳转到www
<Directory "/usr/local/apache2/htdocs/blog">
AllowOverride all #这里一定要注意all
Options Indexes FollowSymLinks
Require all granted
</Directory>
#然后去到blog的目录下线创建匹配文件
[root@node0 ~]# vim /usr/local/apache2/htdocs/blog/.htaccess
#添加一下内容
RewriteEngine on #开启rewrite功能
RewriteCond %{HTTP_HOST} ^blog.liangjiawei.net
#把以blog.liangjiawei.net开头的内容赋值给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.liangjiawei.net/$1 [R=permanent,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
#服务器重启apache
[root@node0 ~]# apachectl -t
Syntax OK
[root@node0 ~]# apachectl start
#客户机验证
[root@Node1 ~]# curl www.liangjiawei.net
this is www.liangjiawei.net
[root@Node1 ~]# curl blog.liangjiawei.net
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.liangjiawei.net/">here</a>.</p>
</body></html>
#这里正常-->curl可以解析到跳转
#使用elinks就能查看
[root@Node1 ~]# elinks blog.liangjiawei.net
http://www.liangjiawei.net/
this is www.liangjiawei.net
5.5、apache+openssh实现https实验
HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议)
是以安全为目标的 HTTP通道,简单讲是 HTTP 的安全版
HTTP 下加入 SSL 层,用于安全的 HTTP 数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。
现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
实验过程
服务器端操作:
#检查一下是否支持ssl功能--->能够看到就代表能够支持
[root@node0 ~]# ls /usr/local/apache2/modules/ | grep ssl
mod_ssl.so
#ca证书的申请:
#注意 1:生成完秘钥和证书文件后,将文件存放在 Apache 的安装目录下的 cert 目录下
#注意 2:在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
[root@node0 ~]# mkdir /usr/local/apache2/cert
[root@node0 ~]# cd /usr/local/apache2/cert
##建立服务器私钥,生成 RSA 密钥
[root@node0 cert]# openssl genrsa -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
........................++++++
.......................++++++
e is 65537 (0x10001)
#生成证书
[root@node0 cert]# openssl req -new -key ca.key -out liangjiawei.csr
........
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:LJW
Organizational Unit Name (eg, section) []:LJW
Common Name (eg, your name or your server's hostname) []:ljw
Email Address []:ljw@163.net
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
.......
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书
#生成签字的证书
[root@node0 cert]# openssl x509 -req -days 365 -sha256 -in liangjiawei.cst -signkey ca.key -out liangjiawei.crt
Signature ok
subject=/C=CN/ST=GD/L=GZ/O=LJW/OU=NS/CN=LJW/emailAddress=LJW@163.net
Getting Private key
#到这里,生成的签字的证书已经生成
#修改apache配置文件
#首先打开一下ssl模块,并且启动独立的配置文件
[root@node0 cert]# vim /usr/local/apache2/etc/httpd.conf
#把两个配置打开
.............
129 LoadModule ssl_module modules/mod_ssl.so
.........
485 Include etc/extra/httpd-ssl.conf
.......
#修改子配置文件调用证书文件
[root@node0 cert]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf
#先把原来有的注释掉
.......#把原来的加密套件注释掉
51 #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
.............
#把加密证书、和已经签字的证书都注释掉
106 #SSLCertificateFile "/usr/local/apache2/etc/server.crt"
........
116 #SSLCertificateKeyFile "/usr/local/apache2/etc/server.key"
#找个位置-->大约在30行左右添加如下内容
#添加ssl协议-->和相对应的加密套件
SSLProtocol all -SSLv2 -SSLv3
#添加 SSL 协议支持协议,去掉不安全的协议
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
#修改加密套件如下-加密套件的使用
SSLCertificateFile cert/liangjiawei.crt
#证书公钥配置(签字的)
SSLCertificateKeyFile cert/ca.key
#证书私钥配置
#再次回到主配置文件--->添加一下虚拟主机-->启用443端口
#浏览器本身都是默认监听80;很多人都不知道443端口-->还要跳转功能;
[root@node0 cert]# vim /usr/local/apache2/etc/httpd.conf
..........
#在最低下面添加就好了
<VirtualHost _default_:443>
#DocumentRoot 目录位置要和 httpd.conf 里面的一致
DocumentRoot "/usr/local/apache2/htdocs"
ServerName localhost:443
SSLCertificateFile cert/liangjiawei.crt
SSLCertificateKeyFile cert/ca.key
SSLCertificateChainFile cert/liangjiawei.crt
</VirtualHost>
#这里直接检查配置文件会有报错-->报错如下:
[root@node0 cert]# apachectl -t
AH00526: Syntax error on line 90 of /usr/local/apache2/etc/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
#解决-->要么不调用此模块,要么让调用的模块加载上
[root@node0 cert]# vim /usr/local/apache2/etc/httpd.conf
#把以下这一行打开
........
88 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#再次检查配置文件
[root@node0 cert]# apachectl -t
Syntax OK
#最后验证--->
[root@node0 cert]# netstat -antup
...........
tcp6 0 0 :::443 :::* LISTEN 8487/httpd
#最后直接使用浏览器验证
强制跳转https实验
有些时候为了安全,网站不允许使用 http 访问,仅允许使用 https 访问,目的是为了更加安全
#再配置文件中添加如下内容
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
..............
<Directory "/usr/local/apache2/htdocs">
.........
RewriteEngine on #开启转发规则
RewriteCond %{SERVER_PORT} !^443$
#检查访问端口只要目标不是443的
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
#全都使用https重新访问
</Directory>
5.6、apache的日志切割实验
日志切割实验–>先关闭掉其他的功能
#把之前做的实验都全部关闭
[root@node0 ~]# apachectl stop
[root@node0 ~]# apachectl start
#用浏览器做个简单的访问-->
http://192.168.75.130/
首先单独设置日志的路径名称
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
#添加如下两行
268 ErrorLog "logs/error_log"
.....
297 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
直接修改配置文件;
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
..........
#注释掉原来的指定-->然后添加以下两个内容
269 ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"
......
298 CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combi
ned
这里需要说明一下:
● 注意 1:以上仅为两条命令(一条错误日志,一条访问日志),路径太长写不开
● 注意 2:若开启了 https,则需要修改 http-ssl.conf 配置文件中的日志记录条目
● ErrorLog 是错误日志,
● CustomLog 是访问日志。
● |就是管道符,意思是把产生的日志交给 rotatelog这个工具,而这个工具就是 apache 自带的切割日志的工具。
● -l 的作用是校准时区为 UTC,也就是北京时间。
● 86400,单位是秒,正好是一天,那么日志会每天切割一次
● 而最后面的 combined 为日志的格式,在 httpd.conf 中有定义。
#重启验证实验
[root@node0 ~]# apachectl restart
[root@node0 ~]# ls /usr/local/apache2/logs/
access_20221204.log error_20221204.log
5.7、不记录指定文件类型的日志
如果一个网站特别大,防止日志过大过多,因此可以直接忽略不记录这些信息
#修改配置文件
[root@node0 ~]# 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 ... _%Y%m%d.log 86400" combined env=!image-request
说明:在原来的访问日志配置基础上,增加了一些 image-request 的定义,比如把 gif、jpg、bmp、swf、js、css 等结尾的全标记为 image-request,然后在配置日志后加一个标记 env=!image-request,表示取反。
5.8、Apache 配置静态缓存
所说的静态文件指的是图片、js、css 等文件,用户访问一个站点,
其实大多数元素都是图片、js、css 等,
这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,
目的就是为了下次再请求时不再去服务器上下载,
这样就加快了速度,提高了用户体验。
但这些静态文件总不能一直缓存,它总有一些时效性,
那么就得设置这个过期时间。
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
...........
<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>
#或者使用 mod_headers 模块实现:该模块默认启用
<IfModule mod_headers.c>
# htm,html,txt 类的文件缓存一个小时
<filesmatch "\.(html|htm|txt)$">
header set cache-control "max-age=3600"
</filesmatch>
# css, js, swf 类的文件缓存一个星期
<filesmatch "\.(css|js|swf)$">
header set cache-control "max-age=604800"
</filesmatch>
# jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
header set cache-control "max-age=29030400"
</filesmatch>
</IfModule>
#详细说明:
这里的时间单位可以 days、hours 甚至是 min,两种不同的方法,上面使用的是 mod_expires,
而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令:
#重启apache
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl restart
5.9、Apache禁止解析PHP
某个目录下禁止解析 PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析 PHP。
#配置文件
[root@node0 ~]# vim /usr/local/apache2/etc/httpd.conf
.............
<Directory /usr/local/apache2/htdocs/data>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
文章知识点与官方知识档案匹配,可进一步学习相关知识
© 著作权归作者所有
发表评论