Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在upstart中正确启动节点服务器,以便apn正常工作_Linux_Node.js_Upstart_Apn Node - Fatal编程技术网

Linux 如何在upstart中正确启动节点服务器,以便apn正常工作

Linux 如何在upstart中正确启动节点服务器,以便apn正常工作,linux,node.js,upstart,apn-node,Linux,Node.js,Upstart,Apn Node,当我通过node server.js从命令行运行服务器时,它的运行方式与使用upstart脚本启动时不同(特别是推送通知的工作方式)。如何修改upstart脚本以解决此问题 下面是一个示例服务器,其中在upstart中推送失败,而在命令行中推送成功 var apn = require('apn'); var options = { passphrase:'certpassphrase' }; var err = null; var apnConnection = new apn.Connec

当我通过
node server.js从命令行运行服务器时,它的运行方式与使用upstart脚本启动时不同(特别是推送通知的工作方式)。如何修改upstart脚本以解决此问题

下面是一个示例服务器,其中在upstart中推送失败,而在命令行中推送成功

var apn = require('apn');
var options = {
  passphrase:'certpassphrase'
};
var err = null;
var apnConnection = new apn.Connection(options);

apnConnection.on('error', function(error){
  console.log("apscallback", 1, error);
});

apnConnection.on('transmitted', function(notification){
  console.log("apscallback", 2);
  console.log(notification);
});

apnConnection.on('timeout', function(){
  console.log("apscallback", 3);
});

apnConnection.on('connected', function(){
  console.log("apscallback", 4);
});

apnConnection.on('disconnected', function(){
  console.log("apscallback", 5);
});

apnConnection.on('socketError', function(error){
  console.log("apscallback", 6, error);
});

apnConnection.on('transmissionError', function(errorCode, notification){
  console.log("apscallback", 7, errorCode);
});

apnConnection.on('cacheTooSmall', function(difference){
  console.log("apscallback", 8);
});

function sendTestNotification() {
  var deviceToken = 'mydevicetoken';
  var myDevice = new apn.Device(deviceToken);
    var note = new apn.Notification();

    note.expiry = Math.floor(Date.now() / 1000) + 60; // Expires 1 hour from now.
    // note.badge = 3;
    // note.sound = "ping.aiff";
    // note.alert = "\uD83D\uDCE7 \u2709 You have a new message";
    note.payload = {'message': 'somemessage', 'requester': 7};
    apnConnection.pushNotification(note, myDevice);
}

sendTestNotification();


http.listen(port, function(){
  console.log('listening on *:', port);
});
下面是我的upstart脚本的样子:

#!upstart
description "My Server"

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env NODE_ENV=production
chdir /home/user/my-server/
exec node /home/user/my-server/server.js >> /var/log/my-server.log 2>&1
我得到的错误是:

...
apscallback 4
apscallback 5
apscallback 1 [Error: Socket unusable after connection. Hint: You may be using a certificate for the wrong environment]
... (REPEATS)

您的upstart脚本可能默认为root。可能root的密钥环中没有正确的证书。尝试在upstart脚本中隐式设置用户


您应该能够使用
setuid

设置用户,您在upstart脚本中设置了
env NODE\u env=production
(默认情况下,如果未设置该变量,APN将与测试/沙箱环境相违背)。因此,这将不利于生产APN。您是否有合适的证书(沙盒和生产证书不同)?

您是否尝试过Forever?我安装了forever.js,然后做了
forever start server.js
,这似乎解决了我的问题。不确定(仍然好奇)为什么它不能与upstart一起工作,但我只需要它工作,所以现在我在“永远”。感谢@QualcunoForever无法防止服务器断电(许多提供商会自动重新开机)。我仍然认为upstart/init.d是更好的选择,因为它们在系统启动时启动应用程序。最好的选择是永远使用upstart启动应用程序。@tsturzl您可以同时使用:init.d/upstart在启动时启动应用程序,也可以永远保持应用程序的活动状态。或者使用类似亚马逊弹性豆茎的东西。