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.1
、localhost
之类的来访问这台主机的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的一些简单的用法。