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的原因及解决办法

2011 年终总结

一晃一年又过去了,按照以前的(2010)的惯例,又到了年终总结的时候了。

关于生活

首先从生活上说起吧。基本还是单身的,看电影还是一个人的。在这一年里终于追完了老友记的全十季,当看一群生活了十年的朋友终于再次聚到一次的时候,那场面是很让人怀念的。在追完了老友记之后,我又努力看完英国长寿剧神秘博士,开始爱上科幻剧了。下半年,我又努力看完星际迷航的前2季,准备终结星际迷航系列了。之后一不小心就看到生活大爆炸,看那一群理科生和一美女的搞笑生活,知道有谢耳朵这号人物。后来,我发现有个同事有点像谢耳朵,这些暂且不表。最让人开心的是听到一些非常好听的音乐,陪我度过了这段艰难的时光。附上我喜欢的一些英文歌

关于读书

2011年初回家时,发现表姐都要嫁人了。突然感觉压力大增,真是时不待我。回家以后还赶紧的买了几本书,还特地列了一张书单2011读书计划 。现在来看这张书单觉得非常惭愧,我是真的木有看完一本书。在半年还没遇到一些人的时候,看书的效果还是很好的,后来遇到一些人之后,开始发觉时间不够用了,木有时间看书了。如果说翻完了就算看完了,那么我就算看完了吧。需要经常回去翻翻看的

Linux的基础篇: 鸟哥的Linux私房菜.基础学习篇

MYSQL优化篇:高性能MySQL(第二版)

人生苦短,接下来的,还有一大堆事情等着我做:

1. 熟悉Zend Framework框架

2. php的内核深入

3. 开始学习python语言

4. Linux 深入学习

关于跑步

现在来看我的跑步计划,从2011年3月份开始到2012年3月份,差不多365天中其中跑步95天,休息了接近270多天,其中4月份由于换工作的原因,三个月都没去跑过,2012年1月份又是忙这忙那去了,从上面的一些数据可以看出我是多么的懒惰啊,一年估计有大半年是在休息。我开始鄙视我自己了。在坚持这方面还得下大功夫,另外,这只是在试验阶段,在全套装备都没有凑齐的情况下,贸然就在大冬天的早晨起来跑步是不理智的。所以今年的计划就很简单了。凑齐一套适合夏天和冬天跑步的运动装,然后坚持就好了。

关于blog

2011年,这一年写了差不多15篇文章,主要都是一些技术方面的积累,感觉上还是有些偏少。今年得继续努力,希望会有更多的好文章。:)

PS:从博客的右侧的文章归档可以看到基本上8,9月份是半篇文章都没有写。这时候应该是我和她…(这个我不打算展开讲,暂时先用省略号。)

关于2012

2012就这么现实的来了。说来惭愧,人家写总结都是在1月1日的,不像我这,一年的开始是从3月开始算起的。按照惯例,摘抄一些文字,用来自勉。

不被嘲笑的梦想,是不值得去实现的

–2011年老罗保利剧院演讲上说的话

CentOS 6 安装Redmine

Redmine是一个灵活的项目管理web应用,采用Ruby on Rails框架开发。Redmine是典型的web 2.0网站,项目管理系统的后起之秀。Redmine支持多项目,灵活的角色权限管理,灵活的问题追踪,自动生成甘蔗图和日历,新闻,文档和文件管理,wiki,论坛,问题自定义属性,SCM集成(包括SVN,Git,CVS,Mercurial),支持多种数据库等等。

最新1.3版本要求运行环境如下:

ruby 1.8.6, 1.8.7

Rails 2.3.14

Rack 1.1.x

RubyGems <= 1.7

Rake 0.8.7

I18n 0.4.2

MySQL 5.0

服务器已经配置好LNMP运行环境,参考之前的文章快速配置LNMP环境,ok,开工了。

安装Ruby

yum install ruby

安装rubygems

yum install rubygems

安装rails,gem会自动安装rack等

gem install rails -v=2.3.14
 
Successfully installed rake-0.9.2.2
Successfully installed activesupport-2.3.14
Successfully installed activerecord-2.3.14
Successfully installed rack-1.1.3
Successfully installed actionpack-2.3.14
Successfully installed actionmailer-2.3.14
Successfully installed activeresource-2.3.14
Successfully installed rails-2.3.14
8 gems installed

查看已经安装的gem模块

gem list --local
 
*** LOCAL GEMS ***
 
actionmailer (2.3.14)
actionpack (2.3.14)
activerecord (2.3.14)
activeresource (2.3.14)
activesupport (2.3.14)
rack (1.1.3)
rails (2.3.14)
rake (0.9.2.2)

安装其他依赖环境

gem install -v=0.4.2 i18n

但是在安装mysql时报错了。

gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h
Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/mysql-2.8.1 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/mysql-2.8.1/ext/mysql_api/gem_make.out

安装ruby-dev头文件

gem install ruby-devel
yum install gcc

然后再安装mysql

yum --enablerepo=remi install mysql-devel
gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
 
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed

