在ec2上使用多php fpm服务器实例运行nginx时出现连接错误

在ec2上使用多php fpm服务器实例运行nginx时出现连接错误,nginx,amazon-ec2,centos,php,Nginx,Amazon Ec2,Centos,Php,我试图在AmazonEC2上运行php5,使用nginx.conf上的上游块平衡多个分离的php fpm服务器负载。我正在使用两个t1.micro实例进行测试,但是当我尝试加载php文件时,浏览器上出现了502错误网关。(静态html文件工作正常,但无法使php文件正常工作。) 这是我的nginx错误日志 2012/07/11 12:28:21[错误]18626#0:*1 recv()失败(104:连接失败 从上游读取响应头时,由对等方重置),客户端: xxx.xxx.xxx.xxx,服务器:w

我试图在AmazonEC2上运行php5,使用nginx.conf上的上游块平衡多个分离的php fpm服务器负载。我正在使用两个t1.micro实例进行测试,但是当我尝试加载php文件时,浏览器上出现了502错误网关。(静态html文件工作正常,但无法使php文件正常工作。)

这是我的nginx错误日志

2012/07/11 12:28:21[错误]18626#0:*1 recv()失败(104:连接失败 从上游读取响应头时,由对等方重置),客户端: xxx.xxx.xxx.xxx,服务器:www.example.com,请求:“GET/HTTP/1.1”, 上游:“fastcgi://10.xxx.xxx.xxx:9000,主机:“www.example.com”

有时我也会这样

2012/07/11 13:25:51[错误]1157#0:*4上游提前关闭 从上游读取响应头时的连接, 客户端:xxx.xxx.xxx.xxx,服务器:www.example.com,请求:“获取”/ HTTP/1.1“,上游:fastcgi://10.xxx.xxx.xxx:9000“,主持人: “www.example.com”

我花时间从ec2 Sequerity Group/iptables打开9000个端口,并在nginx和php fpm上声明本地ip地址,所以我认为这不是问题。(我以前有连接被拒绝的错误日志)

有人能帮我吗?? 下面是我的服务器设置和首选项

[实例1]

  • t1.micro CentOS 6.2.2
  • nginx/1.2.2
[实例2]

  • t1.micro CentOS 6.2.2
  • PHP 5.3.14(fpm fcgi)Zend Engine v2.3.0和eAccelerator v0.9.6
[nginx.conf]

user  nginx nginx;
worker_processes  1;
worker_rlimit_nofile 1024;
worker_priority -5;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    multi_accept on;
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    server_tokens   off;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  0;

    gzip  on;

    upstream apserver {
        ip_hash;
        server ip-10-xxx-xxx-xxx.ap-northeast-1.compute.internal:9000;
    }

    include /etc/nginx/conf.d/*.conf;
}
upstream apserver {
    ip_hash;
    server 10.xxx.xxx.xxx:9000;
}
[示例.conf]

server {
    listen       80;
    server_name  www.example.com;

    charset utf-8;
    access_log  /var/log/nginx/www.example.com.access.log  main;
    error_log   /var/log/nginx/www.example.com.error.log  debug;
    root    /var/www;

    location / {
        index   index.php index.html index.html;
        if (-f $request_filename) {
            expires max;
            break;
        }

        if (!-e $request_filename) {
            rewrite ^(.+)/index\.php/(.*)$ $1/index.php?q=$2 last;
        }
    }

        location ~ \.php$ {
        fastcgi_send_timeout  10m;
            fastcgi_read_timeout 10m;
        fastcgi_connect_timeout 10m;
        fastcgi_pass    apserver;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        fastcgi_param   PATH_INFO       $fastcgi_script_name;
        include     /etc/nginx/fastcgi_params;
    }
}
[php fpm.d/www.conf]

[www]
listen = ip-10-xxx-xxx-xxx.ap-northeast-1.compute.internal:9000
listen.backlog = -1
listen.allowed_clients = ip-10-yyy-yyy-yyy.ap-northeast-1.compute.internal

; Tried testing with below and got the same error
;listen = 9000
;listen.allowed_clients = any

listen.owner = prod
listen.group = prod
listen.mode = 0666
user = prod
group = prod

pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500

request_terminate_timeout = 30
request_slowlog_timeout = 2
slowlog = /var/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_flag[expose_php] = off
[www]
listen = 10.xxx.xxx.xxx:9000
listen.backlog = -1
listen.allowed_clients = 10.yyy.yyy.yyy

我终于明白了

我仍然不知道为什么,但通过在我的每个实例上分配弹性ip,并使用私有ip而不是私有DNS地址,解决了我的问题

所以我的conf文件现在看起来像这样以防万一

[nginx.conf]

user  nginx nginx;
worker_processes  1;
worker_rlimit_nofile 1024;
worker_priority -5;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    multi_accept on;
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    server_tokens   off;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  0;

    gzip  on;

    upstream apserver {
        ip_hash;
        server ip-10-xxx-xxx-xxx.ap-northeast-1.compute.internal:9000;
    }

    include /etc/nginx/conf.d/*.conf;
}
upstream apserver {
    ip_hash;
    server 10.xxx.xxx.xxx:9000;
}
[php fpm.d/www.conf]

[www]
listen = ip-10-xxx-xxx-xxx.ap-northeast-1.compute.internal:9000
listen.backlog = -1
listen.allowed_clients = ip-10-yyy-yyy-yyy.ap-northeast-1.compute.internal

; Tried testing with below and got the same error
;listen = 9000
;listen.allowed_clients = any

listen.owner = prod
listen.group = prod
listen.mode = 0666
user = prod
group = prod

pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500

request_terminate_timeout = 30
request_slowlog_timeout = 2
slowlog = /var/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_flag[expose_php] = off
[www]
listen = 10.xxx.xxx.xxx:9000
listen.backlog = -1
listen.allowed_clients = 10.yyy.yyy.yyy

谢谢

日志里有什么?您的php脚本可能是针对php fpm的segfaulting.logs?我没有收到日志级别为“notice”的php fpm的错误日志。我可以从CLI运行php文件,但是否仍有可能获得SEGFULTS?php服务器上的文档根目录是否与Nginx服务器上的文档根目录不同?我仔细检查了一遍,但似乎我有正确的权限。。。无论如何谢谢你!