Linux运维学习笔记之十七:LNMP的WEB架构深度优化之性能优化

第二十七章LNMP的WEB架构深度优化之性能优化

一、Nginx性能优化-配置Nginx的worker进程个数

1、worker的作用和初始设置

worker_processes就是worker角色的进程个数,也就是nginx启动后有多少个worker处理http请求。master进程不处理请求,而是根据相应配置文件信息管理worker进程。master进程主要负责对外揽活(即接收客户端的请求),并将活儿合理的分配给多个worker,每个worker进程主要负责干活(处理请求)。nginx 进程数,建议按照cpu 数目(个数或核数)来指定,一般拥有几个逻辑CPU,就设置为几个worker_processes 为宜,但是 worker_processes 超过8个就没有多大意义了

2、查看调整worker进程个数的参数(默认为1)

grep "worker_processes" /application/nginx/conf/nginx.conf

worker_processes  1;

3、查看CPU核数的方法

(1)方法一:grep "physical id" /proc/cpuinfo | wc –l     #本机为2个

(2)方法二:top  -->  按1  —>  显示每个CPU的负载,也就知道了CPU的个数了。

 

4、修改worker进程个数

vi /application/nginx/conf/nginx.conf

worker_processes  2;

5、重启nginx

/application/nginx/sbin/nginx –s reload

6、查看worker_process进程

ps -ef | grep nginx

nginx     2510  2509  005:42 ?        00:00:00 nginx: worker process

nginx     2511  2509  005:42 ?        00:00:00 nginx: workerprocess 

二、Nginx性能优化-根据CPU核数对Nginx进程进行优化

1、为什么要根据CPU核数对Nginx进程进行优化

默认情况下,Nginx的多个进程可能更多的是跑在一颗CPU上,无法充分利用服务器的多核多CPU,为了充分利用CPU,所以对Nginx进程进行优化,使Nginx不同的进程跑在不同的CPU上。

2、配置Nginx跑在多CPU上的参数(又称为nginx进程cpu亲和力)

worker_cpu_affinity   00010010 0100 1000

这里的0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗CPU核心。

3、配置示例
(1)示例1:2核CPU服务器

vi /application/nginx/conf/nginx.conf

worker_processes  2;

worker_cpu_affinity0001 0010

(2)示例2:4核CPU服务器

vi /application/nginx/conf/nginx.conf

worker_processes  4;

worker_cpu_affinity0001 0010 0100 1000

(3)示例3:8核CPU服务器

vi /application/nginx/conf/nginx.conf

worker_processes  8;

worker_cpu_affinity00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

三、Nginx性能优化-配置Nginx事件处理模型及连接数

1、Nginx支持事件处理模型

Nginx支持如下处理连接的方法(I/O复用方法),在linux下面,只有epoll是高效的方法。这些方法可以通过use指令指定:

select– 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 –with-select_module 和–without-select_module 来启用或禁用这个模块。

poll– 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 –with-poll_module 和–without-poll_module 来启用或禁用这个模块。

kqueue– 高效的方法,使用于 FreeBSD4.1+, OpenBSD 2.9+, NetBSD 2.0 和MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

epoll– 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2, 有让2.4版本的内核支持epoll的补丁。

/dev/poll– 高效的方法,使用于 Solaris

windows使用的是icop。

2、epoll的优点
(1)支持一个进程打开大数目的socket描述符(FD)

select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显 然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左 右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

(2)IO效率不随FD数目增加而线性下降

传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是”活跃”的,但 是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对”活跃”的socket进行操 作—这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有”活跃”的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个”伪”AIO,因为这时候推动力在os内核。在一些 benchmark中,如果所有的socket基本上都是活跃的—比如一个高速LAN环境,epoll并不比select/poll有什么效率,相 反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。

(3)使用mmap加速内核与用户空间的消息传递。

这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很 重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。

(4)内核微调

