欢迎访问站腾网!

站腾网

您现在的位置是:站腾网 > SEO知识 >

SEO知识

LNMP架构下各项配置优化总结

发布时间:2021-07-05SEO知识评论
从事php开发的都知道,LNMP一般是指linux+Nginx+MySQL+PHP组合,也是平常开发和线上环境中最易的Web服务器架构。为尽可能的提升服务器响应速度,LNMP的配置优化是十分要紧的步骤。下面分别

假如你想让数据库服务器充当主节点的备份节点,那样开启二进制日志是需要的。假如这么做了之后,还别忘了设置server_id为一个唯一的值。即使只有一个服务器,假如你想做基于时间点的数据恢复,这也是非常有用的:从你近期的备份中恢复,并应用二进制日志中的修改。

nginx使用epoll事件模型,处置效率高。

工作进程连结束

worker_connections65535;

innodb_support_xa可以开关InnoDB的XA两段式事务提交。默认状况下,innodb_support_xa=true,支持XA两段式事务提交。因为XA两段式事务提交致使多余flush等操作,性能影响会达到10%,所有为了提升性能,有的DBA会设置innodb_support_xa=false。如此的话,redolog和binlog将没办法同步,可能存在事务在主库提交,但没记录到binlog的状况。如此也大概导致事务数据的丢失。

innodb_additional_mem_pool_size

假如将它的值设置为2会致使不太靠谱。由于提交的事务仅仅每秒才flush一次到redo日志,但对于一些场景是可以同意的,譬如对于主节点的备份节点这个值是可以同意的。假如值为0速度就更快了,但在系统崩溃时可能丢失一些数据:只适用于备份节点。说到这个参数就必然会想到另一个sync_binlog。

innodb_flush_method

默认值为1,表示InnoDB完全支持ACID特质。当你的主要关注点是数据安全的时候这个值是比较合适的,譬如在一个主节点上。但对于磁盘速度较慢的系统,它会带来非常巨大的开销,由于每次将改变flush到redo日志都需要额外的fsyncs。

这个参数应该是运维中需要关注的了。缓冲池是数据和索引缓存的地方,它是MySQL的核心参数,默觉得128MB,正常的状况下这个参数设置为物理内存的60%~70%。

innodb_log_file_size

若你不可以关闭访问日志文件,至少应该用缓冲:

access_log/var/log/nginx/access.logmainbuffer=16k;

关闭版本显示

server_tokensoff;

该参数用来存储数据字段信息和其他内部数据结构。表越多,需要在这里分配的内存越多。假如InnoDB用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息,默认8MB。通常设置16MB。

max_connections

缓存,主要针对于图片,css,js等元素更改机会比较少的状况下用,尤其是图片,占用带宽大,大家完全可以设置图片在浏览器当地缓存365d,css,js,html可以缓存个10来天,如此用户首次打开加载慢一点,第二次,就飞快了!缓存的时候,大家需要将需要缓存的拓展名列出来,Expires缓存配置在server字段里面。

location~*\.(ico|jpe?g|gif|png|bmp|swf|flv)${ expires30d; } location~*\.(js|css)${ expires7d; }

fastcgi调优

