无权访问Google Compute Engine上托管的NodeJS Express App

时间:2015-09-26 06:02:56

标签: javascript node.js

我在google云上有一个f1-micro实例。 IN安装了ubuntu 14.04,NodejS 0.10和mongoDB。现在我已经与yeoman做了一个明确的应用程序,它完全适用于localhost。但是当我尝试在实例中运行它时,我无法访问它!

这里'我做什么:

  1. 将本地代码提交给BitBucket
  2. 通过SSH克隆从BitBUcket到Google Compute Engine的代码
  3. 运行命令 grunt
  4. 使用端口号访问Google提供的外部IP。在浏览器上,但它说此网页不可用
  5. 这是我的源代码:

    ** app.js **

    'use strict';
    
    // Module dependencies.
    var express = require('express'),
        path = require('path'),
        fs = require('fs'),
        methodOverride = require('method-override'),
        morgan = require('morgan'),
        bodyParser = require('body-parser'),
        errorhandler = require('errorhandler');
    
    var app = module.exports = exports.app = express();
    
    app.locals.siteName = "Server";
    
    // Connect to database
    var db = require('./config/db');
    app.use(express.static(__dirname + '/public'));
    
    
    // Bootstrap models
    var modelsPath = path.join(__dirname, 'models');
    fs.readdirSync(modelsPath).forEach(function (file) {
      require(modelsPath + '/' + file);
    });
    
    var env = process.env.NODE_ENV || 'development';
    
    if ('development' == env) {
        app.use(morgan('dev'));
        app.use(errorhandler({
            dumpExceptions: true,
            showStack: true
        }));
        app.set('view options', {
            pretty: true
        });
    }
    
    if ('test' == env) {
        app.use(morgan('test'));
        app.set('view options', {
            pretty: true
        });
        app.use(errorhandler({
            dumpExceptions: true,
            showStack: true
        }));
    }
    
    if ('production' == env) {
        app.use(morgan());
         app.use(errorhandler({
            dumpExceptions: false,
            showStack: false
        }));
    }
    
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
    app.use(methodOverride());
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    
    // Bootstrap routes
    var routesPath = path.join(__dirname, 'routes');
    fs.readdirSync(routesPath).forEach(function(file) {
      app.use('/', require(routesPath + '/' + file));
    });
    
    // Bootstrap api
    var apiPath = path.join(__dirname, 'api');
    fs.readdirSync(apiPath).forEach(function(file) {
      app.use('/api', require(apiPath + '/' + file));
    });
    
    // Start server
    var port = process.env.PORT || 3000;
    app.listen(port, function () {
      console.log('Express server listening on port %d in %s mode', port, app.get('env'));
    });
    

    ** Gruntfile.js **

    module.exports = function(grunt) {
      require('load-grunt-tasks')(grunt);
      grunt.initConfig({
        // Configure a mochaTest task
        mochaTest: {
          test: {
            options: {
              reporter: 'spec'
            },
            src: ['test/**/*.js']
          }
        },
        watch: {
          options: {
            livereload: true,
          },
          express: {
            files:  [ '*.js','routes/*.js', 'models/*.js', 'config/*.js','api/*.js'  ],
            tasks:  [ 'express:dev' ],
            options: {
              spawn: false // Without this option specified express won't be reloaded
            }
          }
        },
        express: {
          options: {
            port : 3000,
            node_env: 'development'
          },
          dev: {
            options: {
              script: 'app.js',
              node_env: 'development'
            }
          },
          prod: {
            options: {
              script: 'app.js',
              node_env: 'production'
            }
          }
        },
        open: {
          server: {
            url: 'http://localhost:3000' 
          }
        }
      });
    
      grunt.registerTask('test', 'mochaTest');
    
      grunt.registerTask('server', function(arg) {
        if(arg && arg == 'prod')
        {
          grunt.task.run([
            'express:prod',
            'open',
            'watch'
          ]);
        }
        else
        {
          grunt.task.run([
            'express:dev',
            'open',
            'watch'
          ]);
        }
      });
      grunt.registerTask('default', [ 'server' ]);
      grunt.registerTask('dist', [ 'server:prod' ]);
    
    };
    

    我尝试使用Google提供的内部IP更改app.listen,但仍然没有运气。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

好的,我只是想通了。实际上非常简单。 问题出在端口上。我只需要更改防火墙设置以允许来自任何来源的端口。是的。

  1. 转到Google云端控制台。
  2. 网络>防火墙规则。
  3. 找到条目" default-allow-internal"使用tcp和udp范围1-65535。编辑它并更改源过滤器以允许来自任何源。
    1. 重启应用。它应该现在可以工作。
  4. 2017年4月27日更新:现在GCE的流程有所改变。修改源过滤器 - > ip范围为0.0.0.0/0