Apache学习笔记之基础配置篇

HTTP基本概念

1.http应用协议

http属于请求响应模型
http的请求为request报文
而响应报文为response报文
随着http协议发展,随着cgi(通用网关接口)技术出现使得服务器端可以执行服务脚本。

2.客户端动态

开打的页面随着系统和程序各方面的属性临时生成的页面

・http的版本

http0.9 只能打开文本
http1.0 引入了mime技术:多用途互联网邮件扩展,为smtp发送邮件时能够附带附件
MIME格式:
major/minor
image/jpg
image/gif
text/html 等等,不再一一介绍
http1.1:新加入了更多的请求方式,更精细的缓存控制,加入持久连接(keepalive)

3.URL
scheme://[username:password@]HOST:port/path/to/source
协议 主机 请求的资源路径,如下所示
http://www.test.com/xxx/123.rar
网页文件:需在文件系统上存放一个位置,如/www/html,之后会做演示

4.http事物:
一个事物的组成是由request+response整个过程的建立到结束,即一个请求与其一个对应的响应报文合并起来就是http事物

5.http方法:
get 从服务器上获取完整资源
put 上传资源,需webdav机制
delete:基于webdav完成删除操作
post:提交表单
options:返回服务器的某种方法
trace:追求一个资源请求中间所经过的代理服务器

http缓存机制:
私有缓存
公共缓存

6.http
可以是多级缓存

http响应码:
纯粹的响应信息:

1xx :信息性状态码
100,101等
2xx : 成功状态码
200: OK
3xx : 信息不完整(重定向状态码)
301 :永久重定向(请求的资源永久移动到其它位置,不会再移动回来)在location响应首部的值仍为当前URL
302 : 临时重定向 (显式重定向,告诉用户资源在哪里)location响应首部的值为新的URL
304 : Not Modified
4xx :客户端错误状态码
404 : Not Found
403 :主页文件不存在或目录没有权限
5xx :服务器错误代码
500 : 服务器端配置有问题
502 :错误的网关信息
504 :网关超时,服务器能收到请求但是在回应时超时

HTTP请求报文和响应报文的格式:

主体:

request:
<method> <request-URL(
只是从主机往后的路径)><version 明确说明http的版本>

<headers首部>
<enity-body>

以google chrome浏览器为例,打开一个网页时使用开发工具如下所示,可以看到请求报文信息,每一个图片或其他文件类型都是单独去获取的,可以从整体进度来判断网站整体性能

wKioL1LFLVzwk67VAADNoVqyGfE780.jpg

7.模拟请求过程:

以测试机10.0.10.62为例:

[root@test3~]# telnet 10.0.10.62 80          #连接此IP的80端口

Trying10.0.10.62...

Connectedto 10.0.10.62.

Escapecharacter is '^]'.

GET/ http/1.1                                  #指明请求的路径为/ 协议为1.1

Host:10.0.10.62                                #指定主机,需要请求的主机是,首部名称通常为host

                                              #连按两次回车,可以看到以下系统信息

HTTP/1.1403 Forbidden                         #因没有指定资源,所以返回403信息

Date:Tue, 31 Dec 2013 16:20:54 GMT      

Server:Apache/2.2.15 (CentOS)

Accept-Ranges:bytes

Content-Length:5039

#############################中间略##############

再次请求首部,并指定资源

[root@test3html]# echo hello > index.html     #创建主页文件,并加入内容为hello

[root@test3html]# telnet 10.0.10.62 80        #telnet此ip的80端口

Trying10.0.10.62...

Connectedto 10.0.10.62.

Escapecharacter is '^]'.

GET/index.html http/1.1                       #请求主页信息

host:10.0.10.62                               #指定host主机


HTTP/1.1200 OK                                #正常返回页面信息

Date:Tue, 31 Dec 2013 16:30:55 GMT

Server:Apache/2.2.15 (CentOS)

Last-Modified:Tue, 31 Dec 2013 16:29:29 GMT

ETag:"603b3-6-4eed710871086"

Accept-Ranges:bytes

Content-Length:6

Connection:close

Content-Type:text/html; charset=UTF-8

hello

Connectionclosed by foreign host.


由上面的操作实验,可总结出HTTP响应报文:

response:

<vsersion><status> <reason-phrase>

<headers>

<entity-body>

http无非就只有2种报文,无非是在URL上发生变化

9.总结:

(1)http报文分为两种分别是请求报文request 响应报文response

(2)一个http事物的建立过程即一个请求与其一个对应的响应报文合并起来

(3)http可以是多级缓存

(4)请求报文(request)的格式为:

request:

<method><request-URL(只是从主机往后的路径)> <version 明确说明http的版本>

<headers首部>

<enity-body>

(5)响应报文(response)的格式为:

response:

<vsersion><status> <reason-phrase>

<headers>

<entity-body>


HTTP报文首部:

通用首部:请求和响应均可使用

比如:Connection

Date:报文创建日期

Via:所经过的代理服务器

1.请求首部:

Host:所请求的主机,主机未必是ip地址有可能是主机名

Referer:提供包含当前请求URI(标示符)文档的URL(定位符) 链接的来源 比如跳转 点某链接跳转盗链

Accept: 能够接受的mime类型

Accept-Charset:接受的字符集

Accept-Langague:能手发送哪些语言内容

2.条件请求首部:

if-modified-since

if-none-match

安全请求首部:

Authorization : 客户端提供给服务器的认证信息,比如密码

Cookice、Cookice2 :追踪用户状态,

3.实体首部:

Allow:允许的请求方法

Location:资源的实际位置

Content-Language:内容语言

Content-Location:实际位置

-Type:MIME类型

Etag:实体标记

Expires:告诉浏览器可以缓存,但是缓存已过期

LAST-MOTIFIED:

3.一次HTTP事物的完成过程:

作为web服务端必须实时监听和回应客户端的请求,一旦客户端的请求到来:

1.建立连接

2.接收请求

3.处理请求

4.获取用户所请求的资源

5.构建响应

6.回送响应

7.记录日志

一般对web来讲日志是不能关闭的,所以需要更好的日志系统,而且只要跟web服务器打交道一定会产生IO

4.http的工作模型:

(1)进程工作模型:略

(2)线程工作模型:

内核仍然提供服务,第一个用户请求到达的时候线程发现需要复制文件,通过内核将文件复制给其进程,所以第二个用户请求同一个文件,对于第二个线程来说这个文件已存在,因为是公用同一个空间,所以速度得到提升;

其缺点:线程很有可能产生资源争用,并不是全状态并行。所以一个进程里不能启动太多线程,所以可启动多个进程从其启动的进程再启多个线程,但无论如何每个线程也都是一个独立的执行实体(执行必须给cpu资源)

安装配置Apache

首先,Apache的历史和介绍就不说了,直奔主题

安装配置

测试环境:VMware Workstation CentOS 6.4 64位

与centos5.x不同,在6.x上被分割成2个安装包,分别是:httpd和httpd-tools,这里先使用yum进行完全安装测试:

安装httpd

[root@test3~]# yum install httpd -y

启动httpd

[root@test3~]# /etc/init.d/httpd start

设置开机启动级别

[root@test3~]# chkconfig httpd on

[root@test3~]# chkconfig --list | grep http

httpd              0:off    1:off    2:on 3:on 4:on 5:on 6:off

httpd目录说明:

服务脚本 :   /etc/init.d/httpd
运行目录 :   /etc/httpd
配置文件 :   /etc/httpd/conf
主配置文件:  /etc/httpd/http.conf
扩展配置文件:/etc/httpd/conf.d/*.conf
网页文件目录(DocumentRoot): /var/www/html/
CGI:        /var/www/cgi-bin/


配置httpd的工作属性:

指令不区分大小写,但约定俗成的习惯,单词的首字母大写:指令的值很有肯能区分大小写,有些指令可以重复使用多次

1.配置文件的构成:

全局配置:对服务器或虚机主机都有效,且有些功能是服务器自身工作属性

主服务器:主站属性

虚拟主机:虚拟主机属性定义

配置文件语法测试:

[root@test3~]# /etc/init.d/httpd configtest

或者

[root@test3~]# httpd -t

大多数配置修改后,使用service httpd reload重读配置文件即可生效,而更改监听端口通常重启服务。

查看监听地址:

[root@test3~]# netstat  -lntup | grep httpd

tcp        0     0 :::80                      :::*                        LISTEN      1795/httpd  

2.配置apache的监听端口

apache的监听端口是由httpd.conf中的Listen参数来指定,如下所示:

定义只监听在某个ip上的8080端口:

[root@test3~]# vim /etc/httpd/conf/httpd.conf

加入以下参数:

Listen10.0.10.62:8080

定义对监听所有IP段的8011端口:

Listen 8011

更改端口之后一定要重启服务,reload是不生效的

[root@test3~]# /etc/init.d/httpd restart

查看是否启动端口:

[root@test3~]# netstat  -lnt | grep 80

tcp        0     0 10.0.10.62:8080            0.0.0.0:*                    LISTEN      

tcp        0     0 :::80                      :::*                         LISTEN    

tcp        0     0 :::8011                    :::*                         LISTEN      

3.配置所选用的MPM的属性

MPM:意为多路处理模块,也就是我们所说的apache的工作模式,其模式有3种,分别是prefork、worker、event;event在apache2.4版本之前是以测试状态,网上并没有太多的资料,在更新至2.4版本之后正式上线

先来说prefork:当httpd启动起来之后,会生成一个主进程,它负责监听用户的请求,一旦请求进来后,它不负责自己响应而生成的子进程来响应,从而继续监听请求。

需要考虑的是:刚启动服务的时候需要创建几个空闲进程,太多不好太少也不好。最少保证有几个空闲进程来响应请求进来,这是必须的。 最多设定多少个空闲进程,多余的空闲进程需要回收回来。

所以其有如下几个关键作用:

(1).启动服务时绑定特权端口:能够实用小于1024的特权端口只有管理员,运行一些公共可用的服务,但一定不能是管理员

(2).派发或回收子进程

(3).读取分析主配置文件

(4).监听每个用户请求并且派发子进程

查看当前使用的模块:

使用httpd -l来查看当前启动了哪些模块:

[root@test3~]#  httpd -l

Compiledin modules:

 core.c               #apache的核心

 prefork.c            #所启动mpm模型

 http_core.c          #模型

 mod_so.c             #支持dso模式 动态模块加载

查看所有装载的模块:

[root@test3~]#  httpd -D DUMP_MOULES

4.配置prefork模型

apache服务默认就是以Prefork模式启动,无须更改启动模式,下面来演示如何更改其模型参数

编辑主配置文件

vim/etc/httpd/conf/httpd.conf

找到以下参数:

<IfModuleprefork.c>

StartServers           8

MinSpareServers        5

MaxSpareServers        20

ServerLimit            256

MaxClients             256

MaxRequestsPerChild    4000

</IfModule>

找到与模块相关的参数:IfModule为条指令,意为判断模块是否存在,如果存在那么参数则生效,反之如果不存在此模块,参数将不会生效

参数说明:

<IfModuleprefork.c>             #如果存在这个模块,那么提供以下属性

StartServers           8        #刚启动web服务时启动几个空闲子进程

MinSpareServers        5        #最少空闲进程数

MaxSpareServers        20       #最大空闲进程数

ServerLimit            256      #限定最多允许并发进来的活动用户连接个数

假如一个进程需要20M内存,那么256*20=5G内存,通常说此值是相当消耗内存,由此可以说明设置为256已经相当足够。

例:工作中,通过观察发现服务器每个请求进来并处理结束之间的过程大概需要50毫秒,在一秒钟之内一个进程可以处理20个请求,那么一共开启了256个那么即意味着256*20=每秒的并发数量,因此还需要再计算极端情况:对于一个站点来说一般都有高峰期,假如一次性进来的请求远远超于预想的阀值,该如何处理,之后会提到。

MaxClients             256      #服务器所允许同时所连接进来的链接数,一般来说与上面保持一致,或者大于上面的数。

MaxRequestsPerChild    4000     #一个服务器进程最多可以处理多少个进程,一旦超出请求后无论如何将进程结束并新启动新进程

</IfModule>                     #最后以IfModule结尾

如果发现服务器满负荷工作时,但服务器上仍然有空闲,可以将MaxClients、ServerLimit值调大


5.配置woker模型

woker模式的工作流程在上面也提到过一次,为了方便记忆,再复制一下:

当第一个用户请求到达的时候线程发现需要复制文件,通过内核将文件复制给其进程,所以第二个用户请求同一个文件,对于第二个线程来说这个文件已存在,因为是公用同一个空间,所以速度得到提升;

其缺点:线程很有可能产生资源争用,并不是全状态并行。所以一个进程里不能启动太多线程,所以可启动多个进程从其启动的进程再启多个线程,但无论如何每个线程也都是一个独立的执行实体(执行必须给cpu资源)

更改apache当前工作模式为woker模式:

编辑文件/etc/sysconfig/httpd

[root@test3~]# vim /etc/sysconfig/httpd

将以下参数的注释信息去掉:

HTTPD=/usr/sbin/httpd.worker

更改模式必须重新启动服务

[root@test3~]# /etc/init.d/httpd restart

启动完毕后,查看其进程状态:

[root@test3~]# ps -ef | grep http

root      1667    1  0 23:43 ?        00:00:00 /usr/sbin/httpd.worker              #由root生成的父进程

apache    1671 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker              #通过内核将文件复制给其进程

apache    1672 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker

apache    1673 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker

apache    1676 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker

属性配置:

<IfModuleworker.c>

StartServers           4        #配置启动多少个用于监听的服务,主意的是这里并不是服务器进程,而是线程

MaxClients             300      #最大支持的用户连接数

MinSpareThreads        25       #最小的空闲线程数

MaxSpareThreads        75       #最大的空闲线程数

ThreadsPerChild        25       #允许每个进程最多生成多少个线程

MaxRequestsPerChild    0        #设置一个独立的子进程将能处理的请求数量

</IfModule>

6.配置Apache服务支持keep-alived(长连接)

编辑主配置文件

[root@test3~]# vim /etc/httpd/conf/httpd.conf

加入以下参数

keepAliveOn                #开启长连接

KeepAliveTimeout3          #连接超时时间为3秒

MaxKeepAliveRequests50     #一个连接可以最多发送多少次请求

配置完成,重新加载配置文件,不需要重启

[root@test3~]# /etc/init.d/httpd reload

在生产环境中比较繁忙的服务器想使用长连接,因为一个请求在几毫秒就已经处理完成了,所以持久1-3秒是可以接受的,并且不对服务器进行频繁的断开连接等处理操作,所以是可以提高服务器性能的

7.配置站点目录

配置web的默认访问目录,是以参数DocumentRoot "/var/www/html" 和 <Directory"/var/www/html"> 来定义的

可在其对应目录创建主页文件来查看效果:

[root@test3~]# cat /var/www/html/index.html

hello

访问web地址:

wKioL1LFLa-S7eGiAAAsKXWRiqI967.jpg

配置参数以绝对路径,更改后注意要更改web目录权限,至于如何去详细去配置,在配置虚拟主机的时候会详细说明

8.配置页面文件访问属性

以<Directory"/var/www/html">为例子:

找到以下参数:

<Directory"/var/www/html">      

OptionsIndexes FollowSymLinks

AllowOverrideNone

   Order allow,deny

   Allow from all

</Directory>

参数说明:

options                    #使用此参数来定义属性

Indexs                     #是否允许索引页面,一般不允许此页面,除非有特殊需要

FollowSynLinks             #是否跟随软链接文件

symLinksifOwnerMatch       #如果属主是当前允许apache用户的属主则可以使用软链方式访问

ExecCGI                    #是否允许执行CGI脚本

All                        #意为所有

None

9.配置基于IP访问控制

首先找到以<Directory "/var/www/html"> 开头的行,并定义以下参数:

Orderallow,deny

Allowfrom all

参数说明:

定义allow和deny哪个为默认法则:写在后面的为默认法则,即deny,意味着写在前面的指令没有明确定义的即后面的控制。

以第二行为例,如果allow后面没有明确说明,则除此条规则外全部都是deny。

比如

(1)仅允许这个网段的ip访问apache

<Directory"/var/www/html">

   Options Indexes FollowSymLinks

   AllowOverride None

   Order allow,deny

   Allow from 10.0.10.0/24

</Directory>

检查语法并重新加载配置文件

[root@test3~]# httpd -t

SyntaxOK

[root@test3~]# /etc/init.d/httpd reload

测试:

首先,我们来看一下测试机的ip地址,如下所示

[root@test3 ~]# ifconfig | grep 'inet addr:'

         inet addr:10.0.10.62  Bcast:10.0.10.255  Mask:255.255.255.0

         inet addr:192.168.74.133  Bcast:192.168.74.255  Mask:255.255.255.0

可以看到目前我们只针对于10.0.10.0/24段开放访问,其他全部为deny规则,那么先来访问http://10.0.10.62/查看其效果:

wKiom1LFLeTAZUEQAAAiljSV9d4994.jpg


如上可看到,能正常访问页面,那么再访问测试机http://192.168.74.133 ,这时为我们呈现出来的是403错误页面,说明规则已经生效,如下所示

wKioL1LFLdjCl6BWAABINDiZyaI161.jpg

查看其访问日志:

[[email protected]]# tail /var/log/httpd/access_log

#来源地址是10.0.10.0网段,请求返回值200,说明已经请求成功

10.0.10.1- - [02/Jan/2014:02:41:18 +0800] "GET / HTTP/1.1" 200 6"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"

#来源地址是192.168.74.x网段,规则不匹配则自动返回403

192.168.74.1- - [02/Jan/2014:02:41:20 +0800] "GET / HTTP/1.1" 403 282"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"

(2)只禁止某个ip段的ip访问,其他全部放行

<Directory"/var/www/html">

   Options Indexes FollowSymLinks

   AllowOverride None

   Order deny,allow

   deny from 10.0.10.0/24

</Directory>

地址范围匹配的越小,优先级越高

测试:再次访问10.0.10.62,发现之前呈现的正常页面已经变成了403,如下所示

wKioL1LFLfbgJ28iAABFWnYQHs8655.jpg

10.基于用户访问控制

在 APACHE 中,用户的认证可以采用数据来存储用户认证信息,不过我们这里先介绍使用文本来存储用户的信息。例如我们要使用户在访问 /download/ 时需要认证才能访问,需要进行如下的配置:

(1)在配置文件 httpd.conf,需要有如下的配置

在站点配置模块里增加参数:AuthUserFile.htaccess来指名访问控制文件的文件名、Require valid-user 用来指定用户

<Directory"/var/www/downlads">

  Options Indexes

  AllowOverride AuthConfig

  AuthName "Only for employees."

  AuthType Basic

  AuthUserFile /etc/httpd/conf/.hypes     #定义密码文件的绝对路径

Requiretest110                   #允许所有用户登陆,这里的用户是apache生成的虚拟用户

</Directory>

(2)建立账号文件

如果新建立密码文件的话,需要加-c ,如果是追加用户的话一定不要加-c参数

[root@test3conf]# htpasswd -c -m /etc/httpd/conf/.htpass test110

(3)重启服务并验证

[root@test3html]# /etc/init.d/httpd restart

(这次用的IE)输入其定义的路径,发现需要用户验证,这时输入之前定义的虚拟用户和密码,如下所示:

wKioL1LFLgfQ3y2dAACN-K6TfHc995.jpg

验证成功,已正常呈现页面

wKiom1LFLhviiVcIAAAsarPo-2g591.jpg


11.使用userdir让每个系统用户都拥有个人站点

对于大规模企业来说,有必要为每个员工配置个人主页,以帮助员工进行自我宣传、学习和交流。用UserDir 指令可以允许每个系统用户在其宿主目录中拥有一个个人站点。

如:http://HOST/~username/

编辑主配置文件,找到以下模块参数:

<IfModulemod_userdir.c>

   UserDir disabled

</IfModule>

其中将参数disabled 改为用户家目录即可,如下所示:

<IfModulemod_userdir.c>

   UserDir /home/

</IfModule>

验证:

[root@test3home]# cd /home/test/

[root@test3test]# echo 1 > index.html

[root@test3test]# setfacl -m u:apache:x /home/test

[root@test3test]# getfacl /home/test

访问用户目录

wKioL1LFLhiB1q_9AAAoUbQdJoE815.jpg

参考文献:http://os.chinaunix.net/a2005/1217/955/000000955224.shtml

12.总结:

(1)apache常用检测语法http-t

(2)apache可以定义多个端口分别使用Listen来定义,如果只监听某个地址的端口则Listen ip:prot

(3)MPM:意为多路处理模块,也就是我们所说的apache的工作模式,其模式有3种,分别是prefork、worker、event,event在2.4版本之前处于测试状态,所以没做介绍。

(4)不管以什么模式启动,刚启动服务的时候需要创建几个空闲进程,太多不好太少也不好。最少保证有几个空闲进程来响应请求进来,这是必须的。 最多设定多少个空闲进程,多余的空闲进程需要回收回来。

(5)在生产环境中比较繁忙的服务器想使用长连接,因为一个请求在几毫秒就已经处理完成了,所以持久1-3秒是可以接受的,并且不对服务器进行频繁的断开连接等处理操作,所以是可以提高服务器性能的。

(6)访问规则定义allow和deny哪个为默认法则:写在后面的为默认法则,即deny,意味着写在前面的指令没有明确定义的即后面的控制。


配置日志功能

对于任何一个web服务器来说,运行日志都是一个重要的环节,管理员除了使用一些状态显示模块来显示apache当前运行的状态外,只能通过日志来监控和管理apache,就日志记录本身来说,apache服务已经做的相当牛逼了,它有十分完善的日志功能以及优先级,能够良好的记录各种服务相关的信息,这些都可以自定义的。

1.日志的分类

日志分为2类,分别是访问日志和错误日志:

错误日志:由内核模块复制,专门记录apache服务运行错误信息。

访问日志:主要记录apache在运行中产生的日志,比如一个连接的详细信息,连接连接是否被拒等。

2.日志格式:

apache日志格式的定义在主配置文件中有体现,当然也可以手动自定义,前提是得搞懂每个参数是干啥用的:

[root@test3home]# grep 'LogF' /etc/httpd/conf/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

LogFormat"%{Referer}i -> %U" referer

LogFormat"%{User-agent}i" agent

3.日志参数解释:

%h          #客户端主机

%l          #用户登录名

%u          #用户名

%t          #接受到请求到达的时间

\"%r\"     #转意要使用引号本身,请求报文的起始行GET请求的方法 /请求的资源HTTP/1.1 版本

%>s         #显示内部完成重定向的状态码

%b          #响应报文的大小单位是字节 但不包含http首部,纯粹响应用户本身的大小

"%{Referer}i\" #从哪个网站页面跳过来的

以方便为主,再来查看下日志的信息,方便之后对照

[root@test3home]# tail -1  /var/log/httpd/access_log

192.168.74.1- - [02/Jan/2014:03:45:45 +0800] "GET /~test2/ HTTP/1.1" 200 2"-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"

#在2014:03:45:45来自192.168.74.1的请求访问http://ip/~test2/ 的页面 返回状态码200 并响应报文的大小

总结:

(1)日志分为2类,分别是访问日志和错误日志

(2)apache日志格式的定义在主配置文件中有体现,可以使用LogFormat模块来自定义日志规则

(3)一般在生产环境中要使用日志轮询,具体实现将在下篇文章中体现

设置默认字符集

如果服务器和页面都没有指定编码,编码是由浏览器的默认编码来确定的,当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端

定义字符编码:

AddDefaultCharsetUTF-8或其他字符编码

配置别名

1.配置目录

当apache接受请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将一组文件放置在网站上,希望将它们留在本来位置而搬移到新的位置,这时,我们可以定义路径别名来实现

比如,站点目录定义在/var/www/html/,用户想访问http://ip/images/1.txt 但是用户却不知道其文件所在目录是 /www/images/1.txt

[root@test3 home]# vim /etc/httpd/conf/httpd.conf

DocumentRoot"/var/www/html"

Alias/images/  "/www/static/"         #如果定义结尾有符号/  那么"/ptah/"也必须以符号/ 结尾

创建文件:

[root@test3conf]# cat /www/static/1.txt

this istest

重新启动服务:

[root@test3conf]# /etc/init.d/httpd restart

验证:

访问http://10.0.10.62/images/1.txt查看效果,如下所示:

wKioL1LFLlSTrcHAAAAqBEy6fJc715.jpg

2.配置脚本路径别名

配置支持CGI路径别名前提是首先必须确保apache支持cgi模块:

[root@test3conf]# grep 'LoadModule cgi_module modules/mod_cgi.so' httpd.conf

LoadModulecgi_module modules/mod_cgi.so

通常不能将ExecCGI参数写在全局配置中,必须将放在特定目录中让他执行

这时可以定义ScriptAlias参数,配置如下:

编辑主配置文件,将之前的参数注释,自定义目录

#ScriptAlias/cgi-bin/ "/var/www/cgi-bin/"

ScriptAlias/cgi-bin/ "/www/cgi-bin"

[root@test3conf]# mkdir -p /www/cgi-bin/

[root@test3conf]# chown apache -R /www/

[root@test3conf]# cd /www/cgi-bin/

创建CGI测试脚本

#!/bin/bash
#
cat << EOF
Content-Type: text/html
<pre>
The hostname is: `/bin/hostname`.

The time is: `date`.
</pre>

配置基于web虚拟主机

虚拟主机是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名。

服务多个站点,对于apache来讲支持的虚拟主机类型有:

・基于端口虚拟主机

・基于ip虚拟主机

・基于域名虚拟主机

为什么会根据主机名请求返回不同站点?

request报文首部 标记了host,请求在通信子网请求的一定是ip地址,而不是主机名,但是在它的请求报文的首部标记了host;

虚拟主机和主服务器不能同时使用,需关闭主服务器,注释主服务器的DocumentRoot再定义vhost即可;

1.配置基于端口的虚拟主机

[root@test3html]# vim /etc/httpd/conf/httpd.conf

加入参数

NameVirtualHost*:8080

配置虚拟主机

<VirtualHost*:8080>

       DocumentRoot "/www/port/"

       CustomLog"logs/access_prot_log" common

</VirtualHost>

创建网页文件

[root@test3port]# pwd

/www/port

[root@test3port]# echo "port vhost" > index.html

验证

[root@test3port]# curl  http://10.0.10.62:8080/

portvhost

2.配置基于IP虚拟主机

添加临时ip地址

[root@test3ip]# ifconfig eth0:1 10.0.10.66

[root@test3ip]# ifconfig eth0:1

eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:EF:9C:E5  

         inet addr:10.0.10.66  Bcast:10.255.255.255  Mask:255.0.0.0

         UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

配置虚拟主机

<VirtualHost10.0.10.66:80>

       DocumentRoot "/www/ip/"

       CustomLog"logs/access_ip_log" common

</VirtualHost>

重新加载配置文件

[root@test3conf]# /etc/init.d/httpd restart

添加主页文件

[root@test3ip]# echo "this is ip vhost" > index.html

[root@test3ip]# pwd

/www/ip

验证

[root@test3conf]# curl http://10.0.10.66

this isip vhost

3.配置基于域名虚拟主机

<VirtualHost*:80>

      ServerName www.test.com

      DocumentRoot "/www/domian/"

      ErrorLog "logs/error_www.test.com.log"

      CustomLog "logs/access_www.test.com.log" common

</VirtualHost>

验证:由于没有配置DNS,所以只能更改hosts来指定域名

[root@test3logs]# echo "10.0.10.62 www.test.com" >> /etc/hosts

[root@test3logs]# curl http://www.test.com

test

查看访问日志

[root@test3logs]# tail access_www.test.com.log

10.0.10.62- - [02/Jan/2014:21:37:54 +0800] "GET / HTTP/1.1" 200 5

4.总结

再次复制粘贴,为什么服务器会根据主机名请求返回不同站点:

request 报文首部 标记了host,请求在通信子网请求的一定是ip地址,而不是主机名,但是在它的请求报文的首部标记了host。

虚拟主机和主服务器不能同时使用,需关闭主服务器,注释主服务器的DocumentRoot再定义vhost即可。



你可能感兴趣的:(apache,http协议,报文,apache日志,apahe配置,apache模式)