这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀疑linux平台,但是你无法回避linux平台赋予你微调内核的能力。比如,内核TCP/IP协 议栈使用内存池管理sk_buff结构,那么可以在运行时期动态调整这个内存pool(skb_head_pool)的大小— 通过echoXXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手 的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

3、指定Nginx使用epoll事件处理模型

默认情况下,nginx是没有指定事件处理模型,默认就会使用最有效的模型,如果要指定epoll事件处理模型,则要在nginx.conf配置文件中的events标签下加入“use epoll;”语句。

4、调整单个进程允许的客户端最大连接数

参数名称为worker_connections,默认值为1024.是定义Nginx每个进程的最大连接数,在nginx.conf配置文件中的events标签下加入“worker_connections= 要指定最大连接数;”语句。这个参数的数值应该根据服务器的性能和程序的内存使用量来指定(也就是一个进程启动运行后使用的内存)。最大客户端连接数由worker_processes和worker_connections两个参数共同决定,即Nginx的客户端最大连接数Max_client=worker_processes * worker_connections。同时,客户端最大连接数也受到Linux系统进程的最大打开文件数的限制。在执行操作系统命令ulimit –HSn65535或配置相应文件后worker_connections的设置才能生效。

5、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定单个进程允许的客户端最大连接数

use epoll;                    #指定使用epoll事件处理模型

}

http {

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent"$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

四、Nginx性能优化-优化服务器名字的hash表大小

1、服务器名字的hash表说明

Nginx的配置文件nginx.conf或其它扩展server中server_name存储在服务器名字的hash表中。hash表和监听的端口关联,每个端口都最多关联到3张表:确切名字的hash表,以星号“*”开始的通配符名字的hash表和以星号“*”结束的通配符名字的hash表。Nginx首先搜索确切名字的hash表;如查没找到,则搜索以以星号“*”开始的通配符名字的hash表;如果还没找到,则搜索以以星号“*”结束的通配符名字的hash表。保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,server_names_hash_bucket_size的默认值可能是32,也可能是64,或其它值,取决于CPU的缓存行的长度,但是一路处理器缓存大小的倍数。

如果需要在Nginx的配置文件中定义大量名字或名字非常长,就需要在http标签中配置server_names_hash_max_size和server_names_hash_bucket_size的值。则否有可能会报could not build the server_names_hash, you should increaseserver_names_hash_bucket_size: 32的错误。

2、指定服务器名字的hash表大小

在nginx.conf配置文件中的http标签下加入:

server_names_hash_max_size 512; #默认就是512,单位是Kb

server_names_hash_bucket_size 64;

3、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定单个进程允许的客户端最大连接数

use epoll;                    #指定使用epoll事件处理模型

}

http {

    server_names_hash_bucket_size 128; #服务器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

五、Nginx性能优化-开启高效文件传输模式(默认是关闭的)

1、设置参数

(1)设置位置:在http标签设置

(2)参数:“sendfile on;”,同时将tcp_nopush和tcp_nodelay两个指令设置为on,用于防止网络阻塞。

2、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定单个进程允许的客户端最大连接数

useepoll;                    #指定使用epoll事件处理模型

}

http {

    server_names_hash_bucket_size 128; #服务器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

sendfile on; #开启高效文件传输模式,

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

 

六、Nginx性能优化-设置连接超时时间

1、设置参数
(1)设置位置:在http标签设置
(2)参数:

keepalive_timeout 60; #设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。

tcp_nodelay on; #防止网络阻塞。只有打开了tcp_nodelaykeepalive_timeout才有效

client_header_timeout 15; #用于设置客户端请求读取超时时间,如果超过这个时间,客户端没有发送任何数据,nginx将返回“request timeout (408)”错误。

client_body_timeout 15;  #用于设置客户端请求主体读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将返回“Request time out(408)”

send_timeout 15; #服务器超时设置,响应客户端的超时时间。如果超过这个时间,客户端还没有任何活动,nginx将会关闭连接

2、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;  #指定单个进程允许的客户端最大连接数

useepoll;                    #指定使用epoll事件处理模型

}

