解决用IPV6+DDNS访问UNRAID webui周期性失效的问题,smb不能访问的问题

我使用的unraid系统使用ddns(DDNSGO)绑定域名(阿里域名)与主机的ipv6地址进行远程访问,unraid是6.12.8。

遇到的问题是,配置当时是没问题的,但是过几天就会失效,无法通过域名访问webui了。这种情况在之前使用威联通的NAS的时候没有遇到过。但是docker里面的应用还是正常的,通过这个现象基本锁定是nginx的问题了。

通过看nginx的配置文件(/etc/nginx/conf.d/servers.conf),这个配置文件是unraid自动生产的,会直接把当前的ipv6地址写到配置里面:

解决用IPV6+DDNS访问UNRAID webui周期性失效的问题,smb不能访问的问题_第1张图片

自动生产的nginx配置文件

只有匹配了地址才能正常访问,但是一旦IPV6地址变更了,系统又不会自动更新,就不能通过webui访问了。而且在使用的过程中,发现一旦IPV6地址变更,系统自带的SMB共享功能也不能通过IPV6进行访问了。

解决这个问题的方法有好几个:

1、安装zerotier,映射到内网,通过内网IP地址访问,同时在unraid里面添加对应的虚拟网卡:

解决用IPV6+DDNS访问UNRAID webui周期性失效的问题,smb不能访问的问题_第2张图片

​在uraid的网络配置里面加入zerotier的虚拟网卡

系统会自动把这个网段加入到nginx的配置里面。由于zerotier的地址是内网地址,而且不会变更,所以这个问题可以一定程度的解决这个问题,但是要求访问的设备也装zerotier,这个不方便。

2、周期性重启nginx和smb服务

定期执行/etc/rc.d/rc.nginx -restart 可以重新生产nginx配置文件,并应用。

同理,定期执行/etc/rc.d/rc.samba -restart 也可以恢复samba的访问。

但问题是,重启周期是多少?太短,如一分钟,那么webui和samba每分钟都会断开;太长,则IPV6地址变更到重启的间隔之内,都不能访问到,问题没有很好的解决。

3、通过优化nginx配置,并监测nginx文件是否变化,在变化后更新配置。这种是我目前正在使用的方式,优点是灵活,空窗期比较短,缺点是你得自己写代码。

首先优化nginx的配置。不要使用IPV6绑定访问,而是使用域名绑定访问:

解决用IPV6+DDNS访问UNRAID webui周期性失效的问题,smb不能访问的问题_第3张图片

 

注意这个修改在全文有两三个地方,都要改好了。

然后把conf文件存在/boot/下面,这个文件夹是在启动盘里面的,不会随着重启而消失。

后面就简单了,写个python,监控/etc/nginx/conf.d/servers.conf 是否和改好的 conf 一致,若不一致,复制一份覆盖过去,并重启nginx和samba:

#nginx的维护程序
def mtNginx():
    logger.info('执行nginx维护')
    global nginxNeedReload
    #检查nginx的配置缓存文件是否存在.
    if not(os.path.exists(NGINX_CONF_CACHE)):
        logger.warning('nginx配置缓存不存在,复制缓存到制定位置.')
        os.system(f'cp {NGINX_CONF_SOURCE} {NGINX_CONF_CACHE}')    


    #检查nginx的配置文件是否需要更新
    if os.path.getsize(NGINX_CONF_CACHE) != os.path.getsize(NGINX_CONF):
        logger.warning('nginx配置文件异常,执行更新.')
        os.system(f'cp {NGINX_CONF_CACHE} {NGINX_CONF}')  
        #重启samba服务
        os.system(f'/etc/rc.d/rc.samba -restart') 
        nginxNeedReload = True

    #检查nginx配置是否需要更新
    if nginxNeedReload:
        res = os.popen('nginx -s reload').read()
        if res == '':
            logger.warning('enginx配置更新成功.')
            nginxNeedReload = False
        else:
            logger.warning('enginx配置更新失败.')     

上面的代码块里面先复制了一份文件到内存中,避免对启动盘的重复访问。然后检测配置文件是否被更改,如果更改(网络变更的时候,有时候会触发nginx配置文件的自动变更),那就重新覆盖一份,并重启smaba。并让nginx重新使用新的应用新的配置文件。注意此处不能使用rc.nginx -restart 的方式重启nginx,因为这样conf文件就会重新生成,达不到想要的效果。

上述代码可以使用定时任务的形式周期执行(例如一分钟一次),当conf文件异常才会触发服务的重置。

也可以使用nobup在后台托管的形式(我使用这种方式,因为这个脚本还带读取硬盘温度,调整主机风扇转速的功能)。

需要在GO文件里面配置开机运行。

感觉unraid的最大卖点就是硬盘的利用率,但是它的使用习惯,以及自己DIY的难度,比OMV那些难不少,主要是安装的包啥的重启后全部没了,这点太不方便了,希望官方能改改吧。

你可能感兴趣的:(硬件,python)