nginx出现504 Gateway Time-out的解决思路

在安装完Nginx+PHP-fpm+Mysql后 (如何安装LNMP环境,请参考快速配置LNMP环境Nginx0.8.54+MYSQL5.5.16+PHP5.3.8+CentOS 6),跑PHP的应用会经常出现504 Gateway Time-out 或者502 Bad Gateway的情况。

这个问题耽误了我差不多4个小时的时间,网上有很多前辈们的解决方法,在这里记录下解决这个问题的思路。首先这个问题主要是因为PHP的Script执行时间太长了,已经超过nginx能接受的底线。

在nginx的日志中会看到这样的log

2012/08/11 13:39:45 [error] 30788#0: *1 upstream timed out (110: Connection timed out) 
while reading response header from upstream, client: 127.0.0.1, server: www.xbc.me, 
request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.xbc.me"

在php-fpm的日志中会发现这样的log

2012/08/11 13:39:45 [error] 30788#0: *1 upstream timed out (110: Connection timed out) 
while reading response header from upstream, client: 127.0.0.1, server: www.xbc.me, 
request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.xbc.me"

一般来说,出现这样的情况是因为Nginx会从php-fpm的9000端口读取fastcgi的执行结果,等来N久都不见回复,所以就报504了。解决办法很简单,修改php的最长执行时间

; Maximum execution time of each script, in seconds; http://php.net/max-execution-time; 
Note: This directive is hardcoded to 0 for the CLI SAPI;
fix by Matt 2012.8.11
;max_execution_time = 3000

在这里我注释掉php.ini参数的时间限制。还有php-fpm里的

;request_terminate_timeout = 0

这个参数会在php.ini中max_execution_time因为某些原因不能正常工作才会生效。

之前设置的是300s,安装Magento的时候就一直就报504。后来索性修改到3000了。在Nginx的配置文件添加

#add by Matt 2012.8.11
fastcgi_read_timeout 3000;
fastcgi_connect_timeout 3000;
fastcgi_send_timeout 3000;

Magento你到底安装多少sql文件啊?

PS:有时候缓存过小也会引起504,具体情况还需要根据Nginx的日志内容来分析。修改fastcgi的缓存大小:

fastcgi_buffers 2 256k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;

参考

解决Nginx + PHP(FastCGI)遇到的502 Bad Gateway错误[原创]

安装 LNMP 的 VPS Nginx 出现 504 Gateway Time-out

nginx php fastcgi Connection reset by peer的原因及解决办法

动态添加php extension

通常情况下,在手动编译下都会添加一些常用的php模块,例如mbstring、curl等。那如果手动编译后,发现有些应用又需要添加新的php模块呢?

php官方列出了几种动态添加模块的方式:

1. 使用pear来安装pecl的模块。

2. 使用phpize来安装pecl模块。

3. 使用pecl来安装模块。

4. 重新静态编译php,添加相关的模块。

其中1和3都要求已经安装pecl或者pear模块。pecl和pear的命令参数都差不多了。使用pecl安装模块的命令如下:

/usr/local/php5.3.10/bin/pecl install apc
//卸载apc
/usr/local/php5.3.10/bin/pecl uninstall apc

不过我在使用pecl的安装模块出现了编译错误,只好使用phpize来安装。先在pecl.php.net上下载所需要的php模块,例如我需要安装apc。最新的stable版的是3.1.9。

cd /root/tmp
wget http://pecl.php.net/get/APC-3.1.9.tgz
tar xzvf APC-3.1.9.tgz
cd APC-3.1.9
/usr/local/php5.3.10/bin/phpize
./configure
make
make install

这样就安装了一个apc模块。默认情况下会安装include/php/ext/下,以我的为例就是/usr/local/php5.3.10/include/php/ext/。

参考资料

用 PEAR 编译共享 PECL 扩展库

Xampp安装PHPUnit

最近准备着手开发Magento的插件,为了保证插件的代码质量,决定采用TDD的方法进行开发。在PHP实战中看到的TDD的开发方法,突然觉得豁然开朗,开发起来一点都不费力气,现在终于有机会亲自实现了。