http {

    server_names_hash_bucket_size 128; #服务器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

sendfile on; #开启高效文件传输模式,

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout60;

client_header_timeout 15;

client_body_timeout 15;

send_timeout 15;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

七、Nginx性能优化-配合PHP应用优化fastcgi参数

1、上传文件大小限制(动态应用)
(1)设置位置:可在nginx.conf配置文件的http、server和location标签中设置
(2)参数:client_max_body_size

设置为0表示不检查,如果上传文件过大,会报413错误:Request EntityToo Large。也就是在请求头内容中的Content-Length的值不能超守该参数设置的值。同时,也受PHP本身设置的限制(PHP本身默认设置了上传附件大小不能超过2M)

(3)配置示例

http {

    server_tokens off;

include       mime.types;

client_max_body_size 10m;

。。。。。。

}

2、fastcgi调优(配合PHP引擎动态服务)
(1)设置位置:可在nginx.conf配置文件的location标签中设置
(2)参数:

a、指定连接到后端fastCGI的超时时间

fastcgi_connect_timeout 300;

b、向fastCGI请求的超时时间,这个值是指已经完成两次握手后向fastCGI传送的超时时间

fastcgi_send_timeout 300;

c、接收fastCGI应答的超时时间,这个值已经完成两次握手后接收fastCGI应答的超时时间

fastcgi_read_timeout 300;

d、指定读取fastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,一般设置为64k

fastcgi_buffer_size 64k;

e、指定本地需要用多少和多大的缓冲区来缓冲fastCGI的应答

fastcgi_buffers 4 64k;

f、默认值是fastcgi_buffers的两倍

fastcgi_busy_buffers_size 128k;

g、在写入fastcgi_temp_path是用多大的数据块,默认值是fastcgi_buffers两倍

fastcgi_temp_file_write_size 128k;

(3)配置示例

cat /application/nginx/conf/extra/www.conf

server {

    listen       80;

    server_name  www.abc.org;

        root  html/www;

        index  index.html index.htm;

        access_loglogs/www_access.log main;

    location ~.*\.(php|php5)?$ {

        fastcgi_pass   127.0.0.1:9000;

fastcgi_connect_timeout300;

fastcgi_send_timeout300;

fastcgi_read_timeout300;

fastcgi_buffer_size64k;

fastcgi_buffers4 64k;

fastcgi_busy_buffers_size128k;

fastcgi_temp_file_write_size128k;

        fastcgi_index  index.php;

        include        fastcgi.conf;

    }

}

八、Nginx性能优化-配置nginx gzip压缩功能

1、不要压缩的内容:图片、视频、Flash、小文件
2、设置参数
(1)设置位置:在http或server标签中设置
(2)参数:

a、开启gzip压缩输出(默认开启)

gzip on;

b、最小压缩文件大小。用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1k的字节数,小于1k可能会越压越大

gzip_min_length 1k;

c、表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果

gzip_buffers 4 16k;

d、压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_http_version 1.0;

e、压缩等级

gzip_comp_level 2;

f、压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

gzip_types text/plain application/javascript text/cssapplication/xml;

可以通过cat mime.types来查看所支持的种类写法。

g、选项可让前端的缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。

gzip_vary on;

3、配置示例

http {

    server_tokens off;

include       mime.types;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_comp_level 9;

gzip_types text/plain application/javascript text/cssapplication/xml;

gzip_vary on;

。。。。。。

}

4、重启服务

/application/nginx/sbin/nginx –s reload

/application/php/sbin/php-fpm restart

九、Apache性能优化-配置压缩功能mod_deflate

1、参数位置

Apache的mod_deflate模块提供了DEFLATE输出过滤器,允许Apache服务器将输出内容在发送到客户端之前根据具体的策略进行压缩,以节约网络带宽,提升用户访问速度。可以在http.conf或扩展conf中设置。

2、检查Apache是否安装mod_deflate模块

/application/apache/bin/apachectl -l | grep mod_deflate

  mod_deflate.c  #表示已安装

在编译安装Apache的configure过程时,指定了--enable-deflate参数。

3、mod_deflate模块的DSO安装方法

如果在编译时没有指定--enable-deflate参数,则可以DSO动态模块加载mod_deflate配置。命令如下:

(1)切换到Apache的源码安装包的modules目录下的filters目录下

cd /wddg/tools/httpd-2.2.27/modules/filters/

(2)调用apache的apxs命令编译该目录下的mod_defalte.c文件

/application/apache/bin/apxs -c -i -a mod_deflate.c

(3)查看编译后的生成的so文件

ll /application/apache/modules/mod_deflate.so

4、设置参数

<ifmodule mod_deflate.c>:开始标签标记

DeflateCompressionLevel:压缩级别

SetOutputFilter DEFLATE:启动压缩

AddOutputFilterByType DEFLATE:要压缩的文件类型

</ifmodule mod_deflate.c>:结束标签标记

5、配置示例

在httpd.conf最下面加上以下语句:

<ifmodule mod_deflate.c>

DeflateCompressionLevel 6

SetOutputFilter DEFLATE 

AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml

AddOutputFilterByType DEFLATE text/javascript

</ifmodule> 

十、Nginx性能优化-配置expires缓存功能

1、expires的作用和优缺点
(1)作用

expires就是在客户端缓存页面并指定缓存时间。主要是缓存静态文件,如照片、css、js等。一般不缓存广告图片、频繁更新的文件、网站流量统计工具等。

(2)优点

a、降低服务器压力

b、降低带宽,节约成本,同时提升了访问体验

(3)缺点

如果被缓存的页面更新,用户访问的时候看到的还是旧版本的内容

(4)解决方法

a、缩短缓存时间,比如1天

b、修改名称。

图片,附件一般不会被用户修改,如果用户修改,实际上修改的是文件名重新传。网站升级一般修改css和js文件,这样客户端就会认为是不同的文件就会下载。

(5)企业网站缓存日期案例

51CTO:1周

Sina:15天

京东:25天

淘宝:10年

2、参数位置:在server下的location标签中设置
3、配置示例
(1)针对扩展名

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)?$ {

expires 3650d;    #10年

root html/bbs;

}

