Nginx环境下的upstream模式php-cgi负载均衡的尝试

昨天突然间打开http://fengzi.org特别慢,由于http://fengzi.org是伪静态的,这说明PHP脚本出了问题。

netstat -anpo | grep “php-cgi” | wc -l 查了一下,发现同时请求的php-cgi程序竟然有165个。仔细想了一下,产生该问题的原因可能是php-cgi.sock处理过慢,和PHP本身的问题造成的。

Nginx的fastcgi处理模式有两种,一种是通过sock来处理,另一种是通过fastcgi的端口来处理。sock的处理虽然相比fastcgi能慢一点,但是相对稳定。下面我们要做的就是给fastcgi做本地均衡,来同享php-cgi.sock和fastcgi端口模式的优点。

具体的做法是,首先拷贝4组php-fpm.conf的配置样本

[root@ido etc]# cp php-fpm.conf php-fpm-9000.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9001.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9002.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9003.conf

修改php-fpm9000.conf,监听地址和子进程如下<value name=”listen_address”>127.0.0.1:9000</value> <value name=”max_children”>0</value>。其他三个文档以此类推。

给Nginx.conf添加upstream,以支持php-cgi(php-fpm)的本地均衡。

                upstream king {
                server 127.0.0.1:9000;
                server 127.0.0.1:9001;
                server 127.0.0.1:9002;
                server 127.0.0.1:9003;
                }
同样,server里的location加上proxy_pass

                location ~ .*\.(php|php5)?$
                        {
                                proxy_pass  http://king;
                                fastcgi_pass  unix:/tmp/php-cgi.sock;
                                #fastcgi_pass  127.0.0.1:9000;
                                fastcgi_index index.php;
                                include fcgi.conf;
                        }

手动添加四组php-cgi均衡均衡脚本

[root@ido ~]#  /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9000.conf

[root@ido ~]#  /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9001.conf

[root@ido ~]#  /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9002.conf

[root@ido ~]#  /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9003.conf

重启nginx,观察了一下,网站运转良好,速度也很快也很稳定,但是内存占用很大。

PS. 用netstat -an | grep 9000 发现该端口一直是监听状态,并没有使用。所以我怀疑这次尝试很可能是无意义的或者是失败的。

深究Nginx502 bad gateway, 504 Gateway Time-out的彻底解决

我的VPS是256M的内存,CPU是四核心的,所以更多的我会在乎内存。而在我调试服务器的时候通常会遇到Nginx502 bad gateway和504 Gateway Time-out的错误。分析nginx.conf我发现server和fastcgi的buffers过多,导致fastcgi请求的数量过大,php-fpm无法及时处理而出错。循此思路我们可以再总体buffers不变的情况下减少请求数量,具体的ningx.conf改动细节如下:
                server_names_hash_bucket_size 128;
                client_header_buffer_size 32k;
                large_client_header_buffers 1 128k;# 4 32k
                client_max_body_size 8m;

                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 128k;
                fastcgi_buffers 2 256k;#8 128
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                fastcgi_intercept_errors on;

                gzip on;
                gzip_min_length  1k;
                gzip_buffers     1 64k; #4 16
                gzip_http_version 1.0;
                gzip_comp_level 2;
                gzip_types       text/plain application/x-javascript text/css application/xml;
                gzip_vary on;

另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。
        <value name=”style”>apache-like</value>

从更改完毕到现在的测试表明上述方式的效果还是很明显的,并没有发现一次Nginx502 bad gateway或504 Gateway Time-out错误。当然,如果你的VPS或者服务器的性能足够好可以根据具体情况不必做无谓的改动。

LNMP-LNMPz-最新Linux下的Nginx+MySQL+PHP+phpMyAdmin+eAcelerator+Zend Optimizer一键安装包

2010年3月17日发布升级文件update.sh

适合所有安装过本LNMP的服务器,文件打包于LNMP.zip

2010年3月14日晚发布1.0正式版本,更新如下:

1.增加FTP管理员账户(提示输入)和密码

2.增加MYSQL管理员账户提示输入密码

3.完善主机系统,完整添加新域名的FTP用户、MYSQL用户以及PHPMYADMIN

4.新版本系统更加安全,修正其他小问题

计划:

1.用pureftp替换目前VSFTP,以便为用户划分磁盘份额

2.增加WEB交互友好界面,让管理员运用自如

历次改版:

2010年1月28日上午改版,增加VSFTPD自动安装;增加PHP安全性能自动配置;

修正主机域名问题,修正添加主机问题。

2010年1月2日上午改版,增加SHTML支持,增加虚拟主机管理系统。

==============================全新安装开始==================================

 

全新安装:

首先声明,该LNMP一键安装包并非我个人的原创。本人接触Linux刚2个星期,对于Linux 的很多细节都不甚了解。

LNMP是本人根据张宴Licess的LNMP改

写而成,并经过本人的测试成功后才发布的。因此,这个LNMP上有很多前辈的身影。之所以发布出来,是本着共享的精神,也是希望更多的人能用上最新版本的Nginx+MySQL+PHP+phpMyAdmin+eAcelerator+Zend optimizer这些软件。

