本文主要针对如何通过配置 PHP-fpm 多实例, 及 nginx 对多实例负载均衡之配置, 不涉及安装.
从实践来看, 单实例最多可以开到 200-300 左右的进程, 开到 500 以上就容易出错了.
每个进程占用的内存在 5M-15M 左右, 按平均 10M 计算, 500 个进程也只有 5G, 而现在很多高性能机都是 64G 甚至 128G 的内存, 这样单实例是无法全面使用上内存资源的.
LNMP 或者 LNAMP 环境的配置这里不做介绍, 只讲在 LNMP 环境的基础上配置多实例的过程. 因为我在使用的是 LNAMP 环境, 所以额外编译一份 PHP 到 / usr/local/PHP-fpm/, 配置文件在 / etc/PHP-fpm/, 并在此基础上做的笔记.
先修改三个值:
1, 以 static 方式, 也就是固定进程数量运行 PHP-fpm.
2, 每个实例建立 100 个 worker 进程.(不宜太多, 避免不稳定)
3, 每个进程执行完 200 次请求即退出.(避免 PHP 的内存泄露问题, 也就是内存越用越多)
- sed -i 's#pm = dynamic#pm = static#' /etc/PHP-fpm/PHP-fpm.conf
- sed -i 's#pm.max_children = 5#pm.max_children = 100#' /etc/PHP-fpm/PHP-fpm.conf
- sed -i 's#;pm.max_requests = 500#pm.max_requests = 200#' /etc/PHP-fpm/PHP-fpm.conf
以下为复制 PHP-fpm.conf 和 PHP-fpm 服务管理脚本的命令
- cd /etc/PHP-fpm/
- cp PHP-fpm.conf PHP-fpm-1.conf
- sed -i 's#listen = 127.0.0.1:9000#listen = 127.0.0.1:9001#' PHP-fpm-1.conf
- sed -i 's#\[www\]#\[php-fpm-pool-1\]#' PHP-fpm-1.conf
- sed -i 's#pid = run/php-fpm.pid#pid = run/php-fpm-1.pid#' PHP-fpm-1.conf
- cd /etc/init.d/
- cp PHP-fpm PHP-fpm-1
- sed -i 's#/etc/php-fpm/php-fpm.conf#/etc/php-fpm/php-fpm-1.conf#' PHP-fpm-1
- sed -i 's#/var/run/php-fpm.pid#/var/run/php-fpm-1.pid#' PHP-fpm-1
- service PHP-fpm-1 restart
执行完上面的命令即复制了一份 PHP-fpm, 服务名和配置文件名均为 PHP-fpm-1.
再复制更多份, 把上面的命令上的 - 1 替换为 - 2,listen 监听端口往上修改, 然后再执行一遍就 OK.
然后写一个 restart_php_fpm.sh 的文件, 内容为
- service PHP-fpm-1 restart
- service PHP-fpm-2 restart
- service PHP-fpm-3 restart
- ... ...
可以用来启动和重启所有的 PHP-fpm 实例. 关闭用命令 killall PHP-fpm 即可.
然后是 Nginx 配置.
在 http 段加入:
- upstream PHP-fpm-pool {
- server 127.0.0.1:9001;
- server 127.0.0.1:9002;
- server 127.0.0.1:9003;
- server 127.0.0.1:9004;
- server 127.0.0.1:9005;
- }
修改 server 段:
- location ~ .*\.(PHP|php5)?$ {
- fastcgi_pass PHP-fpm-pool;
- fastcgi_index index.PHP;
- include fastcgi.conf;
- }
配置结束.
来源: http://www.bubuko.com/infodetail-2870798.html