报错信息

windows系统,本地standalone模式启动nacos失败。

查看安装位置nacos\logs\nacos.log中日志

报错信息

报错Caused by: java.net.BindException: Address already in use: bind

查看端口占用

查看是否端口已占用:

Nacos2.0版本新增了gRPC通讯方式,需要额外确认两个端口 9849 和 9849

#windows命令行
netstat -nao | findstr 8848
netstat -nao | findstr 9848
netstat -nao | findstr 9849

如果有占用,杀掉进程就不用往后看了。

# 这里11111是上个命令得到的进程PID值
taskkill /F /PID 11111 /T 

如果没有查到,请反思是否安装了Hyper-vWSL2(DockerDesktop),windows默认为它们分配了某些范围的端口,所以不会查出明确占用端口号。

排查动态端口

动态端口范围

动态端口是windows操作系统可以为客户端应用程序分配的临时端口。

查看动态端口范围的命令

# tcp协议,nacos基于tcp
netsh int ipv4 show dynamicportrange protocol=tcp
# udp协议
netsh int ipv4 show dynamicportrange protocol=udp

输出类似于

C:\Users\CC>netsh int ipv4 show dynamicportrange protocol=tcp

协议 tcp 动态端口范围
---------------------------------
启动端口        : 1024
端口数          : 13977

C:\Users\CC>netsh int ipv4 show dynamicportrange protocol=udp

协议 udp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

表示1024到15001,49152到65536之间的端口可以被分配,明显8848端口包含在内,是允许被分配的才对。

无法被分配的原因是动态端口范围内一些被“征用”了,例如规划给WSL。即保留端口范围

被排除端口范围

查看保留端口范围:

# tcp协议
netsh interface ipv4 show excludedportrange protocol=tcp
# udp协议
netsh interface ipv4 show excludedportrange protocol=udp
# linux系统
sudo iptables -L --line-numbers -t filter -p tcp

可以看到8848处于被征用端口范围中,已破案。

C:\Users\CC>netsh interface ipv4 show excludedportrange protocol=tcp

协议 tcp 端口排除范围

开始端口    结束端口
----------    --------
      2869        2869
      8470        8569
      8781        8880
     13337       13436
     13437       13536
     50000       50059  
     
C:\Users\CC>netsh interface ipv4 show excludedportrange protocol=udp

协议 udp 端口排除范围

开始端口    结束端口
----------    --------
     50000       50059     *
     55806       55905
     60182       60281
     61971       62070
     62894       62993
     64228       64327
     64328       64427
动态端口占用解决
方案1:关闭应用

关闭Hyper-vWSL2,最简单。

但是装这俩一般有使用docker需求,为了不影响docker,可以排除需要的端口,或修改动态端口范围

方案2:排除端口

排除指定的端口不被动态分配:

# windows 需要管理员权限。
# netsh int ipv4 add excludedportrange protocol=tcp startport=要排除的端口 numberofports=范围
netsh int ipv4 add excludedportrange protocol=tcp startport=8848 numberofports=1
netsh int ipv4 add excludedportrange protocol=tcp startport=9848 numberofports=1
netsh int ipv4 add excludedportrange protocol=tcp startport=9849 numberofports=1
# linux
sudo iptables -A INPUT -p tcp --dport 8848:9849 -j DROP

若报错“另一个程序正在使用此文件”,需要先终止该程序。

使用下面两种方式停止Hyper-v或WSL > 重启 > 管理员打开powershell > 添加排除端口 > 重新启用Hyper-v或WSL > 重启

Hyper-v启停有关命令
#查看状态
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
#启用
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
#禁用
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
WSL启停

设置 > 系统(有的windows版本在【应用】中)>可选功能>更多widows功能 > 取消勾选【适用于Linux的Windows子系统】

事后重启。

方案3: 设置保留端口范围

另一方案是重设保留端口的范围:

# ipv4 start表示起始端口号,num表示范围
netsh int ipv4 set dynamic tcp start=10000 num=13977 
# ipv6
netsh int ipv6 set dynamic tcp start=10000 num=13977
重启nacos验证

nacos启动成功。

Nacos started successfully in stand alone mode. use external storage
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