记一次nginx 504超时

2014-05-30 09:34:33 查看评论 2168 人阅读    

公司使用的是haproxy做负载均衡,nginx+php+mysql的架构。由于后台有一个导入用户的功能需要执行的时间很长,页面上报错了504 Gateway Time-out。

关于504的说明

服务器(不一定是 Web 服务器)正在作为一个网关或代理来完成客户(如您的浏览器或我们的 CheckUpDown 机器人)访问所需网址的请求。
为了完成您的 HTTP 请求, 该服务器访问一个上游服务器, 但没得到及时的响应。
这通常意味着上游服务器已关闭(不响应网关 / 代理),而不是上游服务器和网关 / 代理在交换数据的协议上不一致。


因为使用量不大以及是内部人员使用的,懒得用队列之类的了。所以想着修改nginx的超时时间,让程序执行时间长一点。

修改nginx的配置文件。在http{}中增加以下配置

#fastcgi的超时配置,(针对后端的fastcgi 生效, fastcgi 不属于proxy模式)

fastcgi_connect_timeout 5;     #连接超时
fastcgi_send_timeout 300;      #写超时
fastcgi_read_timeout 300;      #读取超时

#Proxy: (针对proxy/upstreams的生效)

proxy_connect_timeout 15s;      #连接超时
proxy_read_timeout 300s;        #读超时
proxy_send_timeout 300s;        #写超时

另外配置php-fpm的超时时间

request_terminate_timeout = 300

重启nginx和php-fpm。


本来以为就大功告成了,没想到还是返回504超时。使用chrome查看超时时间为50s。查看nginx的错误日记也没找到超时的错误。

分类: Nginx/Apache 标签: haproxy 504 timeout

[转] phpredis扩展的下载地址

2014-05-16 09:59:39 查看评论 1064 人阅读    

phpredis是个人觉得最好的一个php-redis客户端,因为其提供的function与redis的命令基本一致,降低的了学习成本,同时功能也很全面。

一。linux安装方法

phpredis下载地址:https://github.com/nicolasff/phpredis

 

unzip phpredis-master.zip 

cd phpredis-master

/usr/local/php5/bin/phpize

./configure --with-php-config=/usr/local/php5/bin/php-config

make 

make install

 

vi /usr/local/php5/etc/php.ini

加入

extension=redis.so

 

保存后重启Apache,如果是连接的nginx,则需要重启php-fpm。

 

二。windows安装方法

从网上直接下载编译好的dll文件即可,一定要选择和php对应的版本。

php_redis-5.5-vc11-ts-x86-00233a.zip http://d-h.st/4A5
php_igbinary-5.5-vc11-ts-x86-c35d48.zip http://d-h.st/QGH

 

php_redis-5.5-vc11-nts-x86-00233a.zip http://d-h.st/uGS
php_igbinary-5.5-vc11-nts-x86-c35d48.zip http://d-h.st/bei

 

php_redis-5.5-vc11-ts-x64-00233a.zip http://d-h.st/1tO
php_igbinary-5.5-vc11-ts-x64-c35d48.zip http://d-h.st/rYb

 

php_redis-5.5-vc11-nts-x64-00233a.zip http://d-h.st/N0d
php_igbinary-5.5-vc11-nts-x64-c35d48.zip http://d-h.st/c1a

 

下载后将php_igbinary.dll和php_redis.dll放入php的ext目录下,

然后修改php.ini,加入这两个扩展,注意顺序不要反了。

extension=php_igbinary.dll

extension=php_redis.dll

注:之前版本的不需要安装igbinary, 所以第一次安装的时候我没下载,导致php扩展加载失败。

重新启动Apache即可。

转载地址:http://www.iteye.com/topic/1132714

分类: PHP 标签:

Sublime Text3 + Golang搭建开发环境

2014-05-09 11:07:47 查看评论 16042 人阅读    

        本次安装是基于win8 x64系统,sublime text3,Golang1.4.2。


1.安装git

    因为golang是通过git来管理远程包的,所以我们首先要安装git,下载地址:http://www.git-scm.com/download/

git安装比较简单,直接下一步即可(在Windows Explorer integration选项中将“Git Bash here”和“Git GUI here”打对勾),需要了解具体安装的可以看这里



2.安装Golang

    1) 首先到https://golang.org/dl/选择适合你系统的安装包,(墙内:http://golangtc.com/download)。

    2)我这里选择的是:go1.4.2.windows-amd64.msi,下载完成安装到指定目录即可。我这里是(E:\Go)。

    3)安装完成后环境变量已经自动设置好了,可以呼出cmd命令行输入命令查看

> go env


blob.png

分类: 随笔 标签: sublime golang

imagepng压缩等级(quality)

2014-05-06 16:01:51 查看评论 2585 人阅读    

bool imagepngresource $image [, string $filename [, int $quality ]] )

今天在使用imagepng输出图片的,发一个错误 Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib error.
然后网上搜索了一下,说到quality参数错误了,5.1以前版本的是0-99, 然后5.1以后改为0-9了,这个参数指的是图片的压缩等级.
超出这个0-9这个范围就会提示上述错误.
看下官方的解释吧:
   
Compression level: from 0 (no compression) to 9.
 
数值越大,压缩得越大,不过注意不要超过9. 


以下是网上找来的一段测试:

原图体积是125k,现在我想看看在不同的等级压缩下会得到什么样的结果。如下为测试记录。

imagepng($img,null,0); --> Size = 225K
imagepng($img,null,1); --> Size = 85.9K
imagepng($img,null,2); --> Size = 83.7K
imagepng($img,null,3); --> Size = 80.9K
imagepng($img,null,4); --> Size = 74.6K
imagepng($img,null,5); --> Size = 73.8K
imagepng($img,null,6); --> Size = 73K
imagepng($img,null,7); --> Size = 72.4K
imagepng($img,null,8); --> Size = 71K
imagepng($img,null,9); --> Size = 70.6K

我不明白的是为什么压缩等级为0时,它的体积反而变大了?

我们在优化的时候,一般采用2等级比较合适,图片没有失真,但体积减少了30%,达到优化的目的了。如果采用6、7、8、9等级压缩的话,图片有所失真,
所以不宜采用这些等级进行压缩优化图片。

我们看看老外是怎么解释这个现象的:

The result seems accurate since 0 means no compression

quality Compression level: from 0 (no compression) to 9.

It's normal for the 0ed file to be larger than the original (that can be slightly compressed to begin with). You need to understand file compression and PHP GD image constructor.

老外的解释有没有道理呢?他认为原始图片其实是经过了轻微的压缩,而0等级的压缩就是一点压缩都没有,所以它的体积会大于原始图片。我感觉此话不无道理。 

分类: PHP 标签:

[转]Mongodb的常用操作

2014-05-06 15:27:07 查看评论 670 人阅读    

一、查询

find方法

db.collection_name.find();

查询所有的结果:

select * from users;

db.users.find();

指定返回那些列(键):

select name, skills from users;

db.users.find({}, {'name' : 1, 'skills' : 1});

补充说明: 第一个{} 放where条件 第二个{} 指定那些列显示和不显示 (0表示不显示 1表示显示)

where条件:

1.简单的等于:

select name, age, skills from users where name = 'hurry';

db.users.find({'name' : 'hurry'},{'name' : 1, 'age' : 1, 'skills' : 1});

2.使用and

select name, age, skills from users where name = 'hurry' and age = 18;

db.users.find({'name' : 'hurry', 'age' : 18},{'name' : 1, 'age' : 1, 'skills' : 1});

3.使用or

select name, age, skills from users where name = 'hurry' or age = 18;

db.users.find({ '$or' : [{'name' : 'hurry'}, {'age' : 18}] },{'name' : 1, 'age' : 1, 'skills' : 1});

4.<, <=, >, >= ($lt, $lte, $gt, $gte )

select * from users where age >= 20 and age <= 30;

db.users.find({'age' : {'$gte' : 20, '$lte' : 30}});

5.使用in, not in ($in, $nin)

select * from users where age in (10, 22, 26);

db.users.find({'age' : {'$in' : [10, 22, 26]}});

6.匹配null

select * from users where age is null;

db.users.find({'age' : null);

7.like (mongoDB 支持正则表达式)

select * from users where name like "%hurry%";

db.users.find({name:/hurry/}); 

select * from users where name like "hurry%";

db.users.find({name:/^hurry/}); 

8.使用distinct

select distinct (name) from users;

db.users.distinct('name');

9.使用count

select count(*) from users;

db.users.count();

10.数组查询 (mongoDB自己特有的)

如果skills是 ['java','python']

db.users.find({'skills' : 'java'}); 该语句可以匹配成功

$all

db.users.find({'skills' : {'$all' : ['java','python']}}) skills中必须同时包含java 和 python 

$size

db.users.find({'skills' : {'$size' : 2}}) 遗憾的是$size不能与$lt等组合使用

$slice

db.users.find({'skills' : {'$slice : [1,1]}})

两个参数分别是偏移量和返回的数量

11.查询内嵌文档 

db.postings.find( { "author.name" : "joe" } );

注意用法是author.name,用一个点就行了。

举个例子:

> db.blog.save({ title : "My First Post", author: {name : "Jane", id : 1}})

如果我们要查询 authors name 是Jane的, 我们可以这样:

> db.blog.findOne({"author.name" : "Jane"})

如果不用点,那就需要用下面这句才能匹配:

db.blog.findOne({"author" : {"name" : "Jane", "id" : 1}})

下面这句:

db.blog.findOne({"author" : {"name" : "Jane"}})

是不能匹配的,因为mongodb对于子对象,他是精确匹配。

12.强大的$where查询

db.foo.find();                   
{ "_id" : ObjectId("4e17ce0ac39f1afe0ba78ce4"), "a" : 1, "b" : 3, "c" : 10 }
{ "_id" : ObjectId("4e17ce13c39f1afe0ba78ce5"), "a" : 1, "b" : 6, "c" : 6 }

如果要查询 b = c 的文档怎么办?

> db.foo.find({"$where":function(){

    for(var current in this){
        for(var other in this){
            if(current != other && this[current] == this[other]){
                return true;    
            }
        }
    }
    return false;

}});

 

{ "_id" : ObjectId("4e17ce13c39f1afe0ba78ce5"), "a" : 1, "b" : 6, "c" : 6 }

分类: Nosql 标签: