Apache

HTML:超文本标记语言,使用html语言编写的文本叫超文本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。

URL:统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
格式:

http://www.linuxlc.com:80/image/cjk.jpg

拓展:
URI:统一资源标志符
URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

HTTP协议:超文本传输协议
HTTP使用统一资源标识符(URL)来传输数据和建立连接。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。

相关文件

apache配置文件  
    源码包安装:/usr/lcoal/apache2/etc/httpd.conf(主配置文件)
               /usr/local/apache/etc/extra/*.conf(子配置文件)
    rpm包安装:/etc/httpd/conf/httpd.conf

网页保存位置:
    源码包:    /usr/local/apache2/htdocs/
    rpm包安装:/var/www/html/

日志保存位置
    源码包:/usr/local/apache2/logs/
    rpm包:/var/log/httpd/

配置文件

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

1 针对主机环境的基本配置

ServerRoot        apache主目录        /usr/local/apache2
Listen            监听端口                :80
LoadModule        加载的相关模块        php5
        
User
Group                         #用户和组
ServerAdmin                     #管理员邮箱
ServerName                     #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log                     #错误日志
CustomLog "logs/access_log" common         #正确访问日志
DirectoryIndex index.html index.php         #默认网页文件名,优先级顺序
Include  etc/extra/httpd-vhosts.conf         #子配置文件中内容也会加载生效
    

2 主页目录及权限

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 #访问控制列表

例1: 仅允许IP为192.168.1.1的主机访问
<RequireAll>

  Require all  granted 
  Require ip 192.168.1.1 

</RequireAll>
例2: 禁止192.168.1.2的主机访问,其他的都允许访问,
<RequireAll>

  Require all  granted 
  Require not ip 192.168.1.2 

</RequireAll>
例3: 允许所有访问,
Require all granted
例4: 拒绝所有访问,
Require all denied

Apache 实验
实验环境:使用lamp环境安装好的apache进行试验
安装完成后,先启动apache进行服务验证,是否安装成功,并且主页是否可以访问。
注:发现启动服务报错:AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
解决办法:打开主配置文件httpd.conf
搜索ServerName (约在200行左右)
修改为 ServerName localhost:80(并且去掉前面的 #注释)

实验一:目录别名
可以使特定的网站程序不出现在网站根目录下面,而这样的话,就可以避免和原来的程序本身发生混淆和冲突;缩短网页目录的纵深,减少URL的长度。

  1. 打开apache主配置文件
    #Include etc/extra/httpd-autoindex.conf (将 #号去掉)
  2. 进到子配置文件目录extra下,打开httpd-autoindex.conf
    仿照例子写一个别名:

Alias /a/ "/www/a/" #实际目录结束要有/
<Directory "/www/a/">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>

  1. 在/www/a/目录下手动创建index.html文件
  2. 将apache服务重启:
    /usr/local/apache2/bin/apachectl stop

/usr/local/apache2/bin/apachectl start
注:重启源码包安装的apache需要先关闭,再启动。

  1. 验证试验结果:
    浏览器输入 服务器IP/a/

实验二:用户认证
提高网站安全性,保护个别页面的信息,限制特定目录,只有指定用户可以访问。

  1. 打开主配置文件在最下面添加:
    <Directory "/usr/local/apache2/htdocs/baohu"> #声明被保护目录

Options Indexes
AllowOverride All #开启权限认证文件.htaccess
Require all granted
</Directory>

  1. 在指定目录下创建权限文件:
  2. /usr/local/apache2/htdocs/baohu,创建 .htaccess文件,并添加下面的内容

AuthName "Welcome to linuxlc "
#提示信息
AuthType basic
#加密类型
AuthUserFile /usr/local/apache2/htdocs/baohu/apache.passwd
#密码文件,文件名自定义。(但是路径要对,使用绝对路径)
require valid-user
#允许密码文件中所有用户访问

  1. 建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
  2. -c /usr/local/apache2/htdocs/baohu/apache.passwd test1

-c 建立密码文件,只有添加第一个用户时,才能-c
htpasswd -m /usr/local/apache2/htdocs/baohu/apache.passwd test2
-m 再添加更多用户时,使用-m 参数

  1. 验证访问:(自己手动去目录下创建index.html文件)
    浏览器输入 服务器IP/baohu/index.html

实验三:虚拟主机

虚拟主机的分类:

  1. 基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站
  2. 基于端口的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网络使用不同端口访问
  3. 基于域名的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网站使用不同域名访问
    实验准备:
  4. 域名解析:准备两个域名
    www.sohu.com

www.sina.com

  1. 没搭建DNS,只能手动添加到本地hosts文件内进行解析
    hosts
  2. 网站主页目录规划
    在/htdocs/目录下分别创建sohu 和 sina 两个目录

并且在分别在新建目录内创建index.html文件(分别写不一样的内容)

实验流程(修改配置文件)
1. vi /usr/local/apache2/etc/httpd.conf #修改主配置文件开启文件关联
Include etc//extra/httpd-vhosts.conf #此行取消注释
2. vi /usr/local/apache2/etc/extra/ httpd-vhosts.conf
#添加下方内容(添加之前先把原先存在的示例删除掉)

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

<VirtualHost 192.168.150.253> #虚拟主机标签
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>

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

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

  1. 重启服务,验证结果
    Windows 下:浏览器下输入两个不同的域名验证网页内容

Linux下:通过elinks命令验证:elinks 域名

实验四:rewrite重写功能
在URL中输入一个地址,会自动跳转为另一个地址,多用于网站更换或者添加新域名。

实验要求:

  1. 虚拟主机能正常访问
  2. 打开主配置文件开启重写模块
    LoadModule rewrite_module modules/mod_rewrite.so #取消注释

域名跳转实验:

  1. 修改虚拟主机配置文件
  2. */extra/httpd-vhosts.conf

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

  1. 创建规则匹配文件
  2. */.htaccess #在指定的网站目录下创建文件,并添加以下内容

RewriteEngine on
#开启rewrite功能
RewriteCond %{HTTP_HOST} www.sina.com
#把以www.sina.com 开头的内容赋值给HTTP_HOST变量
RewriteRule .* http://www.sohu.com
#.* 输入任何地址,都跳转到http://www.sohu.com

  1. 重启服务器,进行访问验证

伪静态:
RewriteEngine on
RewriteRule index(d+).html index.php

一、Apache的三种工作模式
Apache 一共有3种稳定的 MPM 模式(多进程处理模块),它们分别是 prefork、worker、event。http-2.2版本的httpd默认的mpm工作模式为prefork,2.4版本的httpd默认是worker工作模式。可以通过 httpd -V 来查看。
[root@itxdl ~] # httpd -V | grep -i "server mpm"
Server MPM: Prefork
编译的时候,可以通过 configure 的参数来指定:
--with-mpm=prefork|worker|event
1、prefork 工作模式
Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
2、worker 工作模式
使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题。
3、event 工作模式
它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。

二、Apache的目录别名
当apache接受请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将某一不在DocumentRoot目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录
1、编辑主配置文件
vim /usr/local/apache2/conf/httpd.conf
#Include etc/extra/httpd-autoindex.conf #去掉注释,开启引用
2、编辑子配置文件
vim /usr/local/apache2/conf/extra/httpd-autoindex.conf
Alias /icons/ "/usr/local/apache2/icons/"

<Directory "/usr/local/apache2/icons">

Options Indexes MultiViews
AllowOverride None
Require all granted

</Directory>
#可以根据模板编写一个自己需要的目录别名
三、Apache的用户认证
有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户认证。
1、编辑配置文件
vim /usr/local/apache2/conf/httpd.conf
在需要进行登录认证的目录标签中加入如下配置:
<Directory "/usr/local/apache2/htdocs/baohu"> #声明被保护目录

Options Indexes
AllowOverride All         #开启权限认证文件.htaccess
Require all granted

</Directory>
说明:首先指定要对哪个目录进行验证,AuthName自定义,AuthUserFile指定用户密码文件在哪里。
2、在指定目录下创建权限文件
切换到/usr/local/apache2/htdocs/baohu,创建 .htaccess文件,并添加下面的内容
AuthName "Welcome to linuxlc "
#提示信息
AuthType basic
#加密类型
AuthUserFile /usr/local/apache2/htdocs/baohu/apache.passwd
#密码文件,文件名自定义。(但是路径要对,使用绝对路径)
require valid-user
#允许密码文件中所有用户访问
3、建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
htpasswd -c /usr/local/apache2/htdocs/baohu/apache.passwd test1
-c 建立密码文件,只有添加第一个用户时,才能-c
htpasswd -m /usr/local/apache2/htdocs/baohu/apache.passwd test2
-m 再添加更多用户时,使用-m 参数

4、重启apache服务
apachectl -t
apachectl graceful
先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。

三、设置虚拟主机
默认虚拟主机就是配置文件里的第一个虚拟主机。关于默认虚拟主机有个特点,凡是解析到这台服务器的域名,不管是什么域名,只要在配置文件中没有配置,那么都会访问到这个主机上来。如果我们直接用IP访问,会访问到这个站点上来。为了避免别人乱解析,所以应该把默认也就是第一个虚拟主机给禁止掉。我们使用allow,deny语句,已经禁止掉了。
虚拟主机的分类:
基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站
基于端口的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网络使用不同端口访问
基于域名的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网站使用不同域名访问
实验准备:
1、域名解析:准备两个域名
www.sohu.com
www.sina.com
2、 没搭建DNS,只能手动添加到本地hosts文件内进行解析
3、网站主页目录规划
在/htdocs/目录下分别创建sohu 和 sina 两个目录,并且在分别在新建目录内创建index.html文件(分别写不一样的内容)
4、修改主配置文件开启文件关联
vi /usr/local/apache2/etc/httpd.conf
Include etc//extra/httpd-vhosts.conf #此行取消注释
5、编辑子配置文件,编写虚拟主机标签
vi /usr/local/apache2/etc/extra/ httpd-vhosts.conf
#添加下方内容(添加之前先把原先存在的示例删除掉)
<Directory "/usr/local/apache2/htdocs/sina">
Options Indexes
AllowOverride None
Require all granted
</Directory>

<VirtualHost 192.168.150.253> #虚拟主机标签
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>

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

<VirtualHost 192.168.150.253>
ServerAdmin webmaster@sohu.com
DocumentRoot "/usr/local/apache2/htdocs/sohu"
ServerName www.sohu.com
ErrorLog "logs/sohu.com-error_log"
CustomLog "logs/sohu.com-access_log" common
</VirtualHost>
6、重启服务,验证结果
Windows 下:浏览器下输入两个不同的域名验证网页内容
Linux下:通过elinks命令验证:elinks 域名
四、域名跳转
一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.lampbrother.net 和 www.itxdl.cn 但大家发现不管我用哪个域名访问,最终都会跳转到www.itxdl.cn 上来。这个行为就叫做域名跳转,这里的301只是一个状态码,跳转除了301还有302,301是永久跳转,302是临时跳转,网站上一定要设置为301,这样对搜索引擎是比较友好的。
1、配置域名跳转
# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.lampbrother.net$
RewriteRule ^/(.*)$ http://www.itxdl.cn/$1 [R=301,L]

</IfModule>
配置为:当访问www.lampbrother.net时,跳转到www.itxdl.cn的网站。
2、配置多个域名跳转
<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.sina.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.itxdl.com$
RewriteRule ^/(.*)$ http://www.sohu.com/$1 [R=301,L]

</IfModule>
3、重启服务器并测试
apachectl -t
apachectl graceful
测试:
# curl -x192.168.88.10:80 www.sina.com -I
HTTP/1.1 301 Moved Permanently
Date: Tue, 25 Oct 2016 15:48:10 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Location: http://www.sohu.com/
Content-Type: text/html; charset=iso-8859-1
# curl -x192.168.88.10:80 www.itxdl.com -I
HTTP/1.1 301 Moved Permanently
Date: Tue, 25 Oct 2016 15:48:49 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Location: http://www.sohu.com/
Content-Type: text/html; charset=iso-8859-1
通过上述测试,发现无论是sina或itxdl都可以跳转到 www.sohu.com 域名上来,通过浏览器访问也一样。

五、Apache日志切割
我们每访问一次网站,那么就会记录若干条日志。当然前提是已经设置了日志,日志不去管理,时间长了日志文件会越来越大,如何避免产生这么大的日志文件?其实apache有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。
1、首先简单设置日志的路径名称
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
编辑添加内容如下:
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
2、设置apache日志分割
同样编辑配置文件httpd-vhosts.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y%m%d.log 86400" combined
ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义。

六、不记录指定文件类型的日志
如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
1、配置日志不记录图片的访问
vim /usr/local/apache2/conf/extra/httpd-vhosts.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,表示取反。

七、Apache配置静态缓存
所说的静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
1、配置静态缓存
# vim /usr/local/apache2/conf/extra/httpd-vhosts.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 hour"
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,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令:
# /usr/local/apache2/bin/apachectl -M
2、重启服务器并验证
apachectl -t
apachectl graceful
验证:
# curl -x127.0.0.1:80 'http://www.sohu.com/image/xdl.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg
八、禁止解析PHP
某个目录下禁止解析PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析PHP。
1、配置禁止解析php
<Directory /usr/local/apache2/htdocs/data>

php_admin_flag engine off 
<filesmatch "(.*)php">
    Order deny,allow
    Deny from all 
</filesmatch>

</Directory>
说明:php_admin_flag engine off这个语句就是禁止解析php的控制语句,但只这样配置还不够,因为这样配置后用户依然可以访问php文件,只不过不解析了,但可以下载,用户下载php文件也是不合适的,所以有必要再禁止一下。