问题场景
最近临近过年放假,公司项目暂时没有什么新的开发任务,手头的活少了很多;但是自己不能天天上班摸鱼吧,于是就想着要学习点什么;然后在自己的技术库里找找,突然看到备注的Docker技术,还没有深入的学习,那就把Docker看看吧,然后开始安装环境等咔咔一顿操作就出现了下面的问题了。
因为自己的安装docker的方式,需要开启Hyper-v虚拟化,开启后安装完毕后,重启电脑,docker正常运行;此时项目有个问题,需要修改,我就运行项目,命令输入后没有几秒就报错了:
λ pnpm dev
> warning-system@0.0.0 dev G:\wokespace\apps\dashboard
> vite --mode dev
error when starting dev server:
Error: listen EACCES: permission denied ::1:1109
at Server.setupListenHandle [as _listen2] (node:net:1855:21)
at listenInCluster (node:net:1920:12)
at GetAddrInfoReqWrap.doListen [as callback] (node:net:2069:7)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:109:8)
ELIFECYCLE Command failed with exit code 1.
原因分析
安装了 Hyper-V,那么 Hyper-V 会为容器宿主网络服务随机保留一些端口号使用。正常情况下,Hyper-V 虽然会在「TCP 动态端口范围」中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但是,Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024……这可就麻烦了,一些常用端口动不动就因为被保留而无法使用了.
使用命令netsh int ipv4 show dynamicport tcp可以查看目前「TCP 动态端口」的范围
这只是一个「待选择」范围,并不代表其中的所有端口都会被保留,只是有一部分会被Hyper-V征用。使用netsh int ipv4 show excludedportrange protocol=tcp命令可以查看当前所有已经被征用了的端口
如果这些被征用的端口范围随机挑选到8088、5000、3000等 Web 开发常用端口,那开发就会受到影响;如果挑选到其他应用软件要调用的端口,那这些应用软件就会受到影响,可以说非常坑爹了……
解决方法
1.修改项目中使用的端口,比如我现在使用端口是1109,改成11090这样就可以了。
NODE_ENV=development
# 修改前
# VITE_PORT=1109
#修改改后
VITE_PORT=11090
2.重新设置一下「TCP 动态端口范围」,让Hyper-V只在我们设定的范围内保留端口即可。
可以以管理员权限运行下面的命令,将「TCP 动态端口范围」重新设定49152-65535。如果你觉得这个范围太大,还可以改小一点。
# 设置端口命令
# 使用 netsh 命令调整此范围,
# netsh int <ipv4|ipv6> set dynamic <tcp|udp> start= number num= range
# 此命令设置 TCP 的动态端口范围。
# 起始端口为 **数字**,端口总数为 **范围**。
netsh int ipv4 set dynamicport tcp start=49152 num=16384
netsh int ipv6 set dynamicport tcp start=49152 num=16384
然后重启电脑即可。
重启电脑后,再运行命令netsh int ipv4 show dynamicport tcp查看动态端口范围,发现确实已经修改为了49152-65535。现在只有这个范围内的端口可能会被保留了,基本不会影响日常使用。
写在最后
通过本篇的文章可以学习到因docker的安装后动态端口导致vite项目启动报错问题,喜欢的话帮忙点个赞 + 关注吧,将持续更新 前端 相关的文章,还可以关注我的公众号 梁三石FE ,感谢您的关注~