12月5
公司有个项目需要对本地hosts文件进行修改,添加一条本地域名解析记录,如果让客户去操作,很容易破坏掉原先的hosts文件,最好是能封装成一个批处理脚本,用户只需要以管理员权限运行即可,如果记录存在则替换掉。
:: 关闭命令的回显
@echo off
:: 使用前请修改域名地址和ip地址
:: 域名地址
set url=heckjj.com
:: ip地址
set ip=192.168.1.1
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 9:12:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set ip_domain=%ip% %url%
set tmpdir=%userprofile%\AppData\Local\Temp
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%"
if %errorlevel% == 0 (
findstr /vi "%ip_domain%" %HOSTS% > %tmpdir%\hosts.tmp
type %tmpdir%\hosts.tmp > %HOSTS%
del /F /A /Q %tmpdir%\hosts.tmp
echo %ip_domain% 更新成功!
) else (
echo %ip_domain% 添加成功!
)
echo.>>%HOSTS%
echo %ip_domain% >> %HOSTS%
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
:: 关闭命令的回显
@echo off
:: 使用前请修改域名地址和ip地址
:: 域名地址
set url=heckjj.com
:: ip地址
set ip=192.168.1.1
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 9:12:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set ip_domain=%ip% %url%
set tmpdir=%userprofile%\AppData\Local\Temp
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%"
if %errorlevel% == 0 (
findstr /vi "%ip_domain%" %HOSTS% > %tmpdir%\hosts.tmp
type %tmpdir%\hosts.tmp > %HOSTS%
del /F /A /Q %tmpdir%\hosts.tmp
echo %ip_domain% 更新成功!
) else (
echo %ip_domain% 添加成功!
)
echo.>>%HOSTS%
echo %ip_domain% >> %HOSTS%
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,1秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 1 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 2 127.0.0.1>nul
echo.
exit
12月4
#使用前请修改域名地址和ip地址
#域名地址
$url="heckjj.com"
#ip地址
$ip="127.0.0.1"
$hosts="$env:windir\System32\drivers\etc\hosts"
$content=Get-Content $hosts
if( ($content |?{$_ -imatch "\s$url"}) -eq $null){
Write-Host "Adding `'$ip` to `'$url`'"
"`n$ip $url" | Out-File -FilePath $hosts -Append -encoding ascii
Write-Host "Added success!"
}else{
$content=Get-Content $hosts | Where{$_.Indexof("$url") -eq -1}
Write-Host "update `'$ip` to `'$url`'"
$content+="$ip $url"
$content | Set-Content $hosts -Force
Write-Host "updated success!"
}
最终效果,第一次是增加,后面一直是替换原来的host记录,实际上是生写了,最开始的思路是找到域名所在的行删除该行,但发现行不通,根本没有获取域名所在行的方法,最后想着是通过获取文件内容时先过滤掉当前域名的记录,也就是只读取不包含该域名host记录的行,最后再追加就可以了。
#域名地址
$url="heckjj.com"
#ip地址
$ip="127.0.0.1"
$hosts="$env:windir\System32\drivers\etc\hosts"
$content=Get-Content $hosts
if( ($content |?{$_ -imatch "\s$url"}) -eq $null){
Write-Host "Adding `'$ip` to `'$url`'"
"`n$ip $url" | Out-File -FilePath $hosts -Append -encoding ascii
Write-Host "Added success!"
}else{
$content=Get-Content $hosts | Where{$_.Indexof("$url") -eq -1}
Write-Host "update `'$ip` to `'$url`'"
$content+="$ip $url"
$content | Set-Content $hosts -Force
Write-Host "updated success!"
}
最终效果,第一次是增加,后面一直是替换原来的host记录,实际上是生写了,最开始的思路是找到域名所在的行删除该行,但发现行不通,根本没有获取域名所在行的方法,最后想着是通过获取文件内容时先过滤掉当前域名的记录,也就是只读取不包含该域名host记录的行,最后再追加就可以了。
12月4
最近公司有个项目需要对本地hosts文件进行修改,添加一条本地域名解析记录,如果让客户去操作,很容易破坏掉原先的hosts文件,最好是能封装成一个批处理脚本,用户只需要以管理员权限运行,然后根据菜单选择需要执行的功能即可。
1 批处理脚本
:: 关闭命令的回显
@echo off
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 14:45:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
GOTO MENU
:MENU
ECHO.
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.# 1.添加域名解析
ECHO.#
ECHO.# 2.编辑hosts文件
ECHO.#
ECHO.# 3.备份hosts文件
ECHO.#
ECHO.# 4.还原hosts文件
ECHO.#
ECHO.# 5.刷新dns缓存并退出
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set /p="请输入您要操作的序号:"<nul
@set /p sel=
if "%sel%"=="1" goto add_ipdomain
if "%sel%"=="2" goto edit_hosts
if "%sel%"=="3" goto backup_hosts
if "%sel%"=="4" goto reset_hosts
if "%sel%"=="5" goto refresh_dns
PAUSE
:add_ipdomain
set /p="请输入IP地址和域名(中间以空格分隔):"<nul
@set /p ip_domain=
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%\>"
if %errorlevel% == 0 (
echo %ip_domain% 已存在,请重新添加!&& goto MENU
) else (
echo.%ip_domain% >> %HOSTS% && echo %ip_domain% 添加成功,请按任意键返回菜单!&& pause >nul
)
goto MENU
:edit_hosts
title 编辑hosts本地域名解析文件
notepad %HOSTS%
echo 按任意键返回菜单!
pause >nul
goto MENU
:backup_hosts
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
pause >nul
goto MENU
pause
:reset_hosts
title 还原hosts文件
copy /y %HOSTS%.init %HOSTS%
echo hosts文件已还原至初始状态,按任意键返回菜单!
pause >nul
goto MENU
:refresh_dns
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,5秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 5 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 3 127.0.0.1>nul
echo.
exit
2 使用方法
2.1 功能菜单
第一次以管理员权限运行脚本会备份一份hosts.init文件,作为hosts初始文件,方便以后还原。
2.2 添加域名解析
添加域名解析这里采用的是手动输入 IP 地址 + 域名,并且会检索hosts文件里是否已经存在对应的 IP 地址和域名,如果存在,则提示用户重新添加。
2.3 编辑 hosts 文件
这里其实就是调用记事本来打开hosts文件。
2.4 备份 hosts文件
这里的备份文件是以hosts.日期时间的文件名格式来备份的。
2.5 还原 hosts文件
还原其实就是将 hosts.init 去掉后缀名,替换掉原先的 hosts 文件。
2.6 刷新 dns 缓存并退出
在刷新 dns 前,会先将 hosts 文件中的内容打印一下,然后执行刷新 dns 命令后退出脚本。
1 批处理脚本
:: 关闭命令的回显
@echo off
:: 设置hosts文件路径
set HOSTS=C:\Windows\System32\drivers\etc\hosts
:: 判断当前路径是否存在 hosts.init 文件, 不存在则备份
if not exist %HOSTS%.init (
copy /y %HOSTS% %HOSTS%.init && echo 系统hosts文件备份完成!
)
:: %date%=2022年12月04日
:: %time%= 14:45:38:96
:: 年 yyyy = %date:~0,4% 表示指针从左到右偏移 0 位, 然后提取 4 字符
:: 月 mm = %date:~5,2% 表示指针从左到右偏移 5 位, 然后提取 2 字符
:: 日 dd = %date:~8,2% 表示指针从左到右偏移 8 位, 然后提取 2 字符
set yyyymmdd=%date:~0,4%-%date:~5,2%-%date:~8,2%
:: 时 hh = %time:~0,2% 表示指针从左到右偏移 0 位, 然后提取 2 字符
:: 分 mm = %time:~3,2% 表示指针从左到右偏移 3 位, 然后提取 2 字符
:: 秒 ss = %time:~6,2% 表示指针从左到右偏移 6 位, 然后提取 2 字符
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
:: 当 hh 小于等于 9 时, 在前面补 0
if %hh% leq 9 (set hh=0%hh:~1,1%)
GOTO MENU
:MENU
ECHO.
ECHO.############################## 修改系统hosts解析文件 ##############################
ECHO.#
ECHO.# 1.添加域名解析
ECHO.#
ECHO.# 2.编辑hosts文件
ECHO.#
ECHO.# 3.备份hosts文件
ECHO.#
ECHO.# 4.还原hosts文件
ECHO.#
ECHO.# 5.刷新dns缓存并退出
ECHO.#
ECHO.############################### %yyyymmdd% %hh%:%mm%:%ss% ###############################
set /p="请输入您要操作的序号:"<nul
@set /p sel=
if "%sel%"=="1" goto add_ipdomain
if "%sel%"=="2" goto edit_hosts
if "%sel%"=="3" goto backup_hosts
if "%sel%"=="4" goto reset_hosts
if "%sel%"=="5" goto refresh_dns
PAUSE
:add_ipdomain
set /p="请输入IP地址和域名(中间以空格分隔):"<nul
@set /p ip_domain=
type %HOSTS% |findstr /v "^#"| findstr /i "%ip_domain%\>"
if %errorlevel% == 0 (
echo %ip_domain% 已存在,请重新添加!&& goto MENU
) else (
echo.%ip_domain% >> %HOSTS% && echo %ip_domain% 添加成功,请按任意键返回菜单!&& pause >nul
)
goto MENU
:edit_hosts
title 编辑hosts本地域名解析文件
notepad %HOSTS%
echo 按任意键返回菜单!
pause >nul
goto MENU
:backup_hosts
title 备份hosts文件
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
copy /y %HOSTS% %HOSTS%.%yyyymmdd%%hh%%mm%
echo ("%HOSTS%.%yyyymmdd%%hh%%mm%") 备份完毕,按任意键返回菜单!
pause >nul
goto MENU
pause
:reset_hosts
title 还原hosts文件
copy /y %HOSTS%.init %HOSTS%
echo hosts文件已还原至初始状态,按任意键返回菜单!
pause >nul
goto MENU
:refresh_dns
title 刷新本地dns缓存并退出
echo 查看修改后的hosts文件内容,5秒后退出!
type "%HOSTS%" |findstr /v "^#"|findstr "[0-9]"
ping -n 5 127.0.0.1>nul
ipconfig /flushdns
echo 刷新本地缓存成功,即将退出!
ping -n 3 127.0.0.1>nul
echo.
exit
2 使用方法
2.1 功能菜单
第一次以管理员权限运行脚本会备份一份hosts.init文件,作为hosts初始文件,方便以后还原。
2.2 添加域名解析
添加域名解析这里采用的是手动输入 IP 地址 + 域名,并且会检索hosts文件里是否已经存在对应的 IP 地址和域名,如果存在,则提示用户重新添加。
2.3 编辑 hosts 文件
这里其实就是调用记事本来打开hosts文件。
2.4 备份 hosts文件
这里的备份文件是以hosts.日期时间的文件名格式来备份的。
2.5 还原 hosts文件
还原其实就是将 hosts.init 去掉后缀名,替换掉原先的 hosts 文件。
2.6 刷新 dns 缓存并退出
在刷新 dns 前,会先将 hosts 文件中的内容打印一下,然后执行刷新 dns 命令后退出脚本。
10月13
我的服务器配置:linux+tomcat
出现现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。
原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。
解决方案1:及时断开socket
protocol="org.apache.coyote.http11.Http11NioProtocol"
解决方案2:修改tomcat配置文件,修改最大连接数(增大)
修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" />
解决方案3:修改linux的TCP超时时间(socket生命周期)限制
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart
出现现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。
原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。
解决方案1:及时断开socket
protocol="org.apache.coyote.http11.Http11NioProtocol"
解决方案2:修改tomcat配置文件,修改最大连接数(增大)
修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" />
解决方案3:修改linux的TCP超时时间(socket生命周期)限制
vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart
9月6
在nfs和nfs的守护进程rpcbind起来后,会由几个端口,防火墙需要打通,才能使客户端访问,否客户端列文件目录一直卡住,进不去挂载的目录。
nfs启动时会随机启动多个端口并向RPC注册,这样如果开启防火墙对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。这样设置固定端口以后即便重启机器也很方便挂载,如果不设置固定端口,机器或服务重启后之前防火墙添加的规则就失效了,
下面的是没有设置固定端口时的情况

设置固定端口:
编辑 /etc/sysconfig/nfs 文件:
vim /etc/sysconfig/nfs
在文件最后添加如下内容:
##########################分割线###############################
MOUNTD_PORT=4001
STATD_PORT=4002
LOCKD_TCPPORT=4003
LOCKD_UDPPORT=4004
RQUOTAD_PORT=4005
添加后保存退出并重启 rpcbind和nfs
systemctl restart rpcbind
systemctl restart nfs
重启服务后再查看端口:

nfs端口是2049,rpcbind的端口是111固定的,防火墙中也需要开启。
firewall-cmd --zone=public --add-port=4001-4005/tcp --permanent
firewall-cmd --zone=public --add-port=4001-4005/udp --permanent
firewall-cmd --zone=public --add-port=111/tcp --permanent
firewall-cmd --zone=public --add-port=111/udp --permanent
firewall-cmd --zone=public --add-port=2049/tcp --permanent
firewall-cmd --zone=public --add-port=2049/udp --permanent
firewall-cmd --reload
nfs启动时会随机启动多个端口并向RPC注册,这样如果开启防火墙对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。这样设置固定端口以后即便重启机器也很方便挂载,如果不设置固定端口,机器或服务重启后之前防火墙添加的规则就失效了,
下面的是没有设置固定端口时的情况
设置固定端口:
编辑 /etc/sysconfig/nfs 文件:
vim /etc/sysconfig/nfs
在文件最后添加如下内容:
##########################分割线###############################
MOUNTD_PORT=4001
STATD_PORT=4002
LOCKD_TCPPORT=4003
LOCKD_UDPPORT=4004
RQUOTAD_PORT=4005
添加后保存退出并重启 rpcbind和nfs
systemctl restart rpcbind
systemctl restart nfs
重启服务后再查看端口:
nfs端口是2049,rpcbind的端口是111固定的,防火墙中也需要开启。
firewall-cmd --zone=public --add-port=4001-4005/tcp --permanent
firewall-cmd --zone=public --add-port=4001-4005/udp --permanent
firewall-cmd --zone=public --add-port=111/tcp --permanent
firewall-cmd --zone=public --add-port=111/udp --permanent
firewall-cmd --zone=public --add-port=2049/tcp --permanent
firewall-cmd --zone=public --add-port=2049/udp --permanent
firewall-cmd --reload
9月6
准备工作
1.下载nfs服务(服务端机和客户端机器都需要安装)
yum -y install rpcbind nfs-utils
2.关闭防火墙
systemctl stop firewalld
setenforce 0 ;
3. 编辑配置文件
vim /etc/exports
添加内容为:
/data/file 对应的主机或IP地址 例如:/data/file 192.168.11.66/24(rw,async)
4.启动nfs服务,启动rpc服务
systemctl start rpcbind
systemctl start nfs
6、查看配置文件是否生效
showmount -e
输出如下:
Export list for mesapp1:
/data/file 192.168.11.66/24
7.客户端机先启动rpcbind服务再查看nfs服务可用目录
systemctl start rpcbind
systemctl enable rpcbind
showmount -e 192.168.1.66(服务器端IP地址)
输出如下:
Export list for 192.168.1.66:
/data/file 192.168.11.66/24
最后执行挂载命令
挂载:mount -t nfs 192.168.1.66:/data/file /data/file
异常如下:mount.nfs: No route to host
解决:
1、ping 服务器没有问题,网络是通的
2、服务端和客户端防火墙和 selinux 状态
firewall-cmd --state
显示是running
systemctl stop firewalld.service
注意:将服务器和客户端全部将防火墙关闭哦!
3.再次挂载,就OK
4.查看 showmount -e 192.168.1.66
会显示挂载的信息
1.下载nfs服务(服务端机和客户端机器都需要安装)
yum -y install rpcbind nfs-utils
2.关闭防火墙
systemctl stop firewalld
setenforce 0 ;
3. 编辑配置文件
vim /etc/exports
添加内容为:
/data/file 对应的主机或IP地址 例如:/data/file 192.168.11.66/24(rw,async)
4.启动nfs服务,启动rpc服务
systemctl start rpcbind
systemctl start nfs
6、查看配置文件是否生效
showmount -e
输出如下:
Export list for mesapp1:
/data/file 192.168.11.66/24
7.客户端机先启动rpcbind服务再查看nfs服务可用目录
systemctl start rpcbind
systemctl enable rpcbind
showmount -e 192.168.1.66(服务器端IP地址)
输出如下:
Export list for 192.168.1.66:
/data/file 192.168.11.66/24
最后执行挂载命令
挂载:mount -t nfs 192.168.1.66:/data/file /data/file
异常如下:mount.nfs: No route to host
解决:
1、ping 服务器没有问题,网络是通的
2、服务端和客户端防火墙和 selinux 状态
firewall-cmd --state
显示是running
systemctl stop firewalld.service
注意:将服务器和客户端全部将防火墙关闭哦!
3.再次挂载,就OK
4.查看 showmount -e 192.168.1.66
会显示挂载的信息
9月5
假设我有一个包含一些静态数据的Docker容器。
通过docker-compose配置文件volumes参数
docker-compose.yml文件:
配置文件示例:
volumes:
- /var/run/:/host/var/run/
- /channel-artifacts:/var/hyperledger/configs
- /data/logs:/tmp/logs/
把容器中/tmp/logs目录映射到宿主机根据目录下的/data/logs目录下。这两个目录会共享数据。
当使用命名卷并检查它时,它的工作方式与预期类似。
通过docker-compose配置文件volumes参数
docker-compose.yml文件:
配置文件示例:
volumes:
- /var/run/:/host/var/run/
- /channel-artifacts:/var/hyperledger/configs
- /data/logs:/tmp/logs/
把容器中/tmp/logs目录映射到宿主机根据目录下的/data/logs目录下。这两个目录会共享数据。
当使用命名卷并检查它时,它的工作方式与预期类似。
9月5
一. 问题描述
在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?
二. 原因分析
在进行docker部署的时候我们采用的是bridge网桥的模式。
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。
三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld
2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题
四. 小结
docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?
二. 原因分析
在进行docker部署的时候我们采用的是bridge网桥的模式。
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。
三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld
2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题
四. 小结
docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
9月5
Nacos微服务注册中心无法调用Docker容器中的服务
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: '3'
services:
iap-system:
build:
context: ./
dockerfile: Dockerfile-system
restart: always
ports:
- 19002:19002
container_name: iap-system
hostname: iap-system
image: iap-system
network_mode: "host" # 与宿主机共有一个IP
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请赞赏鼓励!
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: '3'
services:
iap-system:
build:
context: ./
dockerfile: Dockerfile-system
restart: always
ports:
- 19002:19002
container_name: iap-system
hostname: iap-system
image: iap-system
network_mode: "host" # 与宿主机共有一个IP
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请赞赏鼓励!
9月5
ocker 中的服务注册到nacos时默认是docker容器内网的IP地址,使用--network=host 是宿主机所在的局域网的ip 我想把公网ip注册到nacos上
可以使用以下两种方式:
1、如果docker网络采用的是主机模式即--network=host,那么这时候注册就是宿主机的ip。
2、nacos服务发现时添加ip即可。spring:
cloud:
nacos:
discovery:
ip: ${HOST:10.128.1.122}
可以使用以下两种方式:
1、如果docker网络采用的是主机模式即--network=host,那么这时候注册就是宿主机的ip。
2、nacos服务发现时添加ip即可。spring:
cloud:
nacos:
discovery:
ip: ${HOST:10.128.1.122}






