代码之家  ›  专栏  ›  技术社区  ›  Axil

自动重启或正确处理插座。linux中的io服务器异常

  •  4
  • Axil  · 技术社区  · 10 年前

    我有我的插座。io服务器在后台运行。然而,有几种情况下它死亡了。我能做什么来做我的插座。io服务器在其死亡或终止时自动重新启动。

    这是我启动节点服务器的方式

    > node server &
    

    然而,服务器抛出一个异常并死亡。

    events.js:141
          throw er; // Unhandled 'error' event
          ^
    
    Error: Redis connection to pub-redis-us-east1-garantiabata.com:12087 failed - connect ETIMEDOUT 54.179.28.165:12087
        at RedisClient.on_error (/home/org-chatserver/node_modules/redis/index.js:185:24)
        at Socket.<anonymous> (/home/org-chatserver/node_modules/redis/index.js:95:14)
        at emitOne (events.js:77:13)
        at Socket.emit (events.js:169:7)
        at emitErrorNT (net.js:1253:8)
        at doNTCallback2 (node.js:450:9)
        at process._tickCallback (node.js:364:17)
    ^C
    

    这是我的环境

    Linux version 2.6.32-042stab090.5 (root@kbuild-rh6-x64) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Sat Jun 21 00:15:09 MSK 2014
    

    我相信我的团队正在使用这个:

    https://github.com/jbavari/ionic-socket.io-redis-chat
    
    3 回复  |  直到 10 年前
        1
  •  2
  •   Tan Hong Tat    10 年前

    您可以使用Supervisor- http://supervisord.org

    Supervisor是一个客户机/服务器系统,允许其用户监视和控制类UNIX操作系统上的多个进程。

    安装后,为您的应用程序创建一个监控配置文件。

    例如,在 /etc/supervisor/conf.d/myserver.conf -

    [program:my-server]
        command=node /path/to/server.js
        numprocs=1
        autostart=true  
        autorestart=true
        startretries=99999
        environment=NODE_ENV=production  
        stderr_logfile=/var/log/my-server.err.log  
        stdout_logfile=/var/log/my-server.log  
        user=myuser  
    

    编辑主管主配置文件- /etc/supervisor/supervisord.conf

    [unix_http_server]
    file=/var/run/supervisor.sock    ; (the path to the socket file)
    chmod=0700                       ; socket file mode (default 0700)
    
    [supervisord]
    logfile=/var/log/supervisor/supervisord.log ; (main log file;default    ] $CWD/supervisord.log)
    pidfile=/var/run/supervisord.pid            ; (supervisord pidfile;default supervisord.pid)
    childlogdir=/var/log/supervisor             ; ('AUTO' child log dir, default $TEMP)
    
    ; the below section must remain in the config file for RPC
    ; (supervisorctl/web interface) to work, additional interfaces may be
    ; added by defining them in separate rpcinterface: sections
     [rpcinterface:supervisor]
    supervisor.rpcinterface_factory =  supervisor.rpcinterface:make_main_rpcinterface
    
    [supervisorctl]
    serverurl=unix:///var/run//supervisor.sock ; use a unix:// URL  for a unix socket
    
    ; The [include] section can just contain the "files" setting.  This
    ; setting can list multiple files (separated by whitespace or
    ; newlines).  It can also contain wildcards.  The filenames are
    ; interpreted as relative to this file.  Included files *cannot*
    ; include files themselves.
    
    [include]
    files = /etc/supervisor/conf.d/*.conf
    

    用法: /etc/init.d/supervisord {start|stop|restart|force-reload|status|force-stop}

    有关更多信息/文档,请阅读 http://supervisord.org/

        2
  •  0
  •   hankchiutw    10 年前

    您可以使用 pm2 监控日志、自动重启等。例如:

    sudo npm install -g pm2
    pm2 start app.js --watch
    

    更多关于 watch & restart .

        3
  •  -1
  •   UndeadKernel    10 年前

    为了让服务器重新连接,您可能需要使用一些程序(比如forever)来检查服务器的状态,并在服务器死机时重新启动它。然而,这并不能解决客户的问题。当服务器死机时,客户端还需要重新初始化与服务器的连接。让我向您展示一个如何让客户机连接回服务器的最小示例。

    主要思想是,您将侦听来自客户端套接字的“关闭”事件,并在需要时重新启动连接。让我们使用OOP来更好地说明这一点。

    function Connector(host, port)
    {
      // Connection parameters
      this.host = host;
      this.port = port;
    
      this.socket = null;
    
      // Attempt to establish a connection with the server.
      this._connect();
    }
    
    Connector.prototype._connect = function()
    {
      this.socket = net.connect(this.port, this.host);
    
      this.socket.on('connect', this._onConnect);
      this.socket.on('error', this._onError);
      this.socket.on('close', this._onClose);
      this.socket.on('data', this._onData);
    }
    
    
    Connector.prototype._onConnect = function()
    {
      console.log('Incoming connection');
    }
    
    Connector.prototype._onError = function(err)
    {
      console.error('Connection error: ' + err);
    }
    
    Connector.prototype._onClose = function(had_error)
    {
      console.log('Reconnecting to server.');
      self._scheduleReconnection();
    }
    
    
    Connector.prototype._scheduleReconnection = function()
    {
      self.socket.removeAllListeners();
      self.socket = null;
    
      // Try to connect to the server again after 2 seconds.
      setTimeout(self._connect.bind(self), 2000);
    }
    
    Connector.prototype._onData = function(data)
    {
      console.log('Incoming data.')
    }
    

    使用Connector对象,您现在可以开始连接:

    connection = new Connector(127.0.0.1, 8080)
    

    你知道这个连接会不断地尝试与服务器保持连接。