location ~ .*\.(js|css)?$ {

expires 30d;      #1月

root html/bbs;

}

(2)针对目录

location ~ ^/(images|javascript|js|flash|media|static)/ {

expires 360d;      #1月

root html/bbs;

}

(3)针对单个文件

location ~(robots.txt)/ {

expires 7d;

root html/bbs;

}

十一、Apache性能优化-配置expires缓存功能

Apache的expires缓存时间设置与配置mod_deflate压缩模块非常相似。也是在configure时要指定,如果没有指定,则可通过DSO安装,在modules目录下生成mod_expires.so文件。

配置也非常简单,只需在httpd.conf文件中或对应虚拟主机VirtualHost标签下加上如下代码即可。httpd.conf则在所有虚拟主机中生效,在VirtualHost标签下则只能该站点生效。

ExpiresActive on   #打开expires功能

ExpiresDefault "access plus 12 month"   #默认expires存12个月

ExpiresType text/html "access plus 12 month"  #指定类型

ExpiresType text/css "access plus 12 month"

ExpiresType image/gif "access plus 12 month"

ExpiresType image/jpg "access plus 12 month"

ExpiresType image/jpeg "access plus 12 month"

ExpiresType image/bmp "access plus 12 month"

ExpiresType image/png "access plus 12 month"

ExpiresType application/x-javascript "access plus 12month"

ExpiresType application/x-shockwave-flash "access plus 12month"

ExpiresType application/x-flv "access plus 12 month"

十二、Nginx性能优化-配置防爬虫(spider)功能

由于爬虫会影响服务器性能,尤其是不遵守爬虫协议的爬虫,严重拖累服务器。如果不希望网站被网络爬虫抓取,那么需要在该网站中申明,有如下方法:

1、方法一:修改nginx.conf,禁止网络爬虫的ua,返回403