fastcgi_connect_timeout600; fastcgi_send_timeout600; fastcgi_read_timeout600; fastcgi_buffer_size64k; fastcgi_buffers464k; fastcgi_busy_buffers_size128k; fastcgi_temp_file_write_size128k; fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp; fastcgi_intercept_errorson; fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cachelevels=1:2keys_zone=cache_fastcgi:128minactive=1dmax_size=10g; fastcgi_connect_timeout600:指定连接到后端FastCGI的超时时间。 fastcgi_send_timeout600:向FastCGI传送请求的超时时间。 fastcgi_read_timeout600:指定接收FastCGI应答的超时时间。 fastcgi_buffer_size64k:指定读取FastCGI应答第一部分需要用多大的缓冲区,默认的缓冲区大小为。fastcgi_buffers指令中的每块大小,可以将这个值设置更小。 fastcgi_buffers464k:指定当地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,假如一个php脚本所产生的页面大小为256KB,那样会分配4个64KB的缓冲区来缓存,假如页面大小大于256KB,那样大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但这并非好办法,由于内存中的数据处置速度要快于磁盘。通常这个值应该为站点中php脚本所产生的页面大小的中间值,假如站点大多数脚本所产生的页面大小为256KB,那样可以把这个值设置为“832K”、“464k”等。 fastcgi_busy_buffers_size128k:建议设置为fastcgi_buffers的两倍,繁忙时候的buffer。 fastcgi_temp_file_write_size128k:在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway。 fastcgi_temp_path:缓存临时目录。 fastcgi_intercept_errorson:这个指令指定是不是传递4xx和5xx错误信息到推广客户端,或者允许nginx用error_page处置错误信息。注:静态文件没有会返回404页面,但php页面则返回空白页! fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cachelevels=1:2keys_zone=cache_fastcgi:128minactive=1dmax_size=10g:fastcgi_cache缓存目录,可以设置目录层级,譬如1:2会生成16*256个子目录,cache_fastcgi是这个缓存空间的名字,cache是用多少内存,inactive表示默认失效时间,假如缓存数据在失效时间内没被访问,将被删除,max_size表示最多用多少硬盘空间。 fastcgi_cachecache_fastcgi:#表示开启FastCGI缓存并为其指定一个名字。开启缓存很有用,可以大大降低CPU的负载,并且预防502的错误放生。cache_fastcgi为proxy_cache_path指令创建的缓存区名字。 fastcgi_cache_valid2003021h:#用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合用。 fastcgi_cache_valid3011d:将301应答缓存一天。 fastcgi_cache_validany1m:将其他应答缓存为1分钟。 fastcgi_cache_min_uses1:该指令用于设置经过多少次请求的相同URL将被缓存。 fastcgi_cache_keyhttp://$host$request_uri:该指令用来设置web缓存的Key值,nginx依据Key值md5哈希存储.通常依据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key。 fastcgi_pass:指定FastCGI服务器监听端口与地址,可以是本机或者其它。

禁用访问日志文件

从事php开发的都了解,LNMP通常是指linux+Nginx+MySQL+PHP组合,也是平时开发和线上环境中最容易的Web服务器构造。为尽量的提高服务器响应速度,LNMP的配置优化是十分重要的步骤。下面分别概要一下LNMP各组件的配置优化办法。

Linux

这是redo日志的大小。redo日志被用于确保写操作迅速而靠谱并且在崩溃时恢复。假如你知晓你的应用程序需要频繁地写入数据并且你用的是MySQL5.6,那样你可以刚开始就把它这是成4G。

innodb_support_xa

注:文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。

*softnofile65535 *hardnofile65535

当sync_binlog=N(N>0),MySQL在每写N次二进制日志binarylog时,会用fdatasync()函数将它的写二进制日志binarylog同步到磁盘中去。当innodb_flush_log_at_trx_commit和sync_binlog都为1时是最安全的,在mysqld服务崩溃或者服务器主机crash的状况下,binarylog只大概丢失最多一个语句或者一个事务。但鱼与熊掌不可兼得,双1会致使频繁的IO操作,因此该模式也是最慢的一种方法。出于大家的业务考虑在业务重压允许的状况下默认的都是双1配置。

log_slave_update

通常大家需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,用gzip的功能是需要消耗CPU的。

gzipon; gzip_min_length2k; gzip_buffers432k; gzip_http_version1.1; gzip_comp_level6; gzip_typestext/plaintext/csstext/JAVAscriptApplication/jsonapplication/JavaScriptapplication/x-javascriptapplication/xml; gzip_varyon; gzip_proxiedany; gzipon;#开启压缩功能

用gzip压缩功能,可能为节省带宽,加快传输速度。

表的数据和索引存放在共享表空间里或者单独表空间里。大家的工作场景安装是默认设置了innodb_file_per_table=ON,如此也能够帮助工作中进行单独表空间的迁移工作。MySQL5.6中,这个属性默认值是ON。

innodb_flush_log_at_trx_commit

关于Linux优化,大家这次主要从内核配置方面去讲。内核配置优化主要围绕怎么样提供更好更稳定的TCP/IP服务为主,可以查询这篇文章:从TCP/IP协议谈Linux内核参数优化,这里不在单独写了。

