6、apache(一):httpd2.2配置
一、httpd特性
httpd(即apache)的特性:
- 高度模块化: 核心模块, core和modules
- 模块支持动态加载
- 多路处理模块MPM:Mutipath Processing Modules
支持多路处理模型,有三种工作方式:
prefork:多进程模型:当服务启动以后,启动一个主进程,这个主进程预先生成n个子进程。主进程监听请求,当有请求到来时,将请求交给子进程处理,每个子进程处理一个请求;子进程处理完请求后,通知主进程。最大不会超过1024个子进程。
worker:多线程模型,复用的I/O:一个主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求。当服务启动以后,启动一个主进程,预先生成多个子进程,子进程预先生成多个线程,同prefork一样。m进程 * n 线程 = 总的可请求数量。
event:事件驱动模型,复用的I/O:一个主进程,生成多个子进程,每个进程使用异步、回调的方式响应多个请求。m进程 * n请求 = 总的可请求数量。
httpd的功能特性:
- 虚拟主机:IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic、digest
- 支持第三方模块
在中小网站中,apache使用非常广泛。但在大规模并发网站中,由于apache的并发性不能满足。
并发服务器响应请求的模型:
- 单进程I/O模型
- 多进程I/O模型
- 复用的I/O模型:分为多线程模型和事件驱动模型。
- 利用的多进程I/O模型
二、httpd安装环境
1.检查httpd程序:
linux一般自带httpd,但可能版本较低。
安装地址: http://httpd.apache.org
安装方式:rpm包、源码编译安装
检查是否在centos安装了httpd:
rpm -q httpd
查看某程序安装后的生成的程序文件:
rpm -ql httpd
查看某程序安装后的生成的配置文件:
rpm -qc httpd
2.httpd-2.2的程序环境:
主配置文件:/etc/httpd/conf/httpd.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
错误提示页面:/var/www/error/*
httpd是守护进程,它的服务脚本:
/etc/rc.d/init.d/httpd
服务脚本的配置文件:/etc/sysconfig/httpd
主程序文件:
- /usr/sbin/httpd ,prefork模型
- /usr/sbin/httpd.event
- /usr/sbin/httpd.worker
httpd模型的切换,即主程序的切换,在服务脚本中配置:/etc/sysconfig/httpd
日志文件:在日志文件目录:/var/log/httpd下
- access_log:访问日志
- error_log:错误日志
站点文档目录:/var/www/html
三、httpd-2.2基本配置
主配置文件httpd.conf的组成:
# grep "Section" /etc/httpd/conf/httpd.conf
Section 1:Global Enviroment 全局环境
Section 2:Main server configuration 主服务器配置
Section 3:Virtual Hosts虚拟主机配置。当需要配置多个站点时,使用此方式;通过Section2和Section3不同时使用。
备份原始的httpd.conf:
cp httpd.conf {,.bak}
常用配置:
1、监听的IP和Port:Listen [IP:]80
# 查看httpd状态
service httpd status
# 启动httpd
service httpd start
# 查看系统已监听的端口
ss -tnl
如果IP省略,则监听本机的所有IP地址。可以同时监听多个端口,即Listen可以配置多次。
Listen 80 Listen 192.168.1.10:8080
2、持久连接:
Persistent Connection长连接 : KeepAlive On|Off
当 KeepAlive On时,如何控制连接?
数量限制:MaxKeepAliveRequests 100
时间限制:KeepAliveTimeout 60s,并发较大的场景,此值要设置小点,如2s;
副作用:对并发访问量较大的服务器,持久连接可能会使有些请求得不到响应,一般关掉长连接。
折衷:使用较短的持久连接时间。httpd2.4支持毫秒级。
当 KeepAlive Off时,数量限制和时间限制不起作用。
测试长久连接:
service httpd reload telnet 192.168.10.10 80 GET / HTTP/1.1 # GET后的/是请求的路径 Host: 192.168.10.10
3.多路处理模块MPM:默认为/usr/sbin/httpd,即prefork模型
httpd-2.2不支持同时编译多个MPM模块,所以只能在编译时选定一个。httpd-2.4支持在编译时,同时编译多个MPM模块。
查看当前使用的MPM模块
ps aux |grep httpd
perfork的配置:
StartServers 8 :服务启动时,启动多少个(子)进程
MinSpareServers:最小空闲进程数
MaxSpareServers:最大空闲进程数
ServerLimit 256: 一般等于MaxClients,不可小于。在服务生命周期内,为MaxClients准备的最大请求数。
MaxClients 256:最大的客户端请求数
MaxRequestsPerChild 4000:一个服务子进程,最多可以响应多少次请求。0表示,不作限制。
worker的配置:
StartServers 8 :服务启动时,启动多少个(子)进程
MinSpareThreads 25:最小空闲线程数
MaxSpareThreads 75:最大空闲线程数
MaxClients 300: 最大的客户端请求数
ThreadsPerChild 25:每个(子)进程启动多少个线程
MaxRequestsPerChild 4000:一个服务子进程,最多可以响应多少次请求。0表示,不作限制。
PV:Page View,有效页面访问量
UV:User View,用户访问量 。独立IP量。
假如某站,每秒的并发量是300,一整天都的被访问,则访问量为300*86400。假设平均每个页面需要请求100个资源,即100个请求。则日PV为:300 * 86400 / 100
4.DSO机制,动态装载机制。
模块文件路径 :/usr/lib64/moduls/*
配置指令实现模块加载:
LoadModule mod_name mod_path # 模块路径可使用相对地址 # 相对于ServerRoot(/etc/httpd)指向的路径 而言:/etc/httpd/modules/ # 查看已经动态装载的模块 rqm -M httpd
5.Main server主文档页面路径。
DocumentRoot,文档根路径 ,所指向的路径,为ULR路径的起始位置。默认为/var/www/html
6.站点访问控制:
两种类型的路径:
- 文件系统路径,在具体的路径下做配置,如第7点 :
- <Directory ""> </Directory>
- <File ""> </File>
- <FileMatch ""> </FileMath>
- ULR路径 :
- <Location ""> </Location>
两种访问控制机制:
- 基于来源地址:
- 基于帐号 :
7.Directory中,基于来源地址实现访问控制。
(1) Options选项:Indexes, Includes,FollowSymLinks,SymLinksOwnerMatch,ExecCGI,MultiViews,None,All
- Indexes:索引:既有用,也很危险。当用户没有指明访问路径时,将使用索引中指定的页面;但是如果允许了索引,又没有指明索引或者被人改了索引文件,将可能泄露网站所有资源。
- FollowSymLinks:允许跟踪符号链接文件
- None:所有都不允许
- All:允许所有
- SymLinksOwnerMatch:如果符号的属主信息与链接文件的属主信息相同,则允许跟踪符号链接文件。
- MultiViews:危险功能,一般不开启。
(2) 基于来源地址的访问控制
- Order:检查次序,如Order allow,deny,先检查白名单,再检查黑名单。Order deny,allow为默认机制。
- Allow from:白名单的来源地址
- Deny from:黑名单的来源地址
来源地址:
- IP
- NetAddr:如172.16,如172.16.0.0,如172.16.0.0/16,如172.16.16.0.0/255.255.0.0,这四种写法都是允许的,是一样的效果。
8.基于帐号的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码。
认证:
Authorization:客户端填入帐号密码后,再次发送请求报文。认证通过,则服务器发送响应资源。
认证类型:
basic:明文认证
digest:消息摘要
安全域:需要用户认证后方能访问的路径。应该通过名称对其进行标识,并用于告知用户认证的原因。
虚拟帐号:仅用于访问某服务时用到的认证标识。它可存储在文本文件,数据库,ldap,nis等。
basic认证过程:
以上认证质询、认证属于http协议的认证方式。
通常,不使用http协议的认证方式,会自己编写程序,通过表单提交。
9.定义默认主页面
DirectoryIndex index.html index.html.var
10.日志设定:
错误日志:
- 日志级别LogLevel :可选项debug,info,notice,warn,error,crit,alert,emerg
- 错误日志:logs/error_log
访问日志:
- CustomLog: logs/access_log combined 日志格式:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" " combined
- %h:客户端IP地址
- %l:Remote logname(from identd,if supplied),"-"表示为空
- %u:Remote user,登录的用户,"-"表示为空
- %t:服务器收到请求的时间
- %r:请求报文的首行信息(请求方法method,URL,协议版本version)
- %>s:响应状态信息的最后的数字,即响应状态码。
- %b:响应报文主体部分的大小,单位是字节。
- %{Referer}i:请求报文中"referer"首部的值。即当前资源的访问入口,从哪个页面中的超链接跳转而来
- %{User-Agent}i:请求报文中"User-Agent"首部的值。即发出请求用到的应用程序。
- \":对"进行转义
11.路径 别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
如,Alias /bbs/ "/forum/htdocs",访问/bbs/路径时,实际访问的是/forum/htdocs
12.设定默认字符集
AddDefaultCharset UTF-8
13.虚拟主机
虚拟主机的目的,一个主机提供多个站点。或为一个站点,提供多个域名。
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址,实践中很少使用
基于port:为每个虚拟主机准备至少一个专用port,实践中很少使用
基于hostname:为每个虚拟主机准备至少一个专用hostname主机名,通常用的实现方式。
注意:虚拟主机,莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机。
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT"> ServerName DocumentRoot </VirtuaHost> ServerAlias:虚拟主机的别名 ErrorLog CustomLog <Directory ""> </Directory>
示例1,基于IP配置虚拟主机
#注释掉中心主机 # DocumentRoot......... #虚拟主机1 <VirtualHost 172.16.100.6:80> ServerName web1.magedu.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> #虚拟主机2 <VirtualHost 172.16.100.10:80> ServerName web2.magedu.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost>
Listen 80
测试配置中的语法是否有错误
service httpd configtest
# 或者
httpd -t
创建站点源码的存放位置:
mkdir -pv /vhosts/{web1, web2, web3, web4}/htdocs
重新加载httpd配置
service httpd reload
示例2,基于端口配置虚拟主机
#注释掉中心主机 # DocumentRoot......... #虚拟主机1 <VirtualHost 172.16.100.5:80> ServerName web3.magedu.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost> #虚拟主机2 <VirtualHost 172.16.100.5:8080> ServerName web4.magedu.com DocumentRoot "/vhosts/web4/htdocs" </VirtualHost>
Listen 80
Listen 8080
示例3,基于主机名配置虚拟主机 :使用相同的IP和端口名,仅主机名不同。
# httpd2.2需要启用NameVirtualHost,httpd2.4不需要 NameVirtualHost 172.16.100.3:80 #注释掉中心主机 # DocumentRoot......... #虚拟主机1 <VirtualHost 172.16.100.3:80> ServerName web5.magedu.com DocumentRoot "/vhosts/web5/htdocs" </VirtualHost> #虚拟主机2 <VirtualHost 172.16.100.3:80> ServerName web6.magedu.com DocumentRoot "/vhosts/web6/htdocs" </VirtualHost> Listen 80
基于IP、基于端口名、基于主机名配置虚拟主机,可以混合使用。
每个虚拟主机,都可以单独配置其它选项,如日志、访问控制、默认页面等等。
14.内置的status页面
<location /server-status> SetHandler server-status Order deny,allow Deny from all #黑名单 Allow from .example.com #白名单 </location>
location可以全局位置配置,也可以在虚拟主机中配置。在不同的地方配置,起作用的域则不一样。其它配置同样如此。
如果需要更详细的状态信息,打开扩展配置即可。
总结,http的配置:
- Listen [IP:]PORT
- KeepAlived {On|Off}。当为On时,可以设置MaxKeepAliveRequests和KeepAliveTimeout
- MPM:prefork,worker,event
- OSO:LoadModule ............。查看已装载的模块:httpd -M
- DocumentRoot:
- Directory:基于路径的访问控制
<Directory "..."> Options Indexes FollowSymLinks Order ... Allow from ... Deny from.... </Directory>
- Location:
- DirectoryIndex:默认主页面
- ErrorLog:错误日志
- CustomLog:访问日志。定义访问日志时,需要指明日志格式:LogFormat "........"
- Alias /URL/ "/path/to/somedir/":路径别名
- 默认字符集:AddDefaultCharset UTF-8
- 基于用户访问控制:这里用的是http协议的认证方式,即basic或digest,basic更常用。通常,应该使用app代码通过表单来认证,更安全。
- 虚拟主机:基于IP、PORT、FQDN主机名实现。
四、httpd-2.2优化配置
16.使用mod_deflate模块压缩页面优化传输速度
使用场景:节约带宽、但额外消耗cpu,同时有些老浏览器不支持;可适用于压缩的资源,如文本文件
# 设置压缩过滤器 SetOutputFilter DEFLATE # 压缩的MIME类型 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript #压缩级别 DeflateCompressionLevel 9 #浏览器匹配,匹配的则压缩 BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17.https: http over ssl
ssl协议版本v3,tsl协议版本v1
示例,参数 前章,使用openssl创建CA证书、颁发证书:
1.在CA服务器上,创建私有CA
# 1.创建 私有CA # cd /etc/pki/CA # (umask 077; openssl genrsa -out private/cakey.pem 2048) # ll private # 2.创建serial文件 echo 01 > serial # 3.创建自签证书 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300 # 输入国家:CN,省:Beijing,市:Beijing,组强/公司名称:Baidu Ltd ,部门:xxx,服务器主机名称:ca.baidu.com
2.在httpd服务器上,申请证书
# 1.在httpd服务器上,生成证书 # cd /etc/httpd # mkdir ssl # cd ssl # (umask 077; openssl genrsa -out httpd.key 1024) # 2.从以上证书中,提取出证书,作为请求证书 # openssl req -new -key httpd.key -out httpd.csr #输入相同的国家、省、市、组织名称;及部门名、服务器主机名
3.请求者,将请求证书,发送给CA服务器
scp httpd.csr root@172.16.100.9:/tmp/
4.CA服务器收到证书后,颁发证书。应该存放在证书存取库
# openssl ca -in /tmp/httpd.csr -out certs/web1.magedu.com.crt -days 365 #是否签发证书:y,y
5.CA将证书发送给httpd服务器
scp certs/web1.magedu.com.crt 172.16.100.6:/etc/httpd/ssl/
6.在httpd服务器上,查看httpd程序中是否包含有mod_ssl的模块
# 查看httpd程序包中,是否有ssl模块 httpd -M |grep ssl # 如果httpd软件中,没有包括mod_ssl子模块,需要安装 yum install mod_ssl -y httpd -M |grep ssl #查看mod_ssl安装后,生成的程序文件 rpm -ql mod_ssl
7.配置ssl.conf
# cd /etc/httpd/conf.d # cp ssl.conf{,.bak} # vim ssl.conf DocumentRoot "/vhosts/web1/htdocs" ServerName web1.magedu.com:443 <VirtualHost _default_:443> # 这里只一个IP,因此也可以使用*:443 SSLCertificateFile /etc/httpd/ssl/web1.magedu.com.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key </VirtuaHost> # 其它配置,基本不需要改变
8.测试基于https访问相应的主机: openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
openssl s_client -connect 172.16.100.6:443 -CAfile /etc/pki/CA/cacertp.pem
9.在客户端上,安装CA证书。
复制CA的证书cacert.pem,改成cacert.crt,安装之。
或者,在浏览器提示的地方,安装 证书。
18.httpd自带的工具程序
19.压力测试工具
简单压力测试工具:ab,webbench,http_load,命令行工具。
专业测试工具:jmeter、loadrunner,强大的压力测试工具,也可进行功能测试。但是很麻烦,需要配置测试环境。
tcpcopy:网易的压力测试工具。可以将某站的所有访问流量,copy到文件中保存,然后到新的服务器模拟一样的测试。
示例:
ab -c 100 -n 10000 http://127.16.100.6/test.html #假如没有安装ab ,则 yum -install ab
五、curl命令
示例:
curl -A 'ie11' http://www.baidu.com curl -e "http://www.google.com/search" http://ww.baidu.com curl -I http://www.magedu.com # http认证 curl -u aiezu:password http://www.aiezu.com #用户名密码认证 curl -E mycert.pem https://www.baidu.com #采用证书认证 curl -c /tmp/cookies http://www.baidu.com #cookies保存到/tmp/cookies文件 curl -b "key1=val1;key2=val2;" http://www.baidu.com #发送cookies文本 curl -d "name=value&name2=value2" http://www.baidu.com #post数据 curl -d a=b&c=d&txt@/tmp/txt http://www.baidu.com #post文件 curl -F file=@/tmp/me.txt http://www.aiezu.com # 设置http请求头信息: curl -H "Connection:keep-alive \n User-Agent: Mozilla/5.0" http://www.baidu.com # 设置http响应头处理: curl -I http://www.aiezu.com #仅仅返回header curl -D /tmp/header http://www.aiezu.com #将http header保存到/tmp/header文件
posted on 2019-02-28 21:05 myworldworld 阅读(401) 评论(0) 收藏 举报