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

LNMP下web高并发优化配置

一、nginx配置优化(nginx.cnf)
nginx.cnf为nginx的配置文件,我们可以在这里优化我们的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 -n与nginx进程数相除,但是nginx分配请求并不 是那么均匀,所以最好与ulimit -n的值保持一致,具体数量在命令行输入ulimit -n或者ulimit -a即可查看。

现在linux 4.4内核下开启文件打开数为65535,worker_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)
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.

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。

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

3.7、table_cache
打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度 地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有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;
四、redis配置

HTTPROOT | 自学PHP | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 石头哥 |微信小程序 |木讯 |备案
Copyright © 1998 - 2016 HTTPROOT.COM. All Rights Reserved httproot.com 版权所有