1

アプリケーションを IntoVPS から Digital Ocean に移行した後、写真を AWS S3 にアップロードしようとすると、アプリケーションがクラッシュします。

サーバー間の違いは次のとおりです。IntoVPS は Ubuntu 10.10 を実行しており、Digital Ocean は Debian を実行しています。IntoVPS のノードは 0.8.x、デジタル オーシャンのノードは 0.10.26 です。

新しいサーバーには、この問題を引き起こしている可能性のあるファイアウォールはありません (確認しました)。

クラッシュ エラーは次のとおりです。

Error: read ECONNRESET
  at errnoException (net.js:904:11)
  at Pipe.onread (net.js:558:19)

Error: spawn ENOENT
  at errnoException (child_process.js:988:11)
  at Process.ChildProcess._handle.onexit (child_process.js:779:34)

Error: write EPIPE
  at errnoException (net.js:904:11)
  at Object.afterWrite (net.js:720:19)

これらのいくつかは、プロセスを永遠に再起動しようとすることに関連している可能性があります (私はそれがスポーンの意味であると考えました)。私が注目するのは ECONNRESET です。

そのため、永遠に使用してプロセスを実行しており、knox モジュールを使用して S3 に接続しています。

私が見つけたグーグルの後:https://github.com/LearnBoost/knox/issues/198

res.resume()のコールバックに追加しようとputFileしましたが、何も変わりません。まだ ECONNRESET エラーが発生します。

この問題を修正するために丸一日 (昨日) を費やしましたが、本番アプリケーションが壊れたままにしておくことはできません。そのため、一時的に (ただし迅速に) 修正するために、Node の古いバージョンに切り替えてみることにしました。この問題。そこで、n モジュールをインストールして、インストールされているノード バージョンとして 0.8.26 を取得しようとしました。残念ながら、n は機能しませんでした。ここに私が作成した問題があります: https://github.com/visionmedia/n/issues/170

編集:

ssh セッションを終了して新しいセッションを開くと、n が機能します。ただし、ノードの 0.8.26 バージョンに切り替えると、別のエラーが発生します。

/apps/Foobar/node_modules/dnode/node_modules/weak/node_modules/bindings/bindings.js:83
        throw e
              ^
Error: Module version mismatch, refusing to load.
  at Object.Module._extensions..node (module.js:485:11)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.require (module.js:362:17)
  at require (module.js:378:17)
  at bindings (/apps/Foobar/node_modules/dnode/node_modules/weak/node_modules/bindings/bindings.js:76:44)
  at Object.<anonymous> (/apps/Foobar/node_modules/dnode/node_modules/weak/lib/weak.js:1:97)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.require (module.js:362:17)
  at require (module.js:378:17)
  at Object.<anonymous> (/apps/Foobar/node_modules/dnode/index.js:5:12)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.require (module.js:362:17)
  at require (module.js:378:17)
  at Object.<anonymous> (/apps/Foobar/controllers/sock.js:2:13)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.require (module.js:362:17)
  at require (module.js:378:17)
  at global.Controller (/apps/Foobar/globals.js:2:9)
  at Object.<anonymous> (/apps/Foobar/controllers/generosity.js:209:12)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.require (module.js:362:17)
  at require (module.js:378:17)
  at global.Controller (/apps/Foobar/globals.js:2:9)
  at Object.<anonymous> (/apps/Foobar/app.js:282:1)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:356:32)
  at Function.Module._load (module.js:312:12)
  at Module.runMain (module.js:492:10)
  at process.startup.processNextTick.process._tickCallback (node.js:245:9)

ご覧のとおり、私は S3 でこの問題を修正しようとして、非常に苦労しており、泣きそうになりました (比喩的に)。この問題に時間を浪費し続けることはできませんが、解決できないようです。Node自体が壊れているようです。

何が起こっているのかについて誰かが洞察を提供できますか? これに関する任意の助けをいただければ幸いです。

knox が機能しなくなったのはなぜですか?

編集

詳細はこちら。

エラーが発生するコード:

// S3
var endpoint = "https://s3.amazonaws.com/"+global.config.aws.s3.bucket+"/";
var knox = require('knox');
var s3 = knox.createClient(global.config.aws.s3);
var photosPrefix = 'photos/';


var model = module.exports;

model.emitter = new events.EventEmitter;


// ::Photos
model.createPhoto = function(info, cb){
    if (!info.file || path.resolve(info.file) === path.resolve(global.__tempdir))
        return cb(new Error('missing info.file'));

    var db = info.db;
    var photoId;

    if (typeof info.public === 'undefined')
        info.public = false;

    // Move file to a specific location
    var basename = path.basename(info.file);
    var destination = photosPrefix+basename+'/original';

    yarn
    (function(){
        // Upload photo to AWS
        s3.putFile(
            info.file, 
            destination, 
            {
                'Content-Type': 'image/png'
            },
            this());
    })
    (function(err, res){
        if (err) return this.error(new Error(err));

        // Remove temporary file
        fs.unlink(info.file, this());
    })
    (function(err){
        if (err) return this.error(new Error(err));

        // Retrieve photo stream from AWS
        s3.getFile(destination, this());
    })
    (function(err, res){
        if (err) return this.error(new Error(err));

        // Get the dimensions of the photo using the stream (res)
        gm(res).size(this());
    })
    (function(err, size){
        if (err) return this.error(new Error(err));

        // Insert record into photos table (include the dimensions, width and height)
        db.query("INSERT photos (resource, width, height, public) VALUES (?, ?, ?, ?)", [basename, size.width, size.height, info.public], this());
    })
    (function(err, results){
        if (err) return this.error(new Error(err));

        photoId = results.insertId;

        cb(null, photoId);
    })
    .error(function(err){
        cb(err);
    });
}

サイズや形式に関係なく、すべての写真で同じエラーが発生します。

4

1 に答える 1

0

問題は AWS と knox にあるのではなく、gm にあり、GraphicsMagick がシステムにインストールされていないという事実にあることがわかりました。

参考までに、同様のエラーが発生している場合、gm は、GraphicsMagick または ImageMagick が存在しない場合、それらが存在しないことを報告しないことに注意してください。ここの gm モジュールでこのエラーを報告しました: https://github.com/aheckmann/gm/issues/273

于 2014-04-24T05:36:56.640 に答える