记录时间 2020-05-17
版本nextcloud 18.0 onlyoffice 5.5
同一个机器上安装nextcloud和onlyoffice镜像,映射到外网访问,无法通过域名配置,提示网络连接不通或文件下载失败,这个问题网络上有很多的提问,但是一直没找到答案,经过2天的分析,终于明白了失败的具体原因,和我当前的组网有关系,下面先画一个目前组网的示意图。另外需要知道这两设备有两个过程要做:1.nextcloud连接onlyoffice 2.onlyoffice到nextcloud拉取文件
第一种情况:配置onlyoffice地址为192.168.x.x
服务地址配置192.168.x.x,能正常连接也能正常访问,数据不通过外部网络,不过这时候只能局域网自己玩玩,如果从外网的某一主机连入,会出现加载服务器错误,因为这时候配置的是192.168.x.x,此时外部发起的请求,onlyoffice还是会去连接192.168.x.x地址。
第二种情况:配置onlyoffice地址外部映射地址115.xxx.xx.xx
在这个情形会出现另一种情况,在局域网内我们通过192.168.xx.xx的地址去访问nextcloud和onlyoffice的服务都是可以正常的,但是在内网通过115.xxx.xx.xx地址访问,直接会找不到服务器。这里涉及到另一个问题,就是在局域网内通过自身公网访问自己,路由器在收到这类地址的时候好像是为了安全,丢弃这类数据的,这就导致了如果给nextcloud配置onlyoffice外网地址路由器这关都过不去。配置的时候会提示连接失败,网上很少改host的方法,对路由要求太高,容易弄乱网络。
配置外网地址,在外网访问会出现文件拉取错误。
这问题在当前网络环境下难以解决,只想到了两个办法
1.在另一台云主机安装配置onlyoffice
方案一很简单,网络示意如下图
这个情形下很好理解,不过在配置的时候有一个地方需要注意,在外网时没问题,但如果通过内外访问,会出现无法拉取文件的问题,查看onlyoffice的文件错误提示(文件在docker 镜像内部/root/onlyoffice/logs/documentserver/converter/out.log里)
[2020-05-15T19:56:40.301] [ERROR] nodeJS - error downloadFile:url=http://192.168.1.110:18082/apps/onlyoffice/empty?doc=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhY3Rpb24iOiJlbXB0eSJ9.IFkknNDAekyomrhunK1KvdH29qv89XNNYE1vfIxvkQk;attempt=1;code:ETIMEDOUT;connect:true;(id=conv_check_1570064549_docx)
也就是说在onlyoffice是根据访问过来的地址去生成文件的下载url,如果在外部访问生成的就是外部访问的url,针对这个问题nextcloud的有一个高级配置,可以解决。
Server address for internal requests from the Document Editing Service这个值相当于是告诉onlyoffice实际的访问地址是哪个,这样能保证内网外网都可以访问使用。
2.通过sockt 端口转发来实现
这个方式实际是绕过了内网不能访问自身公网地址web的问题,在尝试连接onlyoffice时走到外网,然后转到内网的onlyoffice,onlyoffice通过内部网络拉取文件。(这里使用了rinetd,安装简单)
这个配置上有一点区别,现在的nextcloud和onlyoffice在同个内网,因此在配置Server address for internal requests from the Document Editing Service时填的是内网地址192.168.x.x,文件通过内网拉取,连接走外网。
总结:两个方法都可以,问题解决了,成本增加了,本人目前使用方法2。
补充:经过研究,有了第三种解决方案
通过在NAS内建立dns服务器,来做域名欺骗,是内网机器在使用外网域名访问时候直接翻译成内网地址,网络逻辑如下
具体的做法:
1.现在nas里安装dns server,如果是其他系统可以使用类似的软件,我用的是群晖所以直接安装了。
2.配置dns server,增加一条master区域的域名,因为用的是ddns.net的域名,加这么一条。
3.配置一个A类解析,将我真正使用的域名解析为nas的地址,这样如果在内网使用域名访问就会解析为12.168.1.110
4.启动解析服务,不需要解析的还是都送网关解析
5.为nextcloud和onlyoffice配置dns域名,指向192.168.1.110.
第一次修改的时候通过登录到docker里面修改/ect/ resolv.conf 里的地址来做,每次一重启就丢失,然后网上说的其他固定resolv的方法在docker镜像里指令都没有。后来经过研究发现docker里的这个值是直接映射宿主机的,所以直接在宿主机上加了一条dns规则。
重启后docke就能按110的地址先进行域名解析。
6.重新配置参数,按如下配置就可以。