参考 http://groot.blog.51cto.com/11448219/1874759
httpd所具有的特性:
高度模块化设计:core modules + standard modules + 3rd party modules
动态链接库DSO: Dynamic Shared Object(动态共享对象)
多处理模块MPM: multipath process modules (多道处理模块)
prefork:process(进程)多进程模型
每进程响应一个请求; 一个主进程负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个;
worker: thread(线程)多线程模型
每线程响应一个请求;一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程处理一个请求;如果有M个进程,每个进程有N个线程,则可处理的请求个数为:M*N
event: thread(线程)时间驱动模型
每进程响应N请求;一个主进程,生成M个子进程,每个进程直接负责N个请求;可处理的请求个数为:M*N (注:在httpd-2.2版本中event为测试使用,在httpd-2.4中event可生产使用。)
http的功能特性:
CGI:Common Gateway Interface,通用网关接口;
虚拟主机:基于IP,PORT,FQDN的虚拟主机。
反向代理:http, fcgi, wsgi, ajp, ...
负载均衡;
路径别名;
丰富的用户认证机制:如basic和digest;
支持第三方模块;
CentOS7相关命令:
启动服务(等同于service httpd start)
1 |
systemctl start httpd.service |
停止服务(等同于service httpd stop)
1 |
systemctl stop httpd.service |
重启服务(等同于service httpd restart)
1 |
systemctl restart httpd.service |
查看服务是否运行(等同于service httpd status)
1 |
systemctl status httpd.service |
开机自启动服务(等同于chkconfig httpd on)
1 |
systemctl enable httpd.service |
开机时禁用服务(等同于chkconfig httpd on)
1 |
systemctl disable httpd.service |
查看服务是否开机启动 (等同于chkconfig --list)
1 |
systemctl list-units --type=service |
httpd-2.4的基本配置
2、保持连接:
persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源;服务模式是保持连链接的,如何断开?可以从数量和时间连个方面去限制。
定义开关 KeepAlive On|Off
数量限制 MaxKeepAliveRequests 100
时间限制 KeepAliveTimeout 10
3、MPM:多路处理模块
并发请求响应的不同实现,有三种模式(prefork,worker,event)前文已经提到过。
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 :显示所有加载模块,同于-M。
更换支持不同的MPM的主程序:
编辑 /etc/sysconfig/httpd
启动变量:HTTPD
4、DSO:配置指令模块加载
格式:LoadModule <mod_name> <modules/mod_file_name>
模块路径可使用相对路径:
相对于ServerRoot指令的值来说;/etc/httpd/
7、Directory中的访问控制定义
① Options:
Indexes Includes { FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews }
None=none
All:所有的都启用
Indexes(索引):当前访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用
FollowSymLinks:允许跟踪符号链接,如果某页面文件是指向DocumentRoot之外路径上的其他文件时,将直接显示目标文件的内容。
ExecCGI:允许执行CGI脚本
② AllowOverride
httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;
AllowOverride表示是否允许目录中的.htaccess文件中的配置来覆盖当前配置段中的配置;
Options FileInfo AuthConfig Limit
All
None
③基于来源地址的访问控制:
允许所有地址访问:Require all granted
拒绝所有地址访问:Require all denied
<RequireAll>
</RequireAll>
基于IP控制:
Require ip ADDRESS
Require not ip ADDRESS
ADDRESS:
ip
基于主机名控制:
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN
DOMAIN.TLD
14、curl命令
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
--basic 使用HTTP基本认证
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
-X, --request <command>:自定义请求方法
另一个工具:elinks
语法:elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
15、使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
16、https, http over ssl
OpenSSL:
libcrpyto, libssl (ssl/tls), openssl
PKI:
CA,
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书;
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机;
1 |
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename] |
17、httpd自带的应用程序
htpasswd:basic认证基于文件实现,用于生成账号和密码的程序;
htdbm
htdigest
apachectl:httpd自带的服务控制脚本,支持start和stop等子命令;
apxs:- APache eXtenSion tool
为httpd增添模块的;
rotatelogs:
access_log,
access_log, access_log.1, ...
压测工具:
ab:(http自带) - Apache HTTP server benchmarking tool
webbench, httpload, ... 只能做简单评估
loadrunner:既能做压测,又能对软件做测试
jmeter (ASF):开源,既能压测,又能做软件测试需要测试模型
tcpcopy:网易研发
18、ab - web service的压力测试工具
ab [OPTIONS] [http[s]://]hostname[:port]/path
请求数:[ -n requests ]
并发数:[ -c concurrency ]
长连接:[ -k ]
漫谈http(下)
多道处理模块(MPM)
httpd2.X 支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。
prefork:进程模型,两级结构,master/worker, 每worker处理一个请求;
# 多进程模型,每个进程响应一个请求;一个主进程负责生成n个子进程,子进程也为工作进程,每个子进程处理一个用户请求,即没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个
worker:线程模型,三级结构,master/worker/thread,每thread处理一个请求;
#多线程模型,每个线程响应一个请求,一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求;如果有m个进程,每个进程有n个线程,则可处理请求个数为:m*n
event:事件驱动的线程模型,两级结构,master/worker,每worker响应多个请求;
#事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接n个请求;m*n
prefork(默认) |
worker | event | |
工作特性 |
一个进程响应一个请求 | 一个进程产生多个线程,一个线程响应一个请求 | 一个进程产生多个线程,一个线程响应多个请求 |
版本支持 | httpd2.2、httpd2.4 | httpd2.2、httpd2.4 | httpd2.4 |
注:(在httpd-2.2版本中event为测试使用,在httpd-2.4当中event可生产使用。)
在httpd2.2中修改/etc/sysconfig/httpd配置文件可以改变当前服务器所使用的模块。在编译
安装httpd2.4时,构建MPM模块,通常有两种选择,一种是把MPM编译成静态模块,还有一种是把MPM编译成动态模块。如果把MPM编译成了静态模块,那么要改变MPM,只能通过重新编译安装HTTPD修改。
如果在编译安装httpd时,把MPM编译成了动态模块,那么改变MPM,可以在/etc/httpd/httpd.conf配置文件中编辑LoadModule指令选择不同的MPM重新载入即可
在httpd2.4中MPM模块的配置文件为/etc/httpd/extra/httpd-mpm.conf。
httpd2.2只支持prefork和worker模块,所以在其配置文件/etc/httpd/conf/httpd.conf中
<IFModule></IFModule>这个标签表示的是,如果加载了指定的那个模块,则标签内定义的参数生效。
httpd2.2中prefork和worker各参数说明如下:
1 2 3 4 5 6 7 8 |
<IfModule prefork.c> 如果prefork.c模块存在,则定义在标签内的参数有效 StartServers: 服务开启时默认启动的工作进程数,不包括主进程 MinSpareServers: 最少空闲进程数; MaxSpareServers: 最大空闲进程数; ServerLimit: 最大活动进程数; MaxClients: 并发请求的最大数,一条进程最多能处理多少个请求 MaxRequestsPerClient: 每个子进程在生命周期内所能够服务的最多请求个数 </IfModule> |
1 2 3 4 5 6 7 8 |
<IfModule worker.c> 如果worker.c模块存在,则定义在标签内的参数有效 StartServers: 服务器开启时,启动的子进程的个数 MaxClients: 并发请求的最大数; MinSpareThreads:最小空闲线程数; MaxSpareThreads:最大空闲线程数; ThreadsPerChild:每个子进程可生成的线程数; MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定; </IfModule> |
httpd2.4中event参数说明如下:
1 2 3 4 5 6 7 8 |
<IfModule mpm_event_module> StartServers 默认进程数 MinSpareThreads 最小空闲线程数 MaxSpareThreads 最大空闲线程数 ThreadsPerChild 每个子进程可以生成的线程数 MaxRequestWorkers 最大线程数量 MaxConnectionsPerChild 子进程的最大连接数,当达到设置值以后,APACHE就会结束当前的子进程 </IfModule> |
httpd的MPM模块通常用来应对各种生产环境的情况,在生产环境中web服务器的访问量并不是一成不变的,所以有的时候我们可能需要修改相关参数来应对各种访问量,熟悉各个模块的特性及参数配置是很有必要的!
PHP:
xcache配置文件:
/etc/php.d/xcache.ini
[xcache.admin] 管理xcache
xcache.size = 60M xcache的大小
xcache.count = 1 xcache可以使用cpu核心数
xcache.slots = 8K
xcache.ttl = 0 缓存清理时间
xcache.gc_interval = 0
xcache.var_size = 4M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
fpm配置虚拟主机反代配置示例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<VirtualHost *:80> ServerName www.zh.com DocumentRoot "/vhosts/www" <Directory "/vhosts/www"> Options None AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1 ProxyPassMatch ^/(pm-status|ping)$ fcgi://127.0.0.1:9000/$1 DirectoryIndex index.php index.html </VirtualHost> |
http://WEB_SERVER:PORT/pm-status
pool: www # 连接池名称
process manager: dynamic # 进程管理器类型
start time: 26/Sep/2016:15:10:26 +0800 # 启动时间
start since: 7437 # 运行时长
accepted conn: 6 # 连接池已经处理过的总请求数
listen queue: 0 # 队列的长度
max listen queue: 0 # 请求队列的最大长度
listen queue len: 128 # socket等待队列的最大长度;
idle processes: 4 # 空闲的进程数;
active processes: 1 # 活跃的进程数量;
total processes: 5 # 总进程数;
max active processes: 1 # 连接池当中过去最大活跃进程度;
max children reached: 0 # 进程数量达到连接池上限的次数;
slow requests: 0 # 慢请求的数量;
full格式的输出:
pid: 33095
state: Idle # 当前进程的状态,idle, running, ...
start time: 26/Sep/2016:15:10:26 +0800 # 进程启动的日期时间
start since: 7968 # 运行时长
requests: 2 # 处理过的请求数量
request duration: 112 # 请求处理过程的时长
request method: GET # 请求方法
request URI: /pm-status?html # 请求的URL
content length: 0 # 请求内容的长度,POST方法才有意义
user: - # 用户
script: - # php脚本;
last request cpu: 0.00 # 最近一次请求消耗CPU
last request memory: 262144 # 最近一次请求消耗的内存量
注意:
httpd-2.2默认没有自带fcgi模块;php-5.3.3-默认不支持fpm,需要打补丁方可
安装php5:
(1) 作为httpd的模块安装:
1 2 |
# ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make && make install |
注意:如果mpm为线程模型,则需要额外使用--enable-maintainer-zts
(2) 安装为fpm:
1 2 |
# ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --enable-fpm --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make && make install |
复制配置文件:
cp php.ini-production /etc/php.ini
编译php为httpd的模块后,整合php至httpd:
编译httpd.conf,添加:
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1909273,如需转载请自行联系原作者