NodeJS服务器无法使用外部IP访问的解决方案

最近在学习上碰到了一些坑,每天基本上是踩着坑前进的QAQ。比如说在学习Vue-cli脚手架搭建Vue.JS应用,就碰到了一个情况:执行npm run dev之后只能从本机访问Vue APP,外部IP访问永远都是无响应。

寻找解决方案

端口被禁用?

正常人的第一反应肯定是端口的问题,于是我登上服务器执行iptables -F,清空IPTables中所有的规则,但很遗憾,并没有奏效。

可能仅仅只需要一个反向代理

首先想到的可能是需要Web服务器来实现外部访问。既然想到了这里,我就接着想到了利用反向代理的方法,将访问80端口的数据包代理到Node服务器监听的8080端口,再从8080端口取回response到80端口,从而实现外部IP访问Node服务器。

于是,我选择了反向代理性能卓越的Nginx作为Web服务器,查阅大量资料后写好了配置文件,重启Nginx成功,从外部访问80端口,仍然是默认的HTML页面,这使我很困惑,于是尝试不同参数的修改,但全都不奏效。

无奈之下,我只能从Node服务器本身入手。

监听的IP是什么?!

继续分析还有什么因素导致无法通过外部IP访问Node服务器。我突然想起之前在学习服务器架设的时候遇到的坑,就是服务监听的IP不同可能导致访问效果的不同,比如说Httpd服务器监听127.0.0.1:80之后,只能通过127.0.0.1localhost之类的来访问这台主机的Web服务,而0.0.0.0:80就不一样了,这个IP匹配所有的IP,所以所有人都能访问此Web访问。

类比推理到Node服务器,是不是也可能有这种情况?于是我进入服务器,执行netstat -tunlp | grep 8080,结果真的发现了幺蛾子:Node在监听127.0.0.1:8080!!!Shit!!!没想到这个问题居然如此弱智。。。

解决问题

既然找到了问题所在,那么就看一下监听的代码存在于那个位置上,经过一番分析,我最终找到了在config/index.js中的一段代码:

module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},

    // Various Dev Server settings
    host: 'localhost', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.HOST, if port is in use, a free one will be determined
    autoOpenBrowser: false,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
... ...

在第10行,为Node设置了一个localhost的监听地址,所以运行npm run dev之后的结果就会是127.0.0.1:8080了,所以我将localhost改成0.0.0.0,重新运行NodeJS项目,问题得以解决。

总结

通过这个弱智的问题可以反映出我的排错能力很有欠缺,主要是反应不够灵敏迅速,问题很弱智但想的很复杂。然后从现在开始打算一步步深入NodeJS和VueJS,顺便通过NodeJS了解一些基本的ES6模块化语法和Webpack的一些简单的用法。

将最新的文章发送到你的邮箱

展示评论