【问题标题】:No Access to NodeJS Express App hosted on Google Compute Engine无法访问托管在 Google Compute Engine 上的 NodeJS Express 应用程序
【发布时间】:2017-04-27 14:55:02
【问题描述】:

我在谷歌云上有一个 f1-micro 实例。 IN 安装了 ubuntu 14.04、NodejS 0.10 和 mongoDB。现在我用 yeoman 做了一个快速应用程序,它在 localhost 上完美运行。但是当我尝试在实例中运行它时,我无法访问它!

这是我的工作:

  1. 将本地代码提交到 BitBucket
  2. 通过 SSH 将代码从 BitBUcket 克隆到 Google Compute Engine
  3. 运行命令咕噜声
  4. 通过端口号访问谷歌提供的外部IP。在浏览器上显示此网页不可用

这是我的源代码:

** 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,但仍然没有成功。有什么想法吗?

【问题讨论】:

  • 好的,到目前为止,我将端口更改为 80 并且看起来可以正常工作。但是我想使用端口 3000 并且不知道在谷歌云控制台中使用它的任何方式

标签: javascript node.js


【解决方案1】:

好的,我刚刚想通了。其实很简单。 问题仅出在端口上。我只需要更改防火墙设置以允许来自任何来源的端口。就是这样。

  1. 转到 Google Cloud 控制台。
  2. 网络 > 防火墙规则。
  3. 找到 tcp 和 udp 范围为 1-65535 的条目“default-allow-internal”。编辑它并更改源过滤器以允许它来自任何源。
    1. 重新启动应用程序。它现在应该可以工作了。

2017 年 4 月 27 日更新:现在 GCE 上的流程发生了一些变化。编辑源过滤器 -> ip range 为 0.0.0.0/0

【讨论】:

  • 对我来说,HTTP/HTTPS 流量不会流向我的应用程序端口(不是默认端口),因此我必须编辑 default-allow-http、default-allow-https 防火墙规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2017-06-03
  • 1970-01-01
  • 2015-11-15
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多