Node.js nginx在将nodejs与express和socket.io一起使用时返回502

Node.js nginx在将nodejs与express和socket.io一起使用时返回502,node.js,nginx,socket.io,Node.js,Nginx,Socket.io,我想不出这个问题。也许有人能帮我。 我有一个node.js应用程序,它基于express.js,也使用socket.io。这个应用程序运行在nginx代理之后,直到今天,一切都正常工作。 今天我不得不重新启动服务器,从那时起,当我尝试访问该站点时,我总是得到502 以下是我的nginx配置: map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream <my_app&

我想不出这个问题。也许有人能帮我。 我有一个node.js应用程序,它基于express.js,也使用socket.io。这个应用程序运行在nginx代理之后,直到今天,一切都正常工作。 今天我不得不重新启动服务器,从那时起,当我尝试访问该站点时,我总是得到502

以下是我的nginx配置:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

upstream <my_app> {
    server <my_ip>:4567;
    keepalive 512;
}

server {
    listen 80;
    server_name <my_domain>;
    server_tokens off;
    client_max_body_size 32M;
    keepalive_timeout 10;
    large_client_header_buffers 8 32k;

    access_log  /var/log/nginx/<my_app>_access.log;
    error_log   /var/log/nginx/<my_app>_error.log;

    location ~ ^/(favicon.ico) {
        root /var/www/<my_app_root>/public;
        access_log off;
        expires max;
    }

    location / {
        proxy_next_upstream     error timeout       http_500 http_502 http_503 http_504;
        proxy_set_header        X-Real-IP           $remote_addr;
        proxy_set_header        X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header        Host                $http_host;
        proxy_set_header        X-NginX-Proxy       true;

        proxy_http_version      1.1;
        proxy_set_header        Host                $http_host;
        proxy_set_header        Upgrade             $http_upgrade;


        proxy_buffers           8                   32k;
        proxy_buffer_size       64k;

        proxy_pass              http://<my_app>;
        proxy_redirect          off;
    }
}
map$http\u升级$connection\u升级{
默认升级;
""关闭,;
}
上游{
服务器:4567;
保持512;
}
服务器{
听80;
服务器名称;
服务器_令牌关闭;
客户最大尺寸为32M;
保持激活超时10;
大客户机头缓冲区8 32k;
access_log/var/log/nginx/_access.log;
error\u log/var/log/nginx/\u error.log;
地点~^/(favicon.ico){
root/var/www//public;
访问/注销;
最大值;
}
地点/{
proxy_next_上游错误超时http_500 http_502 http_503 http_504;
代理集头X-Real-IP$remote\u addr;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$http\U主机;
proxy\u set\u头X-NginX-proxy true;
proxy_http_版本1.1;
代理设置头主机$http\U主机;
代理设置头升级$http\U升级;
代理缓存8 32k;
代理缓冲区大小64k;
代理传递http://;
代理_重定向关闭;
}
}
这是来自nginx的错误

2014/05/09 13:53:38 [error] 3093#0: *23 upstream prematurely closed connection while reading response header from upstream, client: 217.110.45.3, server: <my_domain>, request: "GET / HTTP/1.1", upstream: "http://<my_ip>:4567/", host: "<my_domain>"
2014/05/09 13:53:38[错误]3093#0:*23从上游读取响应头时,上游连接过早关闭,客户端:217.110.45.3,服务器:,请求:“GET/HTTP/1.1”,上游:“HTTP://:4567/”,主机:“
我在ubuntu 12.04上使用nginx 1.6.0版

这是在/etc/init.d/中启动应用程序的脚本:

#!/bin/bash

NODE_ENV="production"
NODE_APP="<my_app>.js"
APP_DIR="/var/www/<my_domain>"
PID_FILE=/<my_path_to_pid>/app.pid
LOG_FILE=/<my_path_to_log>/app.log
NODE_EXEC="supervisor -w /var/www/<my_domain>"

start_app (){
    if [ -f $PID_FILE ]
    then
        echo "$PID_FILE exists, App is already running or crashed"
    else
        echo "Starting App ..."
        NODE_ENV=$NODE_ENV $NODE_EXEC $APP_DIR/$NODE_APP  1>$LOG_FILE 2>&1 &
        echo $! > $PID_FILE;
    fi
}

stop_app (){
    if [ ! -f $PID_FILE ]
    then
        echo "$PID_FILE does not exist, App is not running"
    else
        echo "Stopping $APP_DIR/$NODE_APP ..."
        echo "Killing `cat $PID_FILE`"
        kill `cat $PID_FILE`;
        rm -f $PID_FILE;
        echo "App stopped"
    fi
}

case "$1" in
    start)
        start_app
    ;;

    stop)
        stop_app
    ;;

    restart)
        stop_app
        start_app
    ;;

    status)
        if [ -f $PID_FILE ]
        then
            PID=`cat $PID_FILE`
            if [ -z "`ps -ef | grep $PID | grep -v grep`" ]
            then
                echo "Node app stopped but pid file exists"
            else
                echo "Node app running with pid $PID"

            fi
        else
            echo "Node app stopped"
        fi
    ;;

    *)
        echo "Usage: /etc/init.d/node-app {start|stop|restart|status}"
    ;;
esac
#/bin/bash
NODE_ENV=“生产”
NODE_APP=“.js”
APP_DIR=“/var/www/”
PID\u文件=//app.PID
LOG\u文件=//app.LOG
NODE_EXEC=“supervisor-w/var/www/”
启动应用程序(){
如果[-f$PID\U文件]
然后
echo“$PID_文件存在,应用程序已运行或崩溃”
其他的
echo“正在启动应用程序…”
NODE_ENV=$NODE_ENV$NODE_EXEC$APP_DIR/$NODE_APP 1>$LOG_FILE 2>&1&
echo$!>$PID\u文件;
fi
}
停止应用程序(){
如果[!-f$PID\U文件]
然后
echo“$PID_文件不存在,应用程序未运行”
其他的
echo“正在停止$APP\u DIR/$NODE\u APP…”
echo“正在清除'cat$PID_文件'
杀死“cat$PID_文件”;
rm-f$PID_文件;
回显“应用程序已停止”
fi
}
案件“$1”
开始)
启动应用程序
;;
(停止)
停止应用程序
;;
重新启动)
停止应用程序
启动应用程序
;;
(状态)
如果[-f$PID\U文件]
然后
PID=`cat$PID\u文件`
如果[-z”`ps-ef | grep$PID | grep-v grep`']
然后
echo“节点应用程序已停止,但pid文件存在”
其他的
echo“使用pid$pid运行的节点应用程序”
fi
其他的
回显“节点应用程序已停止”
fi
;;
*)
echo“用法:/etc/init.d/node-app{start | stop | restart | status}”
;;
以撒

是否可能是您忘记为节点应用程序创建初始化脚本而忘记启动它?我有一个初始化脚本。也许有什么不对劲。我会把它添加到我的问题中。我想到的问题。1.您的节点应用程序在流程表中实际可见吗?2.如何确保它在端口4567上运行?3.如果端口4567已经在使用,会发生什么情况?这个问题似乎属于堆栈交换网络中的另一个站点,因为它与编程无关。也许吧。我不知道那里发生了什么,但几个小时后,网站又恢复了。很奇怪。