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)    收藏  举报

导航