Httpd(即Apache)作为当今最流行的的web server之一,在互联网中起着至关重要的作用,那么这么一个强大的工具是如何配置工作的呢,本节我就带大家了解实现一下httpd的基本配置。
在这里一些基本的httpd知识点我可能介绍的不是那么的详细,希望大家不是很懂的地方可以通过Google等方式进行查找了解。那么下面我们就开始吧。
实验运行环境:
Centos6.5x86_64
IP:172.16.249.57
Httpd的安装
Httpd的安装方式通常有两种,一直是直接利用rpm包进行直接安装,另一种是源码编译安装,这里我们先用rpm包直接安装就行了,至于源码编译安装的方式我会在后面进行介绍并实现。OK,那就开始安装了。
[[email protected] ~]# yum install httpd
安装好之后我们看下生成了哪些文件
[[email protected] ~]# rpm -ql httpd
下面是几个比较重要的文件
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
模块目录:
/etc/httpd/modules: 链接文件
/usr/lib64/httpd/modules
主程序:
/usr/sbin/httpd: prefork
/usr/sbin/httpd.event: event
/usr/sbin/httpd.worker: worker
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log: 错误日志
好了下面我们就对主配置文件进行介绍了。
注意:由于该配置文件比较大,找配置的时候不好找,因此多多使用vim的查找功能。
[[email protected] ~]#vim /etc/httpd/conf/httpd.conf
持久连接(又称为长连接)
这里需要解释一下持久连接,持久连接即是在规定的一定时间或者规定的请求数内,客户端向服务器端请求资源时,不必每次都重新经过TCP三次握手建立连接,而是直接请求,这样就大大的节约了时间。但它并非适合所有请求者,对于一些只请求一次或者次数很少的用户,这就变成了占用资源,因此长连接直接影响到了服务器的性能。
Timeout 60
在客户端和服务器端TCP三次握手的时候,当客户端发起请求,服务器端响应请求之后,服务器端等待客户端确认的时间,如果客户端在时间内未确认,则服务器将关闭该次TCP握手。
KeepAlive {On|Off}
持久连接是否启用
MaxKeepAliveRequests 100
服务器单个持久连接最大的请求数,超过即断开
KeepAliveTimeout 15
单个持久连接最大连接时长,超过即断开
MPM参数
这里定义的是httpd的工作模式(注意:只能使用其中一种)
httpd在linux下默认使用prefork, 当然这是我们可以自己定义的。
prefork : httpd使用进程来提供服务,每个进程在同一时间提供一次服务。
worker : httpd在启动的时候,会由root进程派生出几个子进程,每个子进程中会有固定数量的线程,到时候提供服务的,就是这些线程,也就是说一个进程能够同时提供多次服务。
注意,这里面的参数尤其关键,务必要搞清楚每个参数的意义。
<IfModule prefork.c>
StartServers 8 是httpd刚启动时,root进程创建的子进程数
MinSpareServers 5 最少的空闲子进程数
MaxSpareServers 20 最大的空闲子进程数
ServerLimit 256 服务器能接受的最大的并发请求数
MaxClients 256 客户端最大并发请求的数量 显然它必须小于serverlimit
MaxRequestsPerChild 4000 每个子进程最多可以接受的请求数,超过即KILL
</IfModule>
<IfModule worker.c>
StartServers 4 是httpd刚启动时,root进程创建的子进程数
MaxClients 300 客户端最大并发请求的数量
MinSpareThreads 25 最少的空闲线程数
MaxSpareThreads 75 最大的空闲进程数
ThreadsPerChild 25 每个子进程最多可以生成的线程数
MaxRequestsPerChild 0 每个子进程可接受的请求数,0表示任意个
</IfModule>
指定监听的地址和端口
格式:Listen [IP:]PORT IP地址可以省略
端口是可以定义多个的,他并不是唯一的
一般httpd默认监听在80端口
DSO机制装载的模块
DSO即Dynamic Shared Object动态分享对象。
这里定义了系统装载的一些模块,如截图所示,其格式为
LoadModule Module_Name(模块名称) /path/to/Module_File
(模块路径,这里是相对路径,相对于前面定义的目录下,当然也可以使用绝对路径)
如果你想添加模块的话,直接按照格式写在配置文件中即可;
当然,你不想启用的话可以直接通过#进行注释即可,保存后即可生效。
你也可以通过命令查看装载的模块信息
# httpd -D DUMP_MODULES
指定站点根目录
如图,DocumentRoot定义了httpd服务器的站点根目录,你在互联网上访问该服务器时访问的都是该根目录下的内容;当然,路径也是可以自己定义的,默认一般都为/var/www/html
站点路径访问控制
这里的访问控制可以有2种方式:
基于本地文件系统路径:
格式
<Directory "/path/to/somewhere">
</Directory>
基于URL访问路径做访问控制
格式
<Location "/path/to/URL">
</Location>
如下图所示:
这是一个基于本地文件系统的访问控制:这里对里面的一些选项进行介绍
(1) Options
Indexes: 当访问的路径下无默认的主页面,将所有资源以列表形式呈现给用户;
这项比较危险,一般不建议启用;当然如果作为文件服务器让别人下载文件的话可以启用。
FollowSymlinks: 跳跃符号链接,直接相当于访问符号链接指向的文件。
(2) AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能。
(3)Order
Deny为拒绝,allow为允许。
这里可以对IP地址或网络进行控制。
注意:网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
可以通过deny和allow的先后顺序不同来定义白名单和黑名单
例如:
order deny allow
deny 192.168.0.1
这样就定义了一个黑名单,除了192.168.0.1都可以访问
再如:
order allow deny
allow 172.16.0.0/16
这样就定义了个白名单,除了172.16.0.0网段的都不能访问
定义默认的主页面
DirectoryIndex可以定义服务器的默认主页面
这里需要解释的是:当通过互联网访问你的服务器时,访问的是某个路径,而非路径下的文件时,如果该路径下有对应的index.html或者index.html.var文件,则显示为该文件的内容,否则,则会根据站点访问控制里的options选项显示相应的内容。
配置日志功能
这里定义了错误日志以及访问日志,日志的等级,日志的格式等。
ErrorLog "/path/to/error_log" 错误日志路径
LogLevel {debug|info|notice|warn|error|crit|alert|emerg} 日志等级
LogFormat 日志格式
CustomLog "/path/to/access_log" LogFormat_Name 访问日志路径以及日志格式名称
下面是日志格式中一些选项的意义。
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
路径别名
路径别名可以实现URL路径的映射,从而所访问的页面资源不再依赖于站点的根目录。
格式:
Alias /URL/ "/path/to/somewhere/"
设定默认字符集
这里默认的是UTF-8,即8-bit Unicode Transformation Format
CGI脚本
CGI脚本路径别名
脚本的默认存放位置:/var/www/cgi-bin/
在浏览器中的访问格式:http://server/cgi-bin/
虚拟主机
虚拟主机可以分成3类
1、基于端口
2、基于IP
3、基于主机名
注意,使用虚拟的前提:取消主服务器,即注释主服务器的站点根路径指定:DocumentRoot
定义虚拟主机
NameVirtualHost IP:PORT
<VirtualHost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
配置文件语法检查:
httpd -t
service httpd configtest
配置示例:
<VirtualHost 172.16.249.57:80> 第一个和第二个是基于主机名的,第三个是基于端口的 ServerName www.a.org DocumentRoot "/web/a" 需要声明的是这些目录都要先创建起来,并且每个根目录下 </VirtualHost> 都有创建index.html文件,里面分别写上a,b,c <VirtualHost 172.16.249.57:80> ServerName www.b.net DocumentRoot "/web/b" </VirtualHost> <VirtualHost 172.16.249.57:8080> ServerName www.c.gov DocumentRoot "/web/c" </VirtualHost>
测试:elinks
-dump: 获取到页面数据后直接退出进程;
测试结果如下
这节就先讲到这里,后边的配置下节继续讲,谢谢!
Linux 服务篇之——httpd的配置(一)