server {

listen 80;

server_name 127.0.0.1;

#添加如下内容即可防止爬虫

if ($http_user_agent ~*"qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|

Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou webspider|MSNBot|ia_archiver|Tomato Bot")

{

return 403;

}

。。。。。。

}

2、方法2:网站站点根目录下增加Robots.txt

在http://tool.chinaz.com/robots/站点可以针对现在的搜索引擎按照想要的规则生成robots.txt文件。

3、知识扩展:robots.txt爬虫(机器人)协议

robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。

当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。百度官方建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。

Robots协议是国际互联网界通行的道德规范,基于以下原则建立:

(1)搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;

(2)网站有义务保护其使用者的个人信息和隐私不被侵犯。

当然,如果搜索引擎不遵守约定的Robots协议,那么通过在网站下增加robots.txt也是不起作用的。(在正式环境中,可以适当允许搜索引擎抓取收录)

4、知识扩展:禁止指定的浏览器访问

server {

listen 80;

server_name 127.0.0.1;

if ($http_user_agent ~*"Firefox|MSIE 8.0")  #禁止Firefox或IE8.0访问

{

return 403;   #也可以跳到指定的页面

}

......

}

十三、Nginx性能优化-日志相关优化

Nginx没有Apache的cronolog日志分割处理的功能,默认情况是只写入一个日志文件。但可以通过nginx的信号控制功能或reload重载功能,同进利用脚本实现日志的自动切割。

1、编写脚本实现Nginx的日志轮询(就是将日志文件改名后重启nginx)

mkdir -p /server/scripts

cd /server/scripts

cat >>cut_nginx_log.sh <<EOF

cd /application/nginx/logs && \

/bin/mv www_access.log www_access_$(date +%F -d -1day).log

EOF

/application/nginx/sbin/nginx -s reload

2、将脚本加入crontab每天0时定时执行

crontab -e

  #every day 0:00 exec cutngnix log

  00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh>/dev/null 2>&1

3、不记录不需要的日志
(1)原因

对于健康检查或某些图片、js、css等的日志,一般是不需要记录的。因为在统计PV时,是按照页面计算,而且日志写入频繁会消耗磁盘IO,降低服务性能。

(2)参数位置:在server下的location标签中设置
(3)配置示例

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)?$ {

access_log off;

root html/www;

}

十四、Apache性能优化-不记录不需要的日志

1、设置位置

在httpd.conf文件或httpd-vhosts.conf文件中设置

2、配置示例

<FilesMatch “\.(ico|gif|jpg|swf)">

SetEnv IMAG 1   #打个标记

</FilesMatch>

CustomLog logs/access_log combinedenv=!IMAG

3、配置说明
(1)第一行中,括号中加粗的部分为文件类型,可以自由指定,用竖线“|”隔开。
(2)第四行中,删除线部分为日志文件所在路径,根据实际情况设置;斜体为apache日志4种记录方式(common、combined、referer、agent)之一,根据实际需要选择。
(3)env=!IMAG一定要加在最后。

十五、Apache性能优化-prefork模式优化

1、prefork模式和worker模式的区别

Apache一般使用worker和prefork(默认)两种模式。worker模式是生成一个主进程和多个线程,由线程对外提供服务。prefork是生成多个进程,由进程对外提供服务。进程方式安全,但费资源。

2、prefork模式的原理

prefork使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个,直到需求为止。

3、安装方法

在编译过程中,加入参数--with-mpm=prefork,如果不加也可以,默认就是prefork模式。

4、查看Apache使用的模式
(1)通过apachectl -V命令显示编译参数

/application/apache/bin/apachectl –V

Server version: Apache/2.2.27 (Unix)

Architecture:   32-bit

Server MPM:    Worker

...

(2)通过编译控制文件config.nice查看编译的参数

cat /application/apache/build/config.nice  #用这个查看编译的参数

......

"--with-mpm=worker" \

......

5、参数说明

sed -n '30,43p' httpd-mpm.conf 

