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)
systemctl start httpd.service
停止服务(等同于service httpd stop)
systemctl stop httpd.service
重启服务(等同于service httpd restart)
systemctl restart httpd.service
查看服务是否运行(等同于service httpd status)
systemctl status httpd.service
开机自启动服务(等同于chkconfig httpd on)
systemctl enable httpd.service
开机时禁用服务(等同于chkconfig httpd on)
systemctl disable httpd.service
查看服务是否开机启动 (等同于chkconfig --list)
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访问相应的主机;
# 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.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各参数说明如下:
<IfModule prefork.c> 如果prefork.c模块存在,则定义在标签内的参数有效
StartServers: 服务开启时默认启动的工作进程数,不包括主进程
MinSpareServers: 最少空闲进程数;
MaxSpareServers: 最大空闲进程数;
ServerLimit: 最大活动进程数;
MaxClients: 并发请求的最大数,一条进程最多能处理多少个请求
MaxRequestsPerClient: 每个子进程在生命周期内所能够服务的最多请求个数
</IfModule>
<IfModule worker.c> 如果worker.c模块存在,则定义在标签内的参数有效
StartServers: 服务器开启时,启动的子进程的个数
MaxClients: 并发请求的最大数;
MinSpareThreads:最小空闲线程数;
MaxSpareThreads:最大空闲线程数;
ThreadsPerChild:每个子进程可生成的线程数;
MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;
httpd2.4中event参数说明如下:
<IfModule mpm_event_module>
StartServers 默认进程数
MinSpareThreads 最小空闲线程数
MaxSpareThreads 最大空闲线程数
ThreadsPerChild 每个子进程可以生成的线程数
MaxRequestWorkers 最大线程数量
MaxConnectionsPerChild 子进程的最大连接数,当达到设置值以后,APACHE就会结束当前的子进程
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:
<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>
<a href="http://blog.51cto.com/pm-status">http://WEB_SERVER:PORT/pm-status</a>
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格式的输出:
<a href="http://s5.51cto.com/wyfs02/M00/8A/77/wKiom1gxPZ_RRK3GAADfS3FwBlY367.png" target="_blank"></a>
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的模块安装:
# ./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:
# ./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/
复制配置文件:
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,如需转载请自行联系原作者