Nginx_Php_Mysql配置优化及快速查看脚本

一.[*系统层面*]

1,文件句柄数:

# ulimit  -n

65535

[root@iZ2sbpuog9d /]# 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


发表评论

登录 后发表评论.