LNMP中web高并发优化配置以及配置详解

Song4263 次浏览1个评论2017年11月21日

LNMP下web高并发优化配置

一、nginx配置优化(nginx.cnf)

nginx.cnfnginx的配置文件,我们可以在这里优化我们的nginx服务器,ubuntu中文件位置为/etc/nginx/nginx.conf

1.1、worker_processes 2;

nginx进程数,建议按照cpu数目来指定,一般为它的倍数 (如2个四核的cpu计为8,可以设置为8或者16),不过不是越大越好。

1.2、worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

1.3、worker_rlimit_nofile 65535;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数ulimit -nnginx进程数相除,但是nginx分配请求并不 是那么均匀,所以最好与ulimit -n的值保持一致,具体数量在命令行输入ulimit -n或者ulimit -a即可查看。

现在linux 4.4内核下开启文件打开数为65535worker_rlimit_nofile就相应应该填写65535

1.4、use epoll;

epoll是多路复用IO(I/O Multiplexing)中的一种方式,仅用于linux2.6以上内核,可以大大提高nginx的性能

1.5、worker_connections 65535;

每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections

1.6、keepalive_timeout 60;

keepalive超时时间,当keepalive_timeout时间大于0时,即启用Keep-Alive时,一个tcp连接的生命周期。

1.7、client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里 设置为分页大小。

1.8、open_file_cache max=65535 inactive=60s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求就删除缓存,即缓存多少时间。

1.9、open_file_cache_valid 30s;

这个是指多长时间检查一次缓存的有效信息,如果发现30s内没有用过一次的删除。

1.9.1、open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个 文件在inactive时间内一次没被使用,它将被移除。

二、php配置优化(php-fpm.cnf)

我们可以前往/etc/php/7.0/fpm/php-fpm.conf查看和修改配置,从配置文件可知需要在/etc/php/7.0/fpm/pool.d/www.conf中修改如下信息

2.1、pm (类型string)

设置进程管理器如何管理子进程. 可用值: static, dynamic. 必须设置.

  • static – 子进程的数量是固定的 (pm.max_children).
  • dynamic – 子进程的数量在下面配置的基础上动态设置: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

2.2、pm.max_children (类型int)

子进程的数量,pm设置为static时表示创建的,pm设置为dynamic时表示最大可创建的,必须设置。4G内存一般可以设置为200

2.3、pm.start_servers (类型int)

设置启动时创建的子进程数目,仅在pm设置为dynamic时使用. 默认值: min_spare_servers+(max_spare_servers-min_spare_servers)/2,一般情况下10-20就够用了

2.4、pm.min_spare_servers (类型int)

设置空闲服务进程的最低数目,仅在pm设置为dynamic时使用,必须设置。

2.5、pm.max_spare_servers (类型int)

设置空闲服务进程的最大数目,仅在pm设置为dynamic时使用,必须设置。

2.6、pm.max_requests (类型int)

设置每个子进程重生之前服务的请求数,对于可能存在内存泄漏的第三方模块来说是非常有用的,如果设置为0则一直接受请求;等同于PHP_FCGI_MAX_REQUESTS环境变量,默认值: 0,建议设置为10240,参考max_requests参数配置不当,可能会引起间歇性502错误

三、mysql配置优化(my.cnf)

参考MySQL数据库高并发优化配置

3.1、key_buffer_size

这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 — 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 — .MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。具体参考优化mysql之key_buffer_size设置

3.2、innodb_buffer_pool_size

这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的key_buffer_size 设置下运行的可以,然而Innodb在默认的innodb_buffer_pool_size设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于key_buffer的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把innodb_buffer_pool_size设置的太大了。

3.3、innodb_additional_pool_size

这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。

3.4、innodb_log_file_size

在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。

3.5、innodb_log_buffer_size

默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可 以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常8-16MB就足够了。越小的系统它的值越小。

3.6、innodb_flush_logs_at_trx_commit

是否为InnodbMyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置 为 0 就快很多了,不过也相对不安全了 — MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。

3.7、table_cache

打开一个表的开销可能很大。例如MyISAMMYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度 地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。我曾经见过设置为100,000的情况。

3.8、thread_cache

线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。

3.9、query_cache

如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。

3.9.1、sort_buffer_size

如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有64GB的内存。搞不好也许会降低性能。

3.9.2、mysqld参数描述以及建议

[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking
# 避免MySQL的外部锁定,减少出错几率增强稳定性。
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
back_log = 384
# back_log 参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。  如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自 己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。
key_buffer_size = 256M
# key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低!
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
# 查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。
read_buffer_size = 4M
# 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
join_buffer_size = 8M
# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
# 指定MySQL查询缓冲区的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的 情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓 冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
tmp_table_size = 256M
max_connections = 768
# 指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。
max_connect_errors = 10000000
wait_timeout = 10
# 指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
thread_concurrency = 8
# 该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8
skip-networking
# 开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!
table_cache=1024
# 物理内存越大,设置就越大.默认为2402,调到512-1024最佳
innodb_additional_mem_pool_size=4M
# 默认为2M
innodb_flush_log_at_trx_commit=1
# 设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1
innodb_log_buffer_size=2M
# 默认为1M
innodb_thread_concurrency=8
# 你的服务器CPU有几个就设置为几,建议用默认一般为8
key_buffer_size=256M
# 默认为218,调到128最佳
tmp_table_size=64M
# 默认为16M,调到64-256最挂
read_buffer_size=4M
# 默认为64K
read_rnd_buffer_size=16M
# 默认为256K
sort_buffer_size=32M
# 默认为256K
thread_cache_size=120
# 默认为60
query_cache_size=32M

3.9.3、不用长连接,程序查询完毕后close数据库

3.9.4、主从同步

change master to master_host=192.168.1.199, master_user=apk_service, master_password=123456, master_log_file=mysql-bin.000042, master_log_pos=366; 

四、PHP开启opcache

PHP 5.5以后内建了OpCache,OpCache的加速原理是把编译后的bytecode存储在内存里面, 避免重复编译 PHP所造成的资源浪费.

很多文档介绍需要zend_extension=php_opcache.so引入opcache,其实默认php7是引入了的,无需配置次选项

; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1

; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64

; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4

; 最大缓存的文件数目 200  到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000

; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5

; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0

; 开启文件时间戳验证 
opcache.validate_timestamps=1

; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2

; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0

; 是否保存文件/函数的注释   如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1

; 是否加载文件/函数的注释
;opcache.load_comments=1

; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1

;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0

; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff

; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1

; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0

; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_ 
;opcache.blacklist_filename=

; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0

; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0

; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180

; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=

; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1

; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=

; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0

五、redis配置

提交评论

请登录后评论

用户评论

  • Song Song 2017-07-16 04:00:58
    可参考:http://blog.csdn.net/xyang81/article/details/51814787
    0 赞 0 条评论 回复
    评论
    查看更多评论!

更多相关好文