Linux下Apache应用和优化 - Go语言中文社区

Linux下Apache应用和优化


一、编译安装 Apache Httpd

httpd 下载地址:http://httpd.apache.org/download.cgi

1.1 安装包 gcc

yum install gcc -y           
yum install gcc-c++ -y       

1.2 安装包 expat 

CentOS:

yum install expat-devel

Ubuntu:

apt-get install libexpat1-dev

1.3 安装包 apr 和 apr-util

下载地址:http://apr.apache.org/download.cgi

1)编译安装 apr
./configure
make && make install
2)编译安装 apr-util
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install

1.4 安装包 prce 和 prce-devel

1)编译安装 pcre

下载地址:https://www.pcre.org/

./configure
make && make install
2)安装 prce-devel
yum install pcre-devel -y

1.5 安装 Apache Httpd Server

1)将 apr 和 apr-util 解压到 httpd-2.4.33/srclib/ 目录下(去掉版本号)
cp -rf ~/downlaods/apr-1.6.3 ~/downloads/httpd-2.4.33/srclib/apr
cp -rf ~/downloads/apr-util-1.6.1 ~/downloads/httpd-2.4.33/srclib/apr-util
2)编译安装
./configure --prefix=/usr/local/httpd --with-included-apr
make && make install
3)运行
/usr/local/httpd/bin/apachectl start

如果启动 /usr/local/httpd/bin/apachectl,默认使用的配置文件为:/usr/local/httpd/conf/httpd.conf,或者使用 -f 指定配置文件

如果启动 /usr/local/httpd/bin/httpd,默认使用的配置文件为:/etc/httpd/conf/httpd.conf

二、工作模式(MPM)

Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同的特性,或可能以不同的方式实现相同的特性最有效率。Apache httpd 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。

2.1 默认 MPM

Netwarempm_netware
OS/2mpmt_os2
Unixpreforkworker, or event (取决于平台特性)
Windowsmpm_winnt

linux 系统下,默认 MPM 取决于2个问题(引用官网):

1. Does the system support threads?

2. Does the system support thread-safe polling (Specifically, the kqueue and epoll functions)?

If the answer to both questions is 'yes', the default MPM is event.

If The answer to #1 is 'yes', but the answer to #2 is 'no', the default will be worker.

If the answer to both questions is 'no', then the default MPM will be prefork.

In practical terms, this means that the default will almost always be event, as all modern operating systems support these two features.

2.2 MPM 静态模块

在全部平台中,MPM 都可以构建为静态模块。在构建(编译)时选择一种 MPM,链接到服务器中。如果要改变 MPM,必须重新构建。

1)查看工作模式

编译完成后,可以使用 ./httpd -l 来确定选择的 MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。

/usr/local/httpd/bin/httpd -l
2)指定工作模式

在执行 configure 脚本时,使用参数 --with-mpm=NAME。NAME 是指定的 MPM 名称。

./configure --prefix=/usr/local/httpd --with-included-apr --with-mpm=prefork
3)开启 MPM 配置文件

修改 httpd.conf,开启下面这一行:

Include conf/extra/httpd-mpm.conf

2.3 Linux 下的三种工作模式

1)prefork

apache 2.2 默认的模式,没有线程的概念,是多进程模型,一个进程处理一个连接,稳定,响应快。因此单个请求的问题不会影响任何其他请求。

其缺点是一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

一个单独的控制过程负责启动子进程,这些进程监听连接并在到达时为它们服务。该模式下 httpd 总是维护几个备用或空闲的服务器进程,它们随时准备服务传入的请求。

参数说明:

  • ServerLimit:默认的 MaxRequestWorkers 参数最大为256,如果要继续增大这个值,就需要加入 ServerLimit 该参数,20000是这个参数的最大值。
  • StartServers:初始创建子进程数
  • MinSpareServers:最小空闲子进程数,如果当前空闲子进程数小于这个值,Apache 将以最大每秒一个的速度产生新的子进程
  • MaxSpareServers:最大空闲子进程数,如果当前空闲子进程数大于这个值,Apache 会自动干掉多余进程。如果你将该参数的值设置为比 MinSpareServers 小,Apache 将会自动将其修改成 MinSpareServers+1
  • MaxRequestWorkers(apache2.3.1之前叫 MaxClients):限定同一时间最大接收的请求数,默认为256,要增大这个值,需要同时增大 ServerLimit 参数。这个值需要根据服务器配置和压力测试进行调整,需要保证连接数最大时服务器不会因内存耗光而死机
  • MaxConnectionsPerChild(apache2.3.9之前叫 MaxRequestsPerChild ):每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束并释放内存。如果设置为0,子进程将永远不会结束

MaxConnectionsPerChild 参数建议设置为非零,原因:

  1. 能够防止(偶然的)内存泄漏无限进行,从而耗尽内存而死机
  2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)
2)worker

多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。这种模式下开销更小,处理的请求更海量。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发,高流量的场景下会比 prefork 有更多可用的线程,表现会更优秀一些。

其缺点是如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在)。