由于我是rmi的repo来更新mysql的,所以需要加上—enabledrepo=remi参数。你可以使用

yum install mysql-devel

基本Redmine的要求环境安装好了。现在我们来为Nginx添加Passenger模块来运行Redmine。

按照官方的说明文档来安装

gem install passenger
 
Building native extensions.  This could take a while...
Successfully installed fastthread-1.0.7
Successfully installed daemon_controller-1.0.0
Successfully installed passenger-3.0.11
3 gems installed

安装支持nginx的Passenger模块

passenger-install-nginx-module

选择 Yes: download, compile and install Nginx for me.会出现下面的提示。

 To install Curl development headers with SSL support:
   Please run yum install curl-devel as root.

根据提示安装curl-devel

yum install curl-devel

重新安装nginx的模块,会提示PCRE库没有安装

PCRE could not be downloaded

根据这篇文章Nginx Instalation : PCRE Library Not Found,手动安装PCRE库

cd /usr/local/srv
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar xvf pcre-8.21.tar.gz
cd pcre-8.21
./configure &amp;&amp; make &amp;&amp; make install

安装好PCRE库后,重新安装Passenger

passenger-install-nginx-module

由于之前已经安装了Nginx,所以我们会进行覆盖安装

nginx -V
--user=nginx --group=nginx --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf'

可以看到prefix参数安装到/usr/share/nginx,在安装的过程会询问你要安装到哪里 Please specify a prefix directory [/opt/nginx]: 默认会安装到/opt/nginx,由于之前我们安装过nginx,为了偷懒,现在修改为/usr/share/nginx 即可

替换旧版本的nginx

nginx -v 
nginx version: nginx/0.8.54
mv /usr/sbin/nginx  /usr/sbin/nginx_old_0.8.45
ln -s /usr/share/nginx/sbin/nginx /usr/sbin/nginx

链接到之前的的网站配置文件

cd /usr/share/nginx/
mv conf/ conf.bak
ln -s /etc/nginx/ conf

添加对passenger模块的支持

vim /etc/nginx/nginx.conf
http {
      ...
      passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11;
      passenger_ruby /usr/bin/ruby;
      ...
}

重新启动nginx

killall nginx
service nginx start
 
nginx -V 
 
nginx: nginx version: nginx/1.0.10
nginx: built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
nginx: TLS SNI support enabled
nginx: configure arguments: --prefix=/usr/share/nginx --with-http_ssl_module 
--with-cc-opt=-Wno-error 
--add-module=/usr/lib/ruby/gems/1.8/gems/passenger-3.0.11/ext/nginx

添加域名配置信息

cd /etc/nginx/sites-available/
vim roject.xbc.me
 
server {
    server_name project.xbc.me;
    access_log /srv/www/project.xbc.me/logs/access.log;
    error_log /srv/www/project.xbc.me/logs/error.log;
    root /srv/www/project.xbc.me/public_html/public;
    passenger_enabled on;
 
    # add expires
    location ~* \.(js|css|jpg|jpeg|gif|png)$ {
        if (-f $request_filename) {
            expires 30d;
            break;
        }
    }
}

启用project.xbc.me

cd ../sites-enabled
ln -s /etc/nginx/sites-available/project.xbc.me

创建网站文件夹

cd /srv/www
mkdir project.xbc.me
cd project.xbc.me
mkdir logs
mkdir public_html
cd ..

设置权限

chown -R nginx.nginx project.xbc.me/
chmod 755 -R project.xbc.me/

测试配置文件是否正确

nginx -t
 
nginx: the configuration file /usr/share/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/share/nginx/conf/nginx.conf test is successful

安装redmine,下载最新版本的redmine

wget http://rubyforge.org/frs/download.php/75814/redmine-1.3.1.tar.gz
tar xzf redmine-1.3.1.tar.gz
cp -r redmine-1.3.1/* .
rm -rf redmine-1.3.1*

设置文件的权限

chown -R nginx.nginx .
chmod 755 -R .

创建数据库

create database redmine character set utf8;
grant all on redmine.* to "redmine"@localhost identified by "redmine";//注意替换成你的密码
exit

退出mysql.配置redmine的数据库信息

mv config/database.yml.example config/database.yml
vim config/database.yml
 
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

生成你的session 密钥

pwd
/srv/www/project.xbc.me/public_html
 
rake generate_session_store

创建数据库

RAILS_ENV=production rake db:migrate

导入默认的配置选项

RAILS_ENV=production rake redmine:load_default_data

语言默认的选择en。重新载入nginx配置文件

service nginx reload

现在访问 http://project.xbc.me

参考网站

http://www.mike.org.cn/articles/ubuntu-install-redmine/

http://www.modrails.com/install.html

http://www.modrails.com/documentation/Users%20guide%20Nginx.html

http://stackoverflow.com/questions/4304438/mysql-failed-to-build-gem-native-extension

http://www.fedora-tunisia.org/?q=node/44

http://www.asep.us/2011/05/30/nginx-instalation-pcre-library-not-found/

http://www.redmine.org/projects/redmine/wiki/RedmineInstall