当然,在卷起袖子之前,还需要配置好PHPUnit的开发环境。在PHPUnit的最新版本已经迁移到自己的pear.phpunit.de网站上了。本文假设你已经配置好Xampp的开发环境,我之前的文章PHP开发环境的搭建

首先升级你的pear版本,最新PHPUnit 3.6 要求PEAR的版本较高。在开始菜单打开CMD命令行。

cd /d D:\xampp\php
pear config-show
CONFIGURATION (CHANNEL PEAR.PHP.NET):
=====================================
Auto-discover new Channels     auto_discover    1
Default Channel                default_channel  pear.php.net
HTTP Proxy Server Address      http_proxy       <not set>
PEAR server [DEPRECATED]       master_server    pear.php.net
Default Channel Mirror         preferred_mirror pear.php.net
Remote Configuration File      remote_config    <not set>
PEAR executables directory     bin_dir          D:\xampp\php
PEAR documentation directory   doc_dir          D:\xampp\php\docs
PHP extension directory        ext_dir          D:\xampp\php\ext
PEAR directory                 php_dir          D:\xampp\php\pear
PEAR Installer cache directory cache_dir        D:\xampp\php\tmp
PEAR configuration file        cfg_dir          D:\xampp\php\cfg
directory
PEAR data directory            data_dir         D:\xampp\php\data
PEAR Installer download        download_dir     D:\xampp\php\tmp
directory
PHP CLI/CGI binary             php_bin          D:\xampp\php\.\php.exe
php.ini location               php_ini          <not set>
--program-prefix passed to     php_prefix       <not set>
PHP's ./configure
--program-suffix passed to     php_suffix       <not set>
PHP's ./configure
PEAR Installer temp directory  temp_dir         D:\xampp\php\tmp
PEAR test directory            test_dir         D:\xampp\php\tests
PEAR www files directory       www_dir          D:\xampp\php\www
Cache TimeToLive               cache_ttl        3600
Preferred Package State        preferred_state  stable
Unix file mask                 umask            0
Debug Log Level                verbose          1
PEAR password (for             password         <not set>
maintainers)
Signature Handling Program     sig_bin          c:\gnupg\gpg.exe
Signature Key Directory        sig_keydir       C:\Windows\pearkeys
Signature Key Id               sig_keyid        <not set>
Package Signature Type         sig_type         gpg
PEAR username (for             username         <not set>
maintainers)
User Configuration File        Filename         C:\Windows\pear.ini
System Configuration File      Filename         C:\Windows\pearsys.ini

以上是我的pear配置文件,仅供参考,输入以下命令升级pear的版本

pear upgrade pear

查看升级后的版本

pear –V
PEAR Version: 1.9.4
PHP Version: 5.3.5
Zend Engine Version: 2.3.0
Running on: Windows NT ARTHUR-PC 6.1 build 7600 (Unknow Windows version 
Ultimate Edition) i586

升级PHPUnit的版本到3.6,pear自带的版本太低了。

pear upgrade pear/PHPUnit

出现更新失败的信息

pear/PHPUnit is already installed and is the same as the released version 1.3.2
  upgrade failed

先卸载当前的PHPUnit版本

pear uninstall pear/PHPUnit

注意设置自动添加频道

pear config-set auto_discover 1
添加PHPUnit的必要频道
pear channel-discover components.ez.no 
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com

安装PHPUnit

pear install --alldeps phpunit/PHPUnit

查看PHPUnit的版本

phpunit –V
 
PHPUnit 3.6.3 by Sebastian Bergmann.

添加pear的路径到你的环境变量,例如D:\xampp\php。这样就能直接打pear命令了。

编写你的第一个测试

cd /d D:\xampp\htdocs\dev142\tests

新建index.php文件

<?php
//This is my first test
class MyFirstTest extends PHPUnit_Framework_TestCase{ 
    public function testFirst(){
        $stack = array();
        $this-&gt;assertEquals(0,count($stack));
    }
}
?>

测试你编写的代码

phpunit index.php
PHPUnit 3.6.3 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.50Mb
 
OK (1 test, 1 assertion)

参考

http://pear.phpunit.de/

http://amiworks.co.in/talk/installing-pear-and-phpunit-on-wamp-and-windows-7/

https://github.com/sebastianbergmann/phpunit/

http://blog.lixiphp.com/windows-install-pear-phpunit/