首页 » 分享 » 正文

单机标准VPS上Nginx、PHP以及MySQL的优化

对于普通小站长来说,网站的速度一直是其最关心的内容之一。
目前流行的建站程序,比如WordPress,Discuz,PHPWind等,都基于php,MySQL构建。
php和MySQL这些后端程序都不是可以选择的,前端程序可以选择Apache或者Nginx。
这里本人推荐选择Nginx,虽然Nginx处理动态文件(也就是php)速度不如Apache,但是Nginx强悍的静态文件性能,极其高效的事件驱动模型,超低的资源消耗,能让他更能承受高访问量;或者换个说法就是:Nginx可以在单核1G内存的VPS上实现Apache在双核2G以上内存配置才能实现的性能。

首选来说Nginx的优化,部分内容摘取自以前的文章:

worker_processes 1;
#参数的意义是nginx的工作进程数目;官方建议的数值是1或者CPU的整数倍,一般情况下1个进程足够,如果机器I/O一般(呵呵,阿里云就是)或者严重偏低,可设置为CPU的整数倍。这里我设置为1个,因为我现在的机器是单核。

worker_cpu_affinity 0001 0010 0100 1000;
#给nginx开启的进程分配CPU核心,达到进程均分到每个CPU核心,当然单核的这个参数就没有必要设置的,可以注释掉或者删除。

worker_rlimit_nofile 51200
#当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。注意:一般linux系统都为65536,设置高了也没有用,会受到操作系统的限制。

event段:
worker_connections 51200
#每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。(我这里的理论并发数是1*51200=51200,5W并发)

http段:
open_file_cache max=5120 inactive=20s;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内(例子中为20秒)一次没被使用,它将被移除。

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
#设置FASTCGI连接、发送、读取超时时间为300s,一定程度上解决502错误
Nginx自己并不能运行php,得靠fastcgi来执行,这点和Apache不同。

如果你不看nginx的访问日志,可以在nginx的配置文件里面加入下列内容关闭日志:
access_log off;
error_log /dev/null;

下面是php的优化:
memory_limit 128M
#php使用的内存量限制,具体参考机器的内存总量,一般1G内存建议不要超过128M;
post_max_size 8M
#POST最大字节数,一般设置为8M
upload_max_filesize 8M
#文件上传最大大小,这个影响到各种程序自带上传文件的大小,建议设置为其最大附件的2倍,比如我设置为论坛最大附件的4倍大小
max_execution_time 30
#程序最长运行时间,单位为秒,一般设置为30或者300。
output_buffering = On
#输出缓存,可以打开
disable_functions =passthru,exec,system,chroot,scandir,chgrp,chown,
escapeshellcmd,escapeshellarg,shell_exec,
proc_get_status,ini_alter,ini_alter,ini_restore,dl,
pfsockopen,openlog,syslog,readlink,symlink,leak,
popepassthru,stream_socket_server,popen
#禁用一些危险的函数,如果使用某些独特功能的php脚本提示出错,可以自行修改。

由于Nginx使用fastcgi运行php,所以,我们还需要修改php-fpm.conf文件。
equest_terminate_timeout
这个参数需要看配置来设置的,如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

进程数目设置:
如果你使用的php是5.3以上,建议将value name=”style”的值设置为apache-like,否则请设置为static。
当设置为static时,下面的value name=”StartServers”等就不起作用了。
我们先来说value name=”style”设置为static时的情况
这个时候,max_children决定了fpm-cgi进程数目,根据一个进程耗费20M内存计算,1G内存的VPS还是建议设置为10-20.

Process manager settings

Sets style of controling worker process count.
Valid values are ‘static’ and ‘apache-like’
static

Sets the limit on the number of simultaneous requests that will be served.
Equivalent to Apache MaxClients directive.
Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
Used with any pm_style.
20

Settings group for ‘apache-like’ pm style

Sets the number of server processes created on startup.
Used only when ‘apache-like’ pm_style is selected
20

Sets the desired minimum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
5

Sets the desired maximum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
35

max_children设置的太小任意导致网站访问出现502 Bad Gateway错误,设置太大容易导致php-fpm进程耗费大量内存最终导致VPS宕机,所以这个值的修改测试请在网站访问高峰期进行。
当value name=”style”设置为apache-like时,此时php-fpm进程数和Apache那样动态控制,此时max_children的值将无效,起作用的是StartServers、MinSpareServers、MaxSpareServers这三个值,StartServers是php-fpm启动时的初始值,MinSpareServers是php-fpm的最小值,MaxSpareServers是运行时最大值。你只需要注意,StartServers不能小于MinSpareServers和大于MaxSpareServer;MinSpareServers必须比MaxSpareServer小就行,注意值还是参考一个进程占用20M内存来计算,过大容易宕机,过小容易导致502错误。

如果有必要,可以开启php加速插件,常用的有XCache、eAccelerator、APC等,这些就不在这里展开了。

最后是MySQL的优化,在单机VPS上,请不要安装memcached,因为2个原因:
1、memcached是分布式的MySQL缓存系统,顾名思义,分布式是多台主机远程连接MySQL才有意义,单台VPS,还是不要用为妙
2、memcached占用大量内存,对于宝贵的内存来说,实在是得不偿失,对于I/O较高的主机,这点优化实在是性价比太低。

首先,我们需要关闭MySQL的日志,日志真的对我们没有什么用处,编辑my.cnf文件,将log-bin=mysql-bin和binlog_format=mixed前面加上#注视掉。
关闭远程连接,默认就是关闭的,如果打开了,请给skip-networking前面的#去掉。

发表评论

Protected by WP Anti Spam