httpd简介
httpd也叫Apache,是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一
httpd特性
虚拟主机
反向代理
负载均衡
丰富的用户认证机制
basic
digest支持第三方模块
httpd的配置文件
/etc/httpd/conf/httpd.conf 主要配置文件
/etc/httpd/conf.d/*.conf 分段配置文件
/etc/sysconfig/httpd MPM模式配置文件
httpd配置文件详解
httpd.conf主要分3个部分
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
注意:配置文件的修改,只要不是改动过IP或端口,只要service httpd reload重新装载就可以
1.主页文件配置 DirectoryIndex
index.html index.html.var 默认主页顺序从左至右
2.程序路径配置
ServerRoot "/etc/httpd"
3.主服务文件路径
DocumentRoot "/var/www/html"
如果开启了虚拟主机,必须把这行注释掉
4.指定监听地址和端口
Listen [IP]80
(1) IP省略时表示监听本机上所有可用的IP地址;
(2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字:
Listen 172.16.100.11:80
Listen 172.16.100.11:8080
5.持久连接
用途:连接建立后,每个资源获取结束不会断开连接,而继续等待其它资源请求并完成传输;如果不启用该项,非持久连接,浏览器获取每一个资源都要建立一个连接,每个资源都是单独通过专用的连接进行获取
KeepAlive=off|on 保持连接打开或关闭
断开条件:
MaxKeepAliveRequests 100 数量限制,保持连接的最大请求数
KeepAliveTimeout 15 时间限制,httpd-2.2使用的是秒,httpd-2.4支持毫秒级
缺点:对并发访问量较大的服务器,开持久连接会有些请求得不到服务;
6.MPM 多路处理模块,并发请求响应的不同实现
httpd里有3种模型:prefork worker event
(1).prefork
多进程模型。每个进程响应一个请求。预先生成多个进程等待响应请求。因为每个进程间是独立的,某个进程的崩溃并不影响
其他进程,所以它的稳定性是最好的。
最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内
存的大小
(2).worker
多进程多线程模型。它可以生成M个进程,然后每个进程再生成N个线程,每个线程响应一个请求,由于线程的开销比进程少,
所以相对节省资源,适用于海量请求
(3).event
事件驱动模型。它不同于以上2种,一个进程可以响应N个请求,2.2版只提供用于测试,2.4版可用于生产环境
各个模型在配置文件中的配置和说明
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
prefork各项解析说明:
工作原理,主控进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers的设置,需要再创建一个进程,等待一秒钟,继续 创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多 达到每秒32个,直到满足 MinSpareServers设置的值为止。
StartServers 8 启动时主进程建立的子进程数
MinSpareServers 5 最少空闲可用的子进程数
MaxSpareServers 20 最大空闲可用的子进程数.如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多
余的子进程
ServerLimit 256 默认是256,20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache
MaxClients 256 最大客户端请求数,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后
面的请求就要排队,直到某个正处理请求的完毕,这个值最大不能超过ServerLimit的值
MaxRequestsPerChild 4000 设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后
将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请
求,但如果设成非零值也有两点重要的好处:◆ 可防止意外的内存泄漏;◆ 在服务器负载下降
的时侯会自动减少子进程数
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
worker各项解析说明:
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再临时生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程 中的线程总数不能满足负载,控制进程将派生新的子进程。
ServerLimit 16 worker下默认子进程数为16
StartServers 4 开启时启动4个子进程,官方配置很奇怪,默认启动4个,4x25=100个线程,超出
下面75个,又自动杀掉了25个
MaxClients 300 这里的最大用户请求数=ServerLimit*ThreadsPerChild
MinSpareThreads 25 最小的线程数
MaxSpareThreads 75 最大的线程数
ThreadsPerChild 25 每个进程生成的线程数
MaxRequestsPerChild 4000 设置的是每个子进程可处理的请求数。每个子进程在处理
了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不
销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有
两点重要的好处:◆ 可防止意外的内存泄漏;◆ 在服务器负载下降的时侯会自
动减少子进程数
httpd-2.2 不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持;
确认方法:
# ps aux | grep httpd
默认为/usr/sbin/httpd,其为prefork;
查看模块列表:
httpd -l: 查看静态编译的模块
httpd -M: 查看所有模块,包括静态编译和DSO模块
httpd -t -D DUMP_MODULES
各模式之间的切换:
控制文件在/etc/sysconfig/httpd,默认是prefork模式
找到注释的#HTTPD=/usr/sbin/httpd.worker,只要取消注释就可以改为对应的模式
例如改为event的话是HTTPD=/usr/sbin/httpd.event
7.DSO 指令模块加载
LoadModule
模块路径:可使用相对路径
相对于ServerRoot指令指向的位置而言;
注意:建议使用service httpd reload重新装载配置文件
8.Directory域属性
Options
Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列
表呈现给用户;非常危险,不建议使用;
FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;
None: none
All: 所有的都启用;
注意:
(1)FollowSymLinks表示允许在此目录使用符号连接。这是一种什么概念呢,比如/va/ftp/data是你存ftp上传数据的地方,而
web目录是/var/www/perfgeeks,假定你想通过http://www.yuzhenhai.com/ftp访问/var/ftp/data目录的数据,你可以在/var/www/perfgeeks目录下建立一个符号连接ftp指向/var/ftp/data。而FollowSymLinks就是指明这种操作是允许的,指示Apache不必去检查ftp文件是否为链接。另外SymLinksIfOwnerMatch则要求和符号连接与其指向的目录或文件属主是同一人(相同的uid)才允许上述操作,即/var/www/perfgeeks/ftp与/var/ftp/data拥有者的uid要求是一样的,这样Apache就必须通过请求系统内核调用stat()来检查文件名每一个组成部分是否为链接,如果是链接就要去核实是否与链接指向的原文件具有相同的uid。我们推荐设置FollowSymLinks,而不要设置SymLinksIfOwnerMatch,这样可以获取更高的性能。因为,假定没有设置FollowSymLinks或者一旦设置了SymLinksIfOwnerMatch,则会额外地调用系统内核函数lstat()来验证目录是否为符号连接。而且是验证文件的每一个组成部分
(2)禁止显示Apache目录列表的方法
在Options Indexes FollowSymLinks在Indexes前面加上 – 符号。
即: Options -Indexes FollowSymLinks
(在Indexes前,加 + 代表允许目录浏览;加 – 代表禁止目录浏览)
如果是在虚拟主机中,只要增加如下信息就行:
Options -Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
这样的话就禁止在test工程下进行目录浏览。
还有一种方法:
可以在根目录的 .htaccess 文件中输入
Options -Indexes
就可以阻止Apache 将目录结构列表出来。
9.站点路径访问控制
访问控制机制:(1)基于来源地址 (2)基于账号
定义的方式有两种(其实这里唯一不同的是Directory和Location,一个针对目录,一个针对的是URL,里面还是要用
Order或基于用户的认证):
方法一:文件系统路径
...
方法二:URL路径
...
例:系统自带的服务状态用的就是
SetHandler server-status
Order deny,allow
Deny from all
Allow from
a).基于来源地址的访问控制
Order: 检查次序
Order Allow,Deny:先检查allow语句,再检查deny语句,以后面的为准!
Order Deny,Allow: 先检查deny语句,再检查allow语句,以后面的为准!总之原则就是如有冲突,以后面
的语句为准
Allow from:允许访问的来源地址
Deny from:拒绝访问的来源地址
(注意:Order语句必须放在Directory里面)
from后可跟上的地址格式:
IP地址;
网络地址:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
例:
如果要禁止部分内容的访问,其他的全部开放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2
apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在
order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止
了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:
Order Deny,Allow
Allow from all
Deny from domain.org
错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配
成功,根本就不会去看第三句。
解决方法:Order Allow,Deny,后面两句不动,即可。
Order Allow,Deny
Allow from ip1
Deny from all
错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三
句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
解决方法一:直接去掉第三句。
解决方法二:
Order Deny,Allow
Deny from all
Allow from ip1
b).基于用户的访问认证控制
有两类:a) basic b) digest
质询:
WWW-Authenticate: 服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码;弹出对话框;
认证:
Authorization:客户端用户填入账号密码后再次发请求至服务器;认证通过,则请求授权;
以下说明basic的应用
(1)在相应的主机配置段,针对要受控的目录加入对应的Directory段
Options=None
AuthType=basic
AuthUserFile=/root/.htpasswd
AuthGroupFile=/root/.htgroup
Require vail-user .htpasswd文件中所有用户都能访问
Require user= 只允许AuthUserFile中出现的用户访问
(2)密码文件.htpasswd和组文件.htgroup的生成
使用htpasswd工具生成密码文件(这里的用户是虚拟用户,和系统用户无关)
语法:htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
-c 生成密码文件,首次添加用户时使用,会一并生成密码文件
-m 使用MD5加密密码
-s 使用sha1加密密码
-D 删除用户
例:
htpasswd -c -m .htpasswd aa 第一次加用户和生成密码文件
htpasswd -m .htpasswd bb 后续用户添加
htpasswd -D .htpasswd bb 删除用户
组文件.htgroup的生成:
用vim直接编辑生成,里面内容格式:用户组:用户名(第一个用户名前面貌似要有空格)
10.虚拟主机
一个物理服务器可以服务于多个站点,每个站点可通过一个或多个虚拟机来实现
httpd三种类型的虚拟主机:
基于IP
基于PORT
基于FQDN(最常用)
注意:启用虚拟主机得先关闭“main” server,注释DocumentRoot指令即可
# 经测试不关闭也可以,但如果80端口被虚拟主机占用了,那么想要"main server"只要指定另一个监听了的,没
被虚拟主机占用的端口即可
定义虚拟主机的方法:
ServerName (不基于主机名做虚拟主机时可不写)
ServerAlias(可不写)
DocumentRoot (一定要写)
Options
注意:大多数可用全局或‘main’server中的指令,都可以定义有Virtualhost中
a).基于IP的虚拟主机
例:
DocumentRoot /var/www/html/a/
DocmuntRoot /var/www/html/b/
b).基于端口(PORT)的虚拟主机
例:
DocumentRoot /var/www/html/a/
DocumentRoot /var/www/html/b/
c).基于域名(FQDN)的虚拟主机
当使用基于域名的虚拟主机,必须加上NameVirtualHost这行
例:
NameVirtualHost 192.168.1.1:80
ServerName
DocumentRoot /var/www/html/a/
ServerName
DocumnetRoot /var/www/html/b/
11.内置的状态页面
用途:显示httpd的一些状态
SetHandler server-status
Order deny,allow
Deny from all
Allow from
12.日志功能
/var/log/httpd/
access.log:访问日志
error.log:错误日志
(1)错误日志:
Errorlog logs/error_log
Loglevel warn
(2)访问日志:要自定义日志格式
Customlog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
combined 为此格式名称,方面后面可直接调用
%h:客户端地址
%l:客户端用户通过identd登录时使用的名称,一般为-(空)
%u:用户认证登录的名字,无登录机制一般-
%t:收到客户端请求时的时间
\":显示引号本身,而不作为引用符号
%r:请求报文首行
%>s:响应状态状态码
%b:响应报文的大小,单位为字节,不包含首部信息
%{Refer}i:记录Http首部Referer对应的值:即访问入口,从哪个页面跳转至此页面 “-”表示直接访问
%{User-Agent}i:记录http首部User-Aget对应的值,即浏览器类型
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html
13.路径别名
Alias /URL/ "/path/to/some_directory/"
例如:Alias /bbs/ "/web/bbs/htdocs/"
就跟FTP的虚拟目录一样的咯
注意:前面的目录最后加“/",后面的目录也一定要加,前面不加,后面的也一定不要加,要保持一致
14.设定默认字符集
AddDefaultCharset UTF-8
常用字符集:GBK,GB2312,GBK18030
15.CGI脚本路径别名
CGI:Common Gateway Interface 通过网关接口协议
使WEB可以跟一个应用程序进行通信,从通信环境中获得结果
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
URL-->FileSystem Directory
CGI是不安全的,现在web站点一般都不用,很早以前mail服务可能还会使用,实现起来简便
在第一行写入
echo “Content-Type:text/html:
实现该功能的模块:
mod_alias
mod_cgi
ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行,也可以在目录中实现
格式一般为:
cat << EOF
Content-Type:text/html
The time is : `date`.
EOF
https配置
实验环境说明:dns1.dx.com -> httpd 服务器 IP:192.168.255.201 简称dns1
dns2.dx.com -> 自建CA IP:192.168.255.200 简称dns2
1.dns2自建CA及安装openssl
a) 安装openssl:
yum -y install openssl
b) 先查看/etc/pki/tls/openssl.cnf,确定私钥和证书正确的名称和存放位置
dir = /etc/pki/CA
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
c) 生成私钥:(进去子shell设置好umask后再生成,不会影响当前umask,私钥权限是600)
(umask 077;openssl genrsa -out /etc/pki/tls/private/cakey.pem 2048 )
d) 生成自签证书:
openssl req -new -x509 -key /etc/pki/tls/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
2.dns1安装openssl
yum -y install openssl
3.dns1生成私钥和csr证书请求文件
mkdir /etc/httpd/ssl 用这个目录存放私钥和证书文件
openssl genrsa -out /etc/httpd/ssl/httpd.key 2048
(umask 077;openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr) 同样在子shell中生成
4.传送证书请求文件给dns2生成证书及回传给dns1
scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp
dns2生成dns1的证书文件:
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
回传证书文件:
scp /tmp/httpd.crt [email protected]:/etc/httpd/ssl
注意:如果提示WARING:REMOTE HOST IDENTIFICATION HAS CHANGED(目标主机的验证码已经发生改变,因为第一次访问时会记录
该主机的特征码)
这时候只要把本机当前用户的home/username/.ssl/known_hosts文件内容全部删掉,或里面对应主机的内容清掉就可以了
5.dns1安装mod_ssl模块及配置
a) 安装mod_ssl
yum -y install mod_ssl
b) 修改ssl.conf配置文件
安装mod_ssl后,会在/etc/httpd/conf.d/ssl.conf
vim /etc/httpd/conf.d/ssl.conf,文件会默认生成一个虚拟主机,编辑为和自己虚拟主机一样的设置。这里要注意!如果有
多个虚拟主机,https只能使用其中的一个!
例:
httpd.conf中虚拟主机的配置:
NameVirtualHost *:80
DocumentRoot /var/www/html/site1
ServerName
ssl.conf中就要这样改:
NameVirtualHost *:443
DocumentRoot /var/www/html/site1
ServerName
指定私钥和证书的位置:
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
至此https配置完成