互联网上的文章真TM不靠谱 还是自己来的好 --只写靠谱的文档

php高并发优化之二:nginx fpm配置

这些都是一些我们配置的参数,在我们2000并发下,nginx+fpm没有明显的问题,瓶颈还是出在mysql上,所以感觉应该问题不大

fpm设置

经过一些摸索,我们对我们的fpm进行了如下的配置,初步测试没有很大的问题

[global]
pid = run/php-fpm.pid
error_log = /www/logs/php-fpm.log
log_level = error
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
daemonize = yes
[www]
listen = /dev/shm/php-cgi.sock
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = static
pm.max_children = 32
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 30
request_terminate_timeout = 8
request_slowlog_timeout = 6
pm.status_path = /status
slowlog  = /www/logs/$pool.phpslow.log
rlimit_files = 65535
rlimit_core = 0
chroot =
chdir =
catch_workers_output = yes
php_flag[display_errors] = on
参数解释:
  • listen:经常的配置中都是用“listen = 127.0.0.1:9000”这种tcp配置,但是我们使用socket,经过测试,tcp模式在高并发下,nginx过来的失踪有一部分的失败,具体原因位置,参考各方文档,使用的socket。
  • pm = static : 使用静态的模式,不去动态增减进程数量,因为服务器主要是跑php业务,不用过分担心内存问题
  • pm.max_children = 32 : 这个是比较有意思的一个东西,网上很多地方都再说,按照实际php的可用内存大小来除以每个进程的内存占用,但是在我们的压测中,发现完全没有必要,在cpu一定的情况下,fpm的进程数,在超过cpu核心数一定倍数的时候,对qps完全没有影响,还空占内存,网上很多按照内存来除的,个人感觉纯属人云亦云。设置为核心数的3 4倍足矣
  • request_terminate_timeout = 8
  • request_slowlog_timeout = 6 这是两个很有用的配置 一个是php的最大执行时间,一个是慢日志的阈值。最大执行时间防止死进程占用资源,慢日志用来在压测的时候查看性能关键点,不过满日志的阈值最大是1秒,当我的进程都能在1秒跑完时候就没有满日志了,小尴尬
  • slowlog 慢日志的路径

nginx配置

events {
    use epoll;
    worker_connections  65530;
}

worker_connections设置可由一个worker进程同时打开的最大连接数。
最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。

    limit_conn_zone  $clientRealIp zone=epet_zone:30m;
    limit_req_zone   $clientRealIp zone=req_one:30m rate=400r/s;
    limit_conn_zone  $server_name  zone=conn_server:30m;

这个配置限制了单个ip的访问频率,注意$clientRealIp是一个自己定义的数据,需要根据自己的需要获取ip

listen 80 default backlog=2048;

在每个配置中需要"backlog=2048" 或者更高,这个值直接限制了socket的连接数,并发超过这个值,502..........注意,该值受“ /proc/sys/net/core/somaxconn”的影响

标签: nginx高并发配置, phpfpm高并发配置

仅有一条评论

  1. 1 1

    1

添加新评论