# prefork MPM

# StartServers: number of server processes to start

# MinSpareServers: minimum number of server processes which are keptspare

# MaxSpareServers: maximum number of server processes which are keptspare

# MaxClients: maximum number of server processes allowed to start

# MaxRequestsPerChild: maximum number of requests a server processserves

<IfModule mpm_prefork_module>

    StartServers          5        # 服务启动时,启动的进程数

    MinSpareServers       5       # 最小进程数,一般要与StartServers一样

    MaxSpareServers      10       # 最大空闲进程数

    MaxClients          150         # 最大连接数,一般就认为是Apache的最大并发数

    MaxRequestsPerChild   0       # 最大请求数,0表示不限制

</IfModule>

6、常用参考优化参数

StartServers           10

MinSpareServers        10

MaxSpareServers        15

ServerLimit             2000

MaxClients              1000

MaxRequestsPerChild   5000

7、prefork模式查看并发数

ps -ef | grep http | wc -l

十六、Apache性能优化-worker模式优化

1、worker模式的原理

worker模式是Apache2.x新引入的模式,是线程与进程的结合。在worker模式下使用的是多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接。控制进程最初建立若干个子进程,每个子进程中以包含固定的线程数,各个线程独立处理请求,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程。

2、安装方法

在编译过程中,加入参数--with-mpm=worker,如果不加默认是prefork模式。

3、参数说明

sed -n '43,59p' httpd-mpm.conf     

# worker MPM

# StartServers: initial number of server processes to start

# MaxClients: maximum number of simultaneous client connections

# MinSpareThreads: minimum number of worker threads which are keptspare

# MaxSpareThreads: maximum number of worker threads which are keptspare

# ThreadsPerChild: constant number of worker threads in each serverprocess

# MaxRequestsPerChild: maximum number of requests a server processserves

<IfModule mpm_worker_module>

    StartServers          2        # 服务启动时,启动的进程数

    MaxClients          150        # 并发的客户端数

    MinSpareThreads      25      # 最小线程数

    MaxSpareThreads      75       # 最大空闲线程数

    ThreadsPerChild      25      #每个子进程所包含的线程

    MaxRequestsPerChild   0      #一个子进程的最大请求数,0表示不限制

</IfModule>

4、常用参考优化参数
(1)生产场景配置1

StartServers          3

MaxClients           2000

ServerLimit           25

MinSpareThreads      50

MaxSpareThreads      200

TreadLimit            200

ThreadsPerChild      100

MaxRequestsPerChild   0

(2)生产场景配置2

StartServers          5

MaxClients           9600

ServerLimit           64

MinSpareThreads      25

MaxSpareThreads      500

TreadLimit            200

ThreadsPerChild      150

MaxRequestsPerChild   0

(3)生产场景配置3

StartServers          2

MaxClients           500

ServerLimit           25

MinSpareThreads      25

MaxSpareThreads      75

TreadLimit            200

ThreadsPerChild      25

MaxRequestsPerChild   0

(4)生产场景配置4

StartServers          3

MaxClients           1600

ServerLimit           25

MinSpareThreads      50

MaxSpareThreads      200

TreadLimit            200

ThreadsPerChild      64

MaxRequestsPerChild   0

5、worker模式查看并发数

pstree -a | grep httpd | wc -l

6、worker模式注意事项

worker模式下所能同时处理的请求总数是由子进程总数乘以Threadsperchild的值所决定的,应该大于或等于maxclients。

默认最大子进程总数为16,如果需要加大时,就需要显示声明serverlimit的值(该值最大为20000)。

如果显示声明了serverlimit,那么它乘以Threadsperchild的值必须大于或等于maxclients,而且maxclients的值必须是Threadsperchild的整数倍,否则Apache将会自动调节到一个相应的值(可能是一个非期望的值)。

数学表达式:

maxclients <= serverlimit * Threadsperchild

maxclients % Threadsperchild = 0

分享:

扫一扫在手机阅读、分享本文

评论