nginx fpm 常见错误对比分析

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=0 // php-fpm.conf

sleep(10);

浏览器 8 秒后返回 504 Gateway Time-out

nginx-error.log
upstream timed out (110: Connection timed out) while reading response header from upstream

 

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=5 // php-fpm.conf

sleep(10);

浏览器 5 秒后返回 502 Bad Gateway

nginx-error.log
recv() failed (104: Connection reset by peer) while reading response header from upstream
fpm-error.log
[pool www] child 5378, script ‘/usr/share/nginx/html/sleep.php’ (request: “GET /sleep.php”) execution timed out (5.793874 sec), terminating

 

fastcgi_read_timeout 8; // nginx.conf
request_terminate_timeout=5 // php-fpm.conf

set_time_limit(1);
while(true){}

浏览器返回 500 Internal Server Error
php-error.log
[08-Apr-2017 23:39:44 Asia/Shanghai] PHP Fatal error: Maximum execution time of 1 second exceeded in /usr/share/nginx/html/while_true.php on line 3

配置 nginx 访问 http 自动跳转 https

昨晚在 wosign 申请了个2年的 ssl 证书,很快就部署好了。

今天配置了下,让访问 http 的 url 自动跳转到 https。

相关配置如下即可:

listen 80;
listen 443 ssl;
ssl_certificate /PATH_TO_CRT;
ssl_certificate_key /PATH_TO_KEY;
server_name upliu.net;
if ($scheme != https) {
    rewrite ^/(.*) https://$server_name/$1 permanent;
}

同时监听 80 和 443 端口,并且给 443 端口加上 ssl 支持。当访问不是通过 https 过来的,则重定向到 https 的路径。

nginx + php-fpm 开启 PATH_INFO 模式

很多框架默认路由都是 PATH_INFO 模式,比如默认在 Apache 并且没有 rewrite 时,CodeIgniter 一般可以这样访问 /index.php/controller/action ,那么 nginx 和 php-fpm 如何设置支持 PATH_INFO 模式呢?

php.ini 中一个与 PATH_INFO 有关的设置是 cgi.fix_path 默认为 1,我们将其设置为 0。

php.ini 设置:

cgi.fix_path = 0

接下来是 nginx 配置:

location ~ \.php($|/) {
# 下面这一行设置 $fastcgi_script_name 和 $fastcgi_path_info 的值,具体请看 nginx 文档
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
# 下面这行也可以为 fastcgi_pass unix:/var/run/php-fpm.sock 看你的 fpm 设置了
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    include        fastcgi_params;
# 下面这行不能少默认 fastcgi_params 里面并没有 SCRIPT_FILENAME 
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO          $fastcgi_path_info;
}

看官如有疑问,请在下面留言,希望对您有帮助。

相关链接:

新置 vps

前两天将博客放在 SAE 上,速度实在是感觉太慢了。昨晚准备写文一篇时,后台编辑文章竟然都加载不出来,于是购买了一年的 vps,199 元每年,256M 内存,感觉速度还不错。

选择系统的时候安装的是 centos5.5,源里自带的 php mysql,我觉得版本太低,于是,下载源码编译安装,折腾了 2 个小时,最终还是没搞定。编译安装 nginx 倒是很简单。第一次编译 php 时,默认 ./configure 没带任何参数,成功编译安装完成,后想到,需要 enable-fpm 选项啊,于是重新编译。再一次编译的时候 enable 其它一些东西,就出现一些库和依赖,搞烦我了。而下载 mysql 也启动不起来。最终换了 ubuntu 12.04 系统。ubuntu 多爽,一条命令装好所有需要的东西:

sudo apt-get install mysql-server nginx php5 php5-fpm php5-cli php5-gd php5-mcrypt php5-curl

接下来就是配置 nginx 了。先将博客所有文件复制过来,数据库导入,为了方便,网站根目录我放在了 /root/vhosts/upiu.net 下,访问,提示没权限。将 upliu.net 文件夹所有者改为 www-data 问题依旧。再将 upliu.net 权限改为 777 ,还是提示没权限。G 上搜索了一会,后来终于找到问题所在,upliu.net 文件夹权限设置没有问题,但是 www-data 用户没有访问上一层文件夹的权限,/root 和 /root/vhosts 这两个文件夹所有者为 root,www-data 当然无法读取了。

您觉得新主机速度怎么样?

update:2013-11-08 15:27:24 >>>>>>>>>>>

发现如果多刷新几下博客,就会响应很慢很慢,甚至出现 504 gateway time out 错误,php5-fpm 占用内存过大,导致系统反应慢,就连 ssh 都几乎没有响应。将 php5-fpm service 重启一下就好了。暂时解决办法:加了个定时任务,每隔一小时重启一下 php5-fpm 服务。

nginx php5-fpm 出现 Access denied

今天我想让 phps 后缀的文件显示其源代码。网上搜索之,按照这里的修改:

location ~ \.phps$ {
    fastcgi_pass backend;
    fastcgi_param  DOCUMENT_ROOT    $document_root;
    fastcgi_param  SCRIPT_NAME      $uri;
    fastcgi_param  SCRIPT_FILENAME  /path/to/hightlight_source.php;
}

结果访问 phps 文件出现 Access denied.

查看错误日志,发现是 security.limit_extensions 配置的问题。

修改 /etc/php5/fpm/pool.d/www.conf ,修改配置为以下即可:

security.limit_extensions = .php .phps

同理,如果你想让 php5-fpm 处理后缀文件,在该行配置下添加相应后缀名即可。
感悟:看错误日志对于排错帮助很大,找到错误之处后再在网上找相应内容一般都能解决问题。