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浏览器为例,打开一个网页时使用开发工具如下所示,可以看到请求报文信息,每一个图片或其他文件类型都是单独去获取的,可以从整体进度来判断网站整体性能
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地址:
配置参数以绝对路径,更改后注意要更改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/查看其效果:
如上可看到,能正常访问页面,那么再访问测试机http://192.168.74.133 ,这时为我们呈现出来的是403错误页面,说明规则已经生效,如下所示
查看其访问日志:
[[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,如下所示
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)输入其定义的路径,发现需要用户验证,这时输入之前定义的虚拟用户和密码,如下所示:
验证成功,已正常呈现页面
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
访问用户目录
参考文献: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查看效果,如下所示:
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即可。