httpd服务全面解析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

参考 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的功能特性:    

  1. CGI:Common Gateway Interface,通用网关接口;

  2. 虚拟主机:基于IP,PORT,FQDN的虚拟主机。

  3. 反向代理:http, fcgi, wsgi, ajp, ...

  4. 负载均衡;

  5. 路径别名;

  6. 丰富的用户认证机制:如basic和digest;

  7. 支持第三方模块;


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中

bubuko.com,布布扣bubuko.com,布布扣

<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

wKiom1gxP5LA5v3-AAAi51vdszA432.png

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格式的输出:

wKiom1gxPZ_RRK3GAADfS3FwBlY367.png

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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
73 3
|
26天前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
27天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
3月前
|
自然语言处理 数据可视化 BI
文档解析(大模型版)服务体验评测
体验文档解析(大模型版)服务时,清晰的入门指南、操作手册和FAQ至关重要。若存在不足,需增加直观的操作流程说明(如动画演示)、深化高级功能文档,并提供实时在线支持,帮助用户快速解决问题。
|
3月前
|
弹性计算 自然语言处理 数据可视化
|
2月前
|
网络安全 Docker 容器
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
28 0
|
2月前
|
存储 缓存 网络协议
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
135 0
|
3月前
|
存储 消息中间件 算法
深入解析OpenStack Cinder:块存储服务详解
本文介绍了OpenStack及其块存储服务Cinder。OpenStack是一个开源云计算管理平台,提供基础设施即服务(IaaS),核心服务包括计算、网络、存储等。Cinder主要用于为虚拟机提供持久性块存储,具备多种功能,如卷操作、备份、快照及与实例的交互等。此外,还详细介绍了Cinder的工作流程、命令行操作及不同存储插件的使用。
460 8
|
3月前
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
243 2
|
4月前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
80 0

推荐镜像

更多
下一篇
无影云桌面