目前已经有超过200台服务器运用该LNMP软件包,且本人在THENYNOCBURSTNET的VPS上都以做过测试,运行良好。言归正传,开始本LNMP的正式介绍。

VPS重装后,运行yum update进行系统升级。

运行cd /usr/src

接着下载本LNMP一键安装包 wget http://fengzi.org/LNMP.zip

解压缩 unzip LNMP.zip

进入该目录 cd LNMP

给脚本赋权 chmod +x down.sh install.sh opt.sh startup.sh addhost.sh

进行下载和安装

执行./down.sh

执行./install.sh

安装到最后的Zend optimizer时需要确认,在php.ini的location时填写 /usr/local/php/etc/ 然后询问服务器是否是apache时选NO,因为我们用的是Nginx :)

运行完毕后,进行优化,命令: ./opt.sh 最后开机运行 ./startup.sh

 

完毕。

 

这样就可以上传网站了。

程序安装路径:
MySQL :   /usr/local/mysql
PHP :     /usr/local/php
Nginx :   /usr/local/nginx
PHPMyAdmin /web/www/phpmyadmin
Web目录    /web/www

添加虚拟主机与用户:

登陆SSH后用户默认的路径在/root/里 若不在此目录直接cd回车

运行./addhost.sh         里面有提示添加虚拟主机

添加后会显示用户的密码等信息。

更多交流请到LINUX-PHP群讨论: 8707379

注意:MYSQL数据库用户名root密码为你初始设置的密码,登陆后进入mysql数据库,找到user表,删除除了有root密码外的所有用户。

==============================全新安装结束==================================

 

==============================旧版本升级开始===================================

旧版本升级:

(适合所有曾经安装过本LNMP软件包的服务器)

cd /usr/src

rm -fr  LNMP*

wget  http://fengzi.org/LNMP.zip

unzip LNMP.zip

cd LNMP

sh update.sh

这样就可以了。

注意:

1.安装ZEND的时候询问php.ini目录时需要更改成/usr/local/php/etc/

2.升级过程中会根据服务器的状况停止WEB约30分钟,全新安装不必升级。

 

==============================旧版本升级结束===================================

彻底解决Nginx 504 Gateway Time-out的一种途径[原创]

昨天刚装的LNMPZ一键安装包,今天调试参数的时候发现Nginxp频繁出现504 Gateway Time-out错误,也参阅了网上的文章,诸如做8组较大的        large_client_header_buffers 8 128k;  但是问题仍没有解决。

要彻底解决Nginx 504 Gateway Time-out,还得从源头分析产生Nginx 504 Gateway Time-out的原因。504 Gateway Time-out产生的主要原因是PHP脚本执行时间过长造成的。一方面是由于处理时的缓存不够大,这通常用网上所说的增加8组较大的缓存可以解决;另一方面则是PHP脚本自身的问题,导致死循环或者无法释放。解决该问题的方法则是让PHP有个最大的执行时间。

我的具体做法是在php-fpm.conf里修改最大请求时间,把默认的0s改成30s,即<value name=”request_terminate_timeout”>30s</value>
这样再重启php-cgi,问题解决。

解决Starting MySQL. ERROR! Manager of pid-file quit without updating file.

用了自己编写的LNMP一键安装包后发现MYSQL无法启动,提示Starting MySQL. ERROR! Manager of pid-file quit without updating file.错误。
查看MYSQL的错误日志时发现
[ERROR] /usr/local/mysql/libexec/mysqld: unknown option ‘–skip-federated’
原来可能是MYSQL版本提高了,不再支持–skip-federated这个参数了,解决方法是到/etc/my.cnf把skip federated注释掉,[root@www bin]# service mysql start
Starting MySQL. SUCCESS! 搞定!

解决nginx 502 bad gateway错误的另一个思路[原创]

导致nginx 502 bad gateway的PHP-CGI(FASTCGI)

导致nginx 502 bad gateway的PHP-CGI(FASTCGI)

NGINX频爆502 BAD GATEWAY的错误,看了网上的教程,仍没有彻底解决。
目前我总结的解决502 BAD GATEWAY的方式有:
1.视服务器的性能,在php-fmp.conf里增加max_children的值,我目前用的15.
2.用reload参数定时重载php-fpm。这个主要原因是php脚本执行时间过长造成的,重载php-fpm能杜绝这个问题。如何彻底解决php-cgi脚本占用大量内存从而导致502错误的产生还值得进一步探讨,目前该做法不失为一种好办法。
具体的做法是,用crontab让php-fpm平滑重启,从而不影响PHP脚本的运行。
*/10 * * * * /usr/local/php/sbin/php-fpm reload

理发

等待无异于浪费生命。

等车

想了很多,感觉自己很少想问题。
有很多的事情等着我去做,也有很多的想法等着我去实现。一步一步,去创造生活,享受生活。

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!

   Newer→