参数说明:

  • StartServers:服务器启动时建立的子进程数量
  • MinSpareThreads:空闲子进程的最小数量
  • MaxSpareThreads:空闲子进程的最大数量
  • ServerLimit:系统配置的最大进程数量,20000是这个参数的最大值
  • MaxRequestWorkers:限定服务器同一时间内客户端最大接入的请求数量,超过将排队等待
  • ThreadsPerChild:每个子进程产生的线程数量,要增大这个值,需要同时增大 ServerLimit 参数  
  • ThreadLimit:限制每个子进程最多生成多少个线程
  • MaxConnectionsPerChild:每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束并释放内存。如果设置为0,子进程将永远不会结束

Worker模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定的,应该大于等于 MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了 ServerLimit,那么它乘以 ThreadsPerChild 的值必须大于等于 MaxRequestWorkers,而且 MaxRequestWorkers 必须是 ThreadsPerChild 的整数倍,否则 Apache 将会自动调节到一个相应值。

3)event

worker 模式的升级和加强版本,相对 worker 模式能够承受的了更高的并发负载。它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题(HTTP 的 Keepalive 方式能减少 TCP 连接数量和网络负载),在 event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。

其缺点是不能很好的支持 https 的访问。

参数说明:

2.4 相关指标查询

以下操作主要是基于 prefork 模式进行。

1)查看 apache 当前连接数
pgrep httpd | wc -l                   # 方式1 
ps -ef | grep httpd | grep -v grep | wc -l    # 方式2    

执行结果:

2)查看 apache 内存/CPU 使用情况

ps aux 命令可以查询进程的CPU、内存等指标:

再结合 awk 工具可以分析出 apache 占用CPU、内存情况:

ps aux | grep httpd | grep -v grep | awk 'BEGIN{mem=0}{mem+=$4}END{print mem}'

执行结果:

根据以上内容,编写 Apache 检测脚本 checkhttpd:

HTTPD_NUM=`pgrep httpd | wc -l`
HTTPD_MEM=`ps aux | grep httpd | grep -v grep | awk 'BEGIN{mem=0}{mem+=$4}END{print mem}'`
HTTPD_CPU=`ps aux | grep httpd | grep -v grep | awk 'BEGIN{cpu=0}{cpu+=$3}END{print cpu}'`
echo "httpd num is $HTTPD_NUM"
echo "httpd mem is $HTTPD_MEM"
echo "httpd cpu is $HTTPD_CPU"

执行结果:

三、ab 工具并发负载压力测试

ab 是 Apache 提供的一款小巧的压力测试工具,可以模拟多线程并发请求,测试服务器负载压力,也可以测试 nginx、lighthttp、IIS 等其它 Web 服务器的压力。

默认在 Apache 目录下的 bin 目录中。

3.1 常用参数

  • -n:请求的总数,默认是1次
  • -c:并发数,同一时间请求数
  • -p:如果后面接的是文件,表示POST请求,文件中包含请求数据,根据数据格式,设置-T参数
  • -T:设置请求头中的 Content-type(针对POST/PUT),比如:application/x-www-form-urlencoded。默认是 text/plain
  • -w:将测试结果打印到 HTML 表格中

3.2 压力测试

执行 ab 测试:

./ab -n 200 -c 100 -t 60 -w http://180.76.232.93/test.php > /usr/local/httpd/htdocs/check.html

查看服务器相关指标:

执行结束后,查看压力测试分析结果:

根据分析结果,可以调整相应的 Apache 配置。比如连接数较大时,可以增大 StartServers、MinSpareServers 和 MaxSpareServers 参数的值。

修改相关配置后,需要先 stop httpd服务,然后再 start httpd服务。

3.3 参考

《ab - Apache HTTP server benchmarking tool》:http://httpd.apache.org/docs/2.4/programs/ab.html

四、Keep-Alive

keep-alive是http1.0与http1.1的特性之一,意在提供长效的HTTP会话,以避免客户端频繁建立tcp连接的消耗。

想象一个这样的场景:一个客户端通过页面向服务器发送 Request,之后两者建立一个 tcp 连接,伴随着返回响应信息,服务器同时将连接关闭。这个过程分为四个步骤:

  1. 建立 tcp 连接
  2. 发出请求文档
  3. 发出响应文档
  4. 释放 tcp 连接

如果此时请求的页面中含有其他的连接,比如图片、js 等,客户端将重复这个过程。keep-alive 的作用在于第一次建立连接时,服务器将保持这个 tcp 连接一段时间(不超过设定的 KeepAliveTimeout),以节省重复过程1和4创建 tcp 连接与释放 tcp 连接的时间。一般可以节省50%以上的时间。

4.1 Keep-Alive 的开启

在 httpd.conf 配置文件中加入:

KeepAlive On
KeepAliveTimeOut 2
MaxKeepAliveRequests 300

KeepAliveTimeOut:定义长连接的时间,它的设定以单个页面资源加载时间为准,比如出行的用户,页面请求资源的时间大约为2s,所以我们设定这个值为2秒

MaxKeepAliveRequests:定义一个 tcp 连接同时可以处理的请求数,0表示不限制

4.2 Keep-Alive 的优化