工作进程数目

二进制日志一旦创建就将永久保存。所以假如你不想让磁盘空间耗尽,你可以用PURGEBINARYLOGS来清除旧文件,或者设置expire_logs_days来指定过几天日志将被自动清除。记录二进制日志不是没开销的,所以假如你在一个非主节点的复制节点上无需它的话,那样建议关闭这个选项。

skip_name_resolve

假如内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下.因此尽量将tmpdir配置到性能好速度快的存储设施上。

慢日志有关

slow_query_log=1#打开慢日志

PHP

进程数

pm=dynamic #pm参数指定了进程管理方法,有两种可供选择:static或dynamic,从字面意思不难理解,为静态或动态方法。若是静态方法,那样在php-fpm启动的时候就创建了指定数目的进程,在运行过程中不会再有变化(并非真的就永远不变);而动态的则在运行过程中动态调整,当然并非无限制的创建新进程,受pm.max_spare_servers参数影响;动态合适小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建收购进程对服务器资源也是一种消耗 pm.max_children=24 #static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数目 pm.start_servers=16 #动态方法下的起始php-fpm进程数目 pm.min_spare_servers=12 #动态方法下服务器空闲时最小php-fpm进程数目 pm.max_spare_servers=24 #动态方法下服务器空闲时最大php-fpm进程数目

复制构造时确保server-id要不同,一般主ID要小于从ID。

log_bin

最大处置请求数是指一个php-fpm的worker进程在处置多少个请求后就终止掉,master进程会重新respawn一个新的,这个配置的主要为了防止php讲解器或程序引用的第三方库导致的内存泄露。

最长实行时间

max_execution_time=20 request_terminate_timeout=20

这项配置决定了为尚未实行的事务分配的缓存。其默认值通常来讲已经够用了,但假如你的事务中包含有二进制大对象或者大文本字段的话,这点缓存非常快就会被填满并触发额外的I/O操作。看看Innodb_log_waits状况变量,假如它不是0,增加innodb_log_buffer_size。

innodb_buffer_pool_size

worker_cpu_affinity为每一个进程分配cpu,通常情况下一个进程分配一个cpu,比如8cpu:

worker_processes8; worker_cpu_affinity0000000100000010000001000000100000010000001000000100000010000000;

最大打开文件数

worker_rlimit_nofile65535;

参数说明:

gzip_min_length1k:设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获得,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,假如小与1K可能会越压越大。 gzip_buffers432k:压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。 gzip_http_version1.1:压缩版本,用于设置辨别HTTP协议版本,默认是1.1,现在大多数浏览器已经支持GZIP解压,用默认即可。 gzip_comp_level6:压缩比率,用来指定GZIP压缩比,1压缩比最小,处置速度最快,9压缩比最大,传输速度快,但处置慢,也比较消耗CPU资源。 gzip_typestext/csstext/xmlapplication/javascript:用来指定压缩的种类,‘text/html’种类一直会被压缩。默认值:gzip_typestext/html(默认不对js/css文件进行压缩) 压缩种类,匹配MIME型进行压缩; 不可以用通配符text/*; text/html默认已经压缩(无论是不是指定); 设置哪压缩种文本文件可参考conf/mime.types。 gzip_varyon:varyheader支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,比如用Squid缓存经过nginx压缩的数据。

连接超时设置

keepalived_timeout65; client_header_timeout30; client_body_timeout30; sned_timeout60; proxy_send_timeout300; reset_timedout_connectionon;

参数说明:

keepalived_timeout:推广客户端连接维持会话超时时间,超越这个时间,服务器断开这个链接,对于一些请求比较大的内部服务器通讯的场景,适合加强为120s或者300s,具体依据不同场景,默认值是60秒。 client_header_timeout:推广客户端向服务器发送一个完整的requestheader的超时时间,假如推广客户端在此时间内没发送一个完整的requestheader,那样Nginx返回HTTP408错误,默认值是60秒。 client_body_timeout:推广客户端与服务器打造连接后发送requestbody的超时时间,假如推广客户端在此时间内没发送任何内容,那样Nginx返回HTTP408错误(RequestTimedOut),默认值是60秒。 reset_timeout_connection:告诉nginx关闭不响应的推广客户端连接。这将会释放那个推广客户端所占有些内存空间。 send_timeout:发送数据至推广客户端超时时间,默认60s,假如连续的60s内推广客户端没收到1个字节,连接关闭。 proxy_send_timeout:发送请求给upstream服务器的超时时间,超时设置不是整个发送期间,而是在两次write操作期间,假如超时后,upstream没收到新的数据,nginx会关闭连接。

Buffer缓解后端的负载

用户重新登录生效。

Nginx事件处置模型

events{ useepoll; }

这个是用来处置由于PHP实行时间超长而报502错误的解决。这个时长配置可以在php.ini或php-fpm.conf中配置均可,为了不影响全局配置,可在php-fpm.conf中达成

在大多数场景下,借助Nginx的buffer和cache能力,可以大大地减轻负担。

client_body_buffer_size16K client_header_buffer_size1K client_body_buffer_size:允许推广客户端请求的最大单个文件字节数,在32位系统上默认是8k,在64位系统上默认是16k。可以在http,server和location模块中指定 client_header_buffer_size:用于设置推广客户端请求的Header头缓冲区大小,大多数状况1KB大小足够,默认的值是1k

开启高效传输模式

http{ includemime.types; default_typeapplication/octet-stream; …… sendfileon; tcp_nopushon; …… } sendfileon:开启高效文件传输模式,sendfile指令指定nginx是不是调用sendfile函数来输出文件,对于一般应用设为on,假如用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与互联网I/O处置速度,减少系统的负载。注意:假如图片显示不正常把这个改成off。 tcp_nopushon:需要在sendfile开启模式才有效,预防网路阻塞,积极的降低互联网报文段的数目

expires缓存调优

server_tokens并不会让nginx实行的速度更快,但它可以关闭在错误页面中的nginx版本数字,如此对于安全性是有好处的。

MySql

innodb_file_per_table

设置每一个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,通常设置为65535。

开启Gzip压缩

MySQL服务器默认连接数比较小,通常也就100来个最好把最大值设大一些。通常设置500~1000即可每个链接都会占用肯定的内存,所以这个参数更不是越大越好。有些人遇见toomanyconnections会去增加这个参数的大小,但其实若是业务量或者程序逻辑有问题或者sql写的不好,即便增大这个参数也无济于事,第三显示错误只不过时间问题。在应用程序里用连接池或者在MySQL里用进程池能够帮助解决这一问题。

server-id

这一点影响较大,由于高流量站点上的日志文件涉及很多需要在所有线程之间同步的IO操作。

access_logoff; log_not_foundoff; error_log/var/log/nginx-error.logwarn;

当业务中需要用级联构造的时候log_slave_update=1这个参数需要打开,否者第三级可能没办法接收到第一级产生的binlog,从而没办法进行数据同步。

tmpdir

sync_binlog的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依靠操作系统来刷新binarylog。

Nginx运行工作进程个数,建议根据cpu数目来指定,通常为它的倍数(如,2个四核的cpu计为8)。

worker_processes8;

CPU亲和力

通常php-fpm进程占用20~30m左右的内存就按30m算。假如单独跑php-fpm,动态方法起始值可设置物理内存Mem/30M。

最大处置请求数

pm.max_requests=10240

当推广客户端连接数据库服务器时,服务器会进行主机名分析,并且当DNS非常慢时,打造连接也会非常慢。因此建议在启动服务器时关闭skip_name_resolve选项而不进行DNS查找。唯一的局限是之后GRANT语句中只能用IP地址了,因此在添加这项设置到一个已有系统中需要格外小心。

sync_binlog

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数与nginx进程数相除,但nginx分配请求并非那样均匀,所以最好与ulimit-n的值维持一致。

这项配置决定了数据和日志写入硬盘的方法。一共有三种方法,大家默认用O_DIRECT。O_DIRECT模式:数据文件的写入操作是直接从mysqlinnodbbuffer到磁盘的,并不需要通过操作系统的缓冲,而真的的完成也是在flush这步,日志还是要经过OS缓冲。

innodb_log_buffer_size

广告位