一.[*系统层面*]
1,文件句柄数:
# ulimit -n
65535
[[email protected] /]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 255980
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
2,tcp内核参数修改
该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
echo 2048 > /proc/sys/net/core/somaxconn 临时修改
在/etc/sysctl.conf中添加如下 永久生效
net.core.somaxconn = 2048
然后在终端中执行
sysctl -p
3,TCP连接立即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
4,添加使用swap分区
dd if=/dev/zero of=/swap bs=1k count=40960003
mkswap swap
swapon /swap
echo “/swap swap swap defaults 0 0” >> /etc/fstab
5,是否要做tcp的syn抵御 根据情况选择(0关闭1开启)
/proc/sys/net/ipv4/tcp_syncookies
系统优化后配置参考,在/etc/sysctl.conf
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
使用:sysctl -p 生效
sysctl -p
二.[*nginx层面*]
nginx主配置文件修改:
该段配置需要和 ulimit -n看到的一致。
worker_rlimit_nofile 51200;
nginx配置文件:
user www www;
worker_processes auto;
#worker_processes 4;
#worker_processes 8;
#worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable “MSIE [1-6]\.”;
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add “limit_conn perip 10;” to server section.
server_tokens off;
access_log off;
server
{
listen 80 default_server backlog=32768;
#listen [::]:80 default_server ipv6only=on;
server_name www.lnmp.org;
index index.html index.htm index.php;
root /home/wwwroot/default;
#error_page 404 /404.html;
include enable-php.conf;
location /nginx_status
{
stub_status on;
access_log off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/access.log;
}
include vhost/*.conf;
}
三.[*php-fpm进程优化*]
目前php-fpm.conf配置文件:
/usr/local/php/etc/php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
;listen = /tmp/php-cgi.sock
listen = 127.0.0.1:9000
listen.backlog = 32768
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 800
pm.start_servers = 275
pm.min_spare_servers = 50
pm.max_spare_servers = 500
pm.max_requests = 204800
request_terminate_timeout = 600
request_slowlog_timeout = 0
slowlog = /usr/local/php/var/log/slow.log
优化php-fpm配置
# vim www.com.conf
在配置文件里加入fastcgi_cache TEST开启fastcgi缓存并为其指定一个名称,开启缓存之后非常有效,可以有效的降低CPU的负载,并且防止502错误。
location ~ \.php$ {
root /home/mrliangqi;
fastcgi_pass 127.0.0.1:9000;
listen = /dev/shm/php-fpm.sock
fastcgi_index index.php;
fastcgi_cache TEST
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
fastcgi_cache TEST
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
nginx请求后端php返回502.
解决:
Sock连接放到dev/shm下会提升速度~
/tmp/php-cgi.sock
查看php的慢日志可以找到php的卡点~
慢日志和数据库的慢查询有点类似,会记录下来执行超过多少时间的php执行的内容
这个如果是用fast-cgi的话,可以在fpm的配置里面有
request_slowlog_timeout = 5s 超过多长时间将会记录到日志
slowlog = /usr/local/php/var/log/slow.log
配置参数详解:
max_children:(静态模式下开启的php-fpm的进程数)是PHP-FPM Pool 最大的子进程数,他数值取决于你的服务器内存。 假设你打算给10G内存给当前配置的PHP-FPM Pool,一般一个PHP请求占用内存10M-40M,我们按站点每个PHP请求占用内存25M,这样max_children = 10G/25M = 409。所以,这个值可以根据情况算出来
我们服务器的总内存为32G ,减去nginx和mysql的1G多之后,这里给php20G的内存空间,一个php的进程所占内存为24M,20480/24=853 。所以pm.max_children 值应该设置800左右最为合理~
pm.start_servers:(动态方式下的起始php-fpm的进程数)该参数是php启动时候,开启的子进程的数量,该值不会超过pm.max_children的值。
pm.min_spare_servers:(动态方式下的最小php-fpm进程数)
pm.max_spare_servers:(动态方式下的最大php-fpm进程数量)
Dm和static的区别:
如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数
[配置参考]
对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。
这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。
因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,
那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。
这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。
对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。
因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,
因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M 得到。
比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比如服务器上只是部署php环境的话,比较合适的值在5~10之间。
Nginx_Php_Mysql连接内容状态查看脚本:
脚本效果:
https://github.com/linux503/linux/blob/master/nmp_statusv1.sh
http://www.mrliangqi.com/pack/shell/nmp_statusv1.sh