① 假设 Keep-Alive 的时间为60s,服务器1分钟内平均在线用户为500(总进程数为500个),开启 keep-Alive 后,Apache 服务器的消耗为:

假设一个进程平均占用2M的内存,总消耗内存为 500*2M=1G

② 关闭 keep-Alive 后,Apache 服务器的消耗为:

总进程数为 500/60=10个,总消耗内存为10*2M=20M

所以这个事实要求我们在 KeepAliveTimeout、MaxKeepAliveRequests 和系统资源间寻找一个平衡。

  • 当服务器提供的是一个接口服务,除了动态内容,几乎没有引用任何静态内容,不建议开启 Keep-Alive
  • 当一个页面包含非常多的 js 文件、图片、css 文件等,建议将其设置为 On

但是大多数时候,是否能保存长连接以及设定长连接的时间,并不由服务器决定,有时浏览器(如火狐等),其默认60秒后自动断开任何长连接。这时服务器的 tomeout 时间将失效。

4.3 参考

《KeepAlive,你优化了吗》:http://51write.github.io/2014/04/09/keepalive

五、虚拟主机

虚拟主机指的是在单一机器上运行多个网站(如 company1.example.com 和 company2.example.com),虚拟主机可以基于 IP,即每个 IP 一个站点; 或者基于名称, 即每个 IP 多个站点。这些站点运行在同一物理服务器上的事实不会明显的透漏给最终用户。

建议先在 httpd.conf 中开启独立配置:

Include conf/extra/httpd-vhosts.conf

5.1 VirtualHost 配置节点

» httpd-vhosts.conf

<VirtualHost *:80>  
 ServerAdmin 1297441127@qq.com
 ServerName www.domain.com  
 ServerAlias test1.domain.com test2.domain.com
 DocumentRoot "/var/www"  
 DirectoryIndex index.html index.php  
 ErrorLog /var/httpd/errorlog
 CustomLog /var/httpd/customlog common 
</VirtualHost> 

参数说明:

  • ServerAdmin:管理服务器的邮箱
  • ServerName:需要绑定的域名
  • ServerAlias:可以绑定多个域名
  • DocumentRoot:网站根目录
  • DirectoryIndex:默认访问的页面
  • ErrorLog:错误日志文件目录
  • CustomLog:访问日志文件目录,日志格式支持 common(常用)、referer、agent、combined

5.2 Directory 配置节点

<Directory "/var/www">  
 Options FollowSymlinks  
 AllowOverride All  
 Require all granted  
</Directory>

参数说明:

  • Options FollowSymlinks:禁止显示目录结构。Options Indexes FollowSymLinks 表示允许显示目录结构
  • AllowOverride All:允许 htaccess 生效。AllowOverride None 表示不生效
  • Require all granted:所有人均可访问。require all denied 表示所有人拒绝访问
  • require not ip 192.168.0.1:禁止指定 IP

Apache2.2中的配置格式如下:

<Directory "/var/www">  
  Options -Indexes +FollowSymlinks  
  AllowOverride All  
  Order deny,allow  
  Allow from all  
</Directory>  

5.3 调试虚拟主机配置

执行 httpd 命令的 -S 参数:

/usr/local/httpd/bin/httpd -S

执行结果:

这个命令将会显示 Apache 是如何解析配置文件的。仔细检查 IP 地址与服务器名称可能会帮助你发现配置错误。

六、Apache 扩展工具—apxs

apxs 是用于构建和安装 Apache 超文本传输协议(HTTP)服务器的扩展模块的工具。这是通过从一个或多个源或对象文件构建动态共享对象(DSO)来实现的,然后可以通过 mod_so 的 LoadModule 指令在运行时加载到 Apache 服务器中。

6.1 apxs 参数

  • -g:生成代码模板,后面要加 -n <modname> 选项指定模块名
  • -c:编译操作,编译通常默认为 mod_name.so
  • -i:自动安装 .so 文件到 modules 目录中
  • -a:自动添加相应模块(LoadModule)到 httpd.conf 配置文件中
  • -I:链接外部头文件
  • -L:链接自定义库文件

6.2 实例

1)利用 apxs 生成 txl 扩展模块模板:
/usr/local/httpd/bin/apxs -g -n txl

执行成功后,进入 txl 目录,自动生成了3个文件:

2)编写模块并编译

» mod_txl.c

然后编译该模块:

/usr/local/httpd/bin/apxs -c -i mod_txl.c
4)配置 httpd.conf

加载 txl_module 扩展模块,并设置 .txl 后缀文件的 content_type 为 application/txl,以便 txl_module 模块拦截执行:

LoadModule txl_module modules/mod_txl.so
AddType application/txl .txl

重启 httpd 服务,访问任意带 .txl 后缀的文件,若出现该行文字说明该扩展模块生效:

 

6.3 参考

《apxs - APache eXtenSion tool》:http://httpd.apache.org/docs/2.4/programs/apxs.html

转载于:https://www.cnblogs.com/tangxuliang/p/9157552.html

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ddkvo44242/article/details/102299573
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-20 18:38:40
  • 阅读 ( 673 )
  • 分类:Linux

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