经典WEB服务器软件 Httpd
httpd简介
httpd也叫Apache,是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一
httpd特性
a) 虚拟主机
b) 反向代理
c) 负载均衡
d) 丰富的用户认证机制
basic
digest
e) 支持第三方模块
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
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
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
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
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 0 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 <module_name> <module_path>
模块路径:可使用相对路径
相对于ServerRoot指令指向的位置而言;
注意:建议使用service httpd reload重新装载配置文件
8.Directory域属性
Options
Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;
FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;
None: none
All: 所有的都启用;
9.站点路径访问控制
访问控制机制:(1)基于来源地址 (2)基于账号
定义的方式有两种(其实这里唯一不同的是Directory和Location,一个针对目录,一个针对的是URL,里面还是要用Order或基于用户的认证):
方法一:文件系统路径
<Directory "/PATH/TO/SOMEDIR">
...
</Directory>
方法二:URL路径
<Location "/URL">
...
</Location>
例:系统自带的服务状态用的就是
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from www.a.com
</Location>
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段
<Directory "/var/www/html/a/emc/">
Options=None
AuthType=basic
AuthUserFile=/root/.htpasswd
AuthGroupFile=/root/.htgroup
Require vail-user .htpasswd文件中所有用户都能访问
Require user= 这里可以只指定列表中允许的用户
</Directory>
(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.虚拟主机
a).基于IP的虚拟主机
例:
<VirtualHost 192.168.1.2:80>
ServerName www.a.com
DocumentRoot /var/www/html/a/
</VirtualHost>
<VirtualHost 192.168.1.3:80>
ServerName www.b.com
DocmuntRoot /var/www/html/b/
</VirtualHost>
b).基于端口的虚拟主机
例:
<VirtualHost 192.168.1.1:8080>
ServerName www.a.com
DocumentRoot /var/www/html/a/
</VirtualHost>
<VirtualHost 19.168.1.1:81>
ServerName www.b.com
DocumentRoot /var/www/html/b/
</VirtualHost>
c).基于域名的虚拟主机
当使用基于域名的虚拟主机,必须加上NameVirtualHost这行
例:
NameVirtualHost 192.168.1.1:80
<VirtualHost 192.168.1.1:80>
ServerName www.a.com
DocumentRoot /var/www/html/a/
</VirtualHost>
<VirtualHost 193.168.1.1:80>
ServerName www.b.com
DocumnetRoot /var/www/html/b/
</VirtualHost>
11.内置的状态页面
用途:显示httpd的一些状态
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from www.a.com
</Location>
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
<VirtualHost *:80>
DocumentRoot /var/www/html/site1
ServerName www.a.com
ssl.conf中就要这样改:
NameVirtualHost *:443
<VirtualHost *:443>
DocumentRoot /var/www/html/site1
ServerName www.a.com
指定私钥和证书的位置:
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
至此https配置完成