【问题标题】:Windows Azure Node.js Internal Server ErrorWindows Azure Node.js 内部服务器错误
【发布时间】:2012-12-08 08:36:08
【问题描述】:

当我点击这个地址时,我会时不时地收到这个错误:

http://apps.facebook.com/pazooza

iisnode encountered an error when processing the request.

HRESULT: 0x2
HTTP status: 500
HTTP reason: Internal Server Error
You are receiving this HTTP 200 response because system.webServer/iisnode/@devErrorsEnabled configuration setting is 'true'.

In addition to the log of stdout and stderr of the node.exe process, consider using debugging and ETW traces to further diagnose the problem.

You may get additional information about this error condition by logging stdout and stderr of the node.exe process.To enable logging, set the system.webServer/iisnode/@loggingEnabled configuration setting to 'true' (current value is 'false').

但是当我点击刷新时,网站加载正确并且一切正常。只有当我离开网站几个小时后才回来,也许我会再次看到这个错误,或者可能不会。这很烦人,因为导航到我的网站的用户认为它已损坏并且不倾向于点击刷新!

所以我的问题是之前是否有其他人遇到过此类问题,您检查过代码并且网站加载的一切似乎都正确,但 Node 或 IIS-Node 时不时会解决此错误。

我的设置如下:

服务器:Windows Azure/网站(共享,2 个实例) 语言:Node.js 工具:Webmatrix(我使用了模板项目 Starter Site)

最烦人的是我打开了错误消息等的日志记录,而日志记录系统没有发现这个错误,当我去检查我的日志时,当这个错误发生时没有创建错误日志,所以我还没有想出捕捉它的方法。有人有什么建议吗?

这就是我的 server.js 文件的样子:

var express = require('express')
  , connect = require('connect')
  , config = require('./utils/config')
  , observer = require('./utils/observer')
  , cronJob = require('cron').CronJob
  , azure = require('azure')
  , uuid = require('node-uuid')
  , db = require("./utils/database")
  , async = require('async')
  , serialNumbers = require("./utils/serialNumbers");

var app = module.exports = express.createServer();

// Create a cron job to listen for servicebus queue messages
var jobProcessServices = new cronJob({
    cronTime: '*/1 * * * * *',
    onTick: function () {
        observer.processQueue(function () { });
    },
    start: false
});

app.configure(function() { 
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.set('view options', {
      layout: false
    });
    app.use(express.favicon());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(connect.static(__dirname + '/public'));
    app.use(require('./middleware/siteTotals'));
    app.use(require('./middleware/authenticate'));
    app.use(express.cookieParser());
    app.use(express.session({ secret: 'ljklkdsflkfdj4848384' }));
    app.use(app.router);

    // start listening for queue messages
    jobProcessServices.start();
    console.log('starting job service\n\n');

    // create table stores
    var ts1 = azure.createTableService(config.storageAccount, config.storageAccessKey, config.tableHost);

    ts1.createTableIfNotExists('channels', function(error) {
        ts1.createTableIfNotExists('users', function(error) {
            ts1.createTableIfNotExists('snusers', function(error) {
                ts1.createTableIfNotExists('snchannels', function(error) {
                    var query = azure.TableQuery
                        .select()
                        .from('snchannels');

                    ts1.queryEntities(query, function(error, result) {
                        if(error === null && result.length == 0) {
                            // must be site initialization, generate serial numbers for channels and users
                            serialNumbers.generateNewNumbers('snchannels', config.maxNumber, config.usageRates[2], function() {
                                serialNumbers.generateNewNumbers('snusers', config.maxNumber, config.usageRates[2], function() {
                                    initializeDefaultQueues(function() {
                                        // Create default storage container
                                        var bc1 = azure.createBlobService(config.storageAccount, config.storageAccessKey, config.blobHost);
                                        bc1.createContainerIfNotExists(config.container, function () { });
                                    });
                                });
                            });
                        }
                        else initializeDefaultQueues(function() { });
                    }); 
                });
            });
        });
    });

    ts1.createTableIfNotExists('sitetotals', function(error) {
        if(error === null) {
            var query = azure.TableQuery
                .select()
                .from('sitetotals');

            ts1.queryEntities(query, function(error, siteTotals) {
                if(error === null && siteTotals.length == 0) {
                    // must be site initialization create defaults
                    ts1.insertEntity('sitetotals', { PartitionKey: 'users', RowKey: uuid(), Total: '0', Deleted: '0' }, function(error) {
                        ts1.insertEntity('sitetotals', { PartitionKey: 'channels', RowKey: uuid(), Total: '0', Deleted: '0' }, function(error){ });
                    });
                }
            });
        }
    });
});

/**
* ERROR MANAGEMENT
* -------------------------------------------------------------------------------------------------
* error management - instead of using standard express / connect error management, we are going
* to show a custom 404 / 500 error using jade and the middleware errorHandler (see ./middleware/errorHandler.js)
**/
var errorOptions = { dumpExceptions: true, showStack: true }
app.configure('development', function() { });
app.configure('production', function() {
    errorOptions = {};
});
app.use(require('./middleware/errorHandler')(errorOptions));

// static vars
app.helpers({ config: {
        fbAppNamespace: config.fbAppNamespace,
        siteUrl: config.siteUrl,
        canvasUrl: config.canvasUrl,
        appID: config.appID,
        commentPageSize: config.commentPageSize,
        videoPageSize: config.videoPageSize,
        channelPageSize: config.channelPageSize,
        userFollowPageSize: config.userFollowPageSize,
        followPageSize: config.followPageSize,
        friendPageSize: config.friendPageSize,
        pazoozaFbUrl: config.pazoozaFbUrl,
        pazoozaTwitterUrl: config.pazoozaTwitterUrl,
        anonymousUser: config.anonymousUser,
        usageRates: config.usageRates,
        categorys: config.categorys,
        channelTypes: config.channelTypes,
        ratings: config.ratings
    },
    serverYear: new Date().getFullYear()
});

// all views have access to these variables
// note: can't do http calls with these functions
app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    },
    signed_request: function (req, res) {
        return req.param('signed_request');
    }
});

/**
* ROUTING
* -------------------------------------------------------------------------------------------------
* include a route file for each major area of functionality in the site
**/

require('./routes/home')(app);
require('./routes/channel')(app);
require('./routes/user')(app);
require('./routes/search')(app);
require('./routes/utils')(app);
require('./routes/facebook')(app);
require('./routes/testing')(app);

// Global Routes - this should be last!
require('./routes/global')(app);

app.listen(process.env.PORT || 3000);
console.log("Express server in %s mode", app.settings.env);

// helper functions
function initializeDefaultQueues(callback){
    // create default service bus message queues
    var qs1 = azure.createQueueService(config.storageAccount, config.storageAccessKey, config.queueHost);
    qs1.createQueueIfNotExists('serialnumbers', function(error){
        callback();
    });
}

有一些中间件模块,例如 siteTotals 和 authentication 来管理安装应用程序的 Facebook 用户,并确保他们的 FB 信息始终可供应用程序使用。

我不知道我是否需要安装最新版本的 IISNode?如何判断IISNode的版本以及是否需要更新?

另外我应该指出,无论您处于哪种 Windows Azure 网站模式:免费、共享或保留,都会发生此错误。

这是我的 web.config 文件:

<iisnode      
 node_env="%node_env%"
 nodeProcessCommandLine="&quot;%programfiles%\nodejs\node.exe&quot;"
 nodeProcessCountPerApplication="1"
 maxConcurrentRequestsPerProcess="1024"
 maxNamedPipeConnectionRetry="3"
 namedPipeConnectionRetryDelay="2000"      
 maxNamedPipeConnectionPoolSize="512"
 maxNamedPipePooledConnectionAge="30000"
 asyncCompletionThreadCount="0"
 initialRequestBufferSize="4096"
 maxRequestBufferSize="65536"
 watchedFiles="*.js;node_modules\*;routes\*.js;views\*.jade;middleware\*.js;iisnode.yml"
 uncFileChangesPollingInterval="5000"      
 gracefulShutdownTimeout="60000"
 loggingEnabled="true"
 debuggingEnabled="false"
 debuggerPortRange="5058-6058"
 debuggerPathSegment="debug"
 maxLogFileSizeInKB="128"
 devErrorsEnabled="true"
 flushResponse="false"      
 enableXFF="false"
 promoteServerVars=""
 />

它是使用 Webmatrix 模板时创建的标准文件,我用来启动整个项目。

【问题讨论】:

标签: node.js azure


【解决方案1】:

我们在使用 mongolab 后端作为数据库的 Node 站点上遇到了类似的问题。我们最终在我们的连接字符串中添加了一个保持活动标志(并将其设置为 on)来解决问题。我认为这个问题是由于 azure 的负载平衡造成的,但是当我们搬到亚马逊时,我从来没有花时间去弄清楚它。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您能否提供有关您的应用程序的更多详细信息?在没有更多信息的情况下很难确定确切的问题,尤其是关于您的应用程序连接到的资源。

    此问题可能是由于应用程序在一段时间不活动后刷新造成的。因为网站是共享的,如果不用于提高应用程序密度,每个网站都会定期刷新。在应用程序重新启动后,您可能需要重新建立与某些资源的连接。

    您可以通过编辑您的 iisnode.yml 文件并设置 loggingEnabled=true,然后下载日志(使用跨平台的 Azure 站点日志下载工具)。

    -马克

    【讨论】:

    • 嗨,我做了搜索,发现 iisnode.yml 在这个目录 C:\Users\rkara\Documents\My Web Sites\Pazooza6\node_modules\azure\lib\cli\templates\node 是对吗?通常我编辑 web.config 以打开调试等
    • 嗨,马克,我编辑了我的问题并提供了更多信息。我正在使用 Azure node-sdk 与 Windows Azure 表存储通信。除了 Facebook 和 Windows Azure 表存储之外,我没有与其他系统通信......
    • 嗨,马克,我在这个地址对 iisnode.yml 做了一些研究:tomasz.janczuk.org/2012/05/…。看来我可以只使用 web.config 并设置 loggingEnabled 和 devErrorsEnabled。但是,当错误发生时,它仍然没有生成 std​​err 文件。我怀疑肯定有其他事情发生......?
    • 您可以只使用 web.config,但如果您使用的是命令行工具,它会自动删除一个 iisnode.yml 文件,并且那里的设置会覆盖您的 web.config 设置。我没有读到你正在使用 webmatrix,因为你知道你不需要担心 iisnode.yml,你只需在配置中进行更改。默认情况下,iisnode 日志会写入站点的日志目录。实际上,您可以使用跨平台命令行工具 (npm install -g azure-cli) 或 ftp 将日志流式传输到您的网站并从 LogFiles\iisnode 目录获取日志。
    【解决方案3】:

    如果您有 iisnode.yml,请使用它来打开日志记录和调试。 iisnode.yml 会覆盖 web.config 中的任何设置,我们删除的默认设置将禁用 deverrors 和日志记录,因为这些是生产应用程序的正常设置。编辑 iisnode.yml 以更改这些值应该会为您启用日志。

    【讨论】:

    • 从您的角度来看,iisnode.yml 文件标记的路径是什么?这是您要查找 iisnode.yml 文件的目录吗? C:\Users\rkara\Documents\My Web Sites\Pazooza6\node_modules\azure\lib\cli\templates\node
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多