onlyoffice 用 Nginx 反向代理遇到的大坑
| 字数总计:1.2k|阅读时长:5 分钟 | 阅读量:2512
前言
最近想用一下云文件管理系统试试上传其他格式的云文件,想跳过兰空图床只能上传图片的限制,在网上找到了一些的看着还不错的开源项目:
Cloudreve
nextcloud
Cloudreve 之前部署过,后面没有需求就不用了,现在又想试试了,有经验就先试试这个
Cloudreve 介绍
Cloudreve 可以让您快速搭建起公私兼备的网盘系统。Cloudreve 在底层支持不同的云存储平台,用户在实际使用时无须关心物理存储方式。你可以使用 Cloudreve 搭建个人用网盘、文件分享系统,亦或是针对大小团体的公有云系统。
截图
先放出我的 docker 命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| mkdir -vp /www/cloudreve/{uploads,avatar} \ && touch /www/cloudreve/conf.ini \ && touch /www/cloudreve/cloudreve.db
docker run -d \ --name cloudreve --restart=always \ -p 9112:5212 \ --mount type=bind,source=/www/cloudreve/conf.ini,target=/cloudreve/conf.ini \ --mount type=bind,source=/www/cloudreve/cloudreve.db,target=/cloudreve/cloudreve.db \ -v /www/cloudreve/uploads:/cloudreve/uploads \ -v /www/cloudreve/avatar:/cloudreve/avatar \ cloudreve/cloudreve:latest
docker logs cloudreve
|
账号密码就在 docker 打印出来的日志里面
docker 跑完后访问 ip: 端口
Cloudreve 预览 office 三件套
由于微软的预览时不时发癫,无法预览,所以得设置 wopi(在管理面板 -> 参数设置 -> 图像与预览 ->WOPI 客户端)
我先照着 Cloudreve 官方试着部署了 onlyoffice
onlyoffice 的 nginx 代理
由于 onlyoffice 是 http 的(可以搞 https,但是我不会),需要 https,所以需要 nginx 监听 https 并代理 http,配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| server { listen 80; server_name view.aqcoder.cn; rewrite ^(.*)$ https://$host$request_uri; }
server { listen 443 ssl; server_name view.aqcoder.cn;
ssl_certificate /etc/ssl/aqcoder.cn/aqcoder.cn.cer; ssl_certificate_key /etc/ssl/aqcoder.cn/aqcoder.cn.key; ssl_session_cache shared:SSL:4m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; charset utf-8;
location / { proxy_pass http://127.0.0.1:9170; } }
|
按照 cloudreve 的教程弄完后,发现用不了:

一查网络,好家伙,访问到本地了:

折腾了好久,搜到网上这篇文章:https://www.jianshu.com/p/3f99d45fb4b8
代理配置搞错了!
同时官方也有对应的场景:

示例配置也给了,可以根据以上教程
得出正确的代理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| upstream docservice { server 127.0.0.1:9170; }
map $http_host $this_host { "" $host; default $http_host; }
map $http_x_forwarded_proto $the_scheme { default $http_x_forwarded_proto; "" $scheme; }
map $http_x_forwarded_host $the_host { default $http_x_forwarded_host; "" $this_host; }
map $http_upgrade $proxy_connection { default upgrade; "" close; }
server { listen 80; server_name view.aqcoder.cn; rewrite ^(.*)$ https://$host$request_uri; }
server { listen 443 ssl; server_name view.aqcoder.cn;
ssl_certificate /etc/ssl/aqcoder.cn/aqcoder.cn.cer; ssl_certificate_key /etc/ssl/aqcoder.cn/aqcoder.cn.key; ssl_session_cache shared:SSL:4m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; charset utf-8;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; proxy_set_header X-Forwarded-Host $the_host; proxy_set_header X-Forwarded-Proto $the_scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / { proxy_pass http://127.0.0.1:9170; } }
|
访问 https://view.aqcoder.cn/hosting/discovery 也返回预期的 XML 响应
不过 Cloudreve 官方也说了:
OnlyOffice 不支持过滤 WOPI 请求来源,如果你有对公使用需求,请通过外部应用防火墙检查预览页面请求中 wopisrc
参数是否为预期的 Cloudreve 站点。
Collabora Online 的 nginx 代理
Collabora Online 部署的时候也遇到了一样的问题
原 docker 部署命令:
1 2 3 4 5 6
| docker run -t -d -p 9980:9980 \ -e "aliasgroup1=xxxxxx:443" \ -e "username=xxxxx" \ -e "password=xxxxx" \ --cap-add MKNOD \ --name code --restart always collabora/code
|
原 nginx 的代理配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| server { listen 80; server_name view1.aqcoder.cn;
rewrite ^(.*)$ https://$host$request_uri; }
server { listen 443 ssl; server_name view1.aqcoder.cn;
ssl_certificate /etc/ssl/aqcoder.cn/aqcoder.cn.cer; ssl_certificate_key /etc/ssl/aqcoder.cn/aqcoder.cn.key; ssl_session_cache shared:SSL:4m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; charset utf-8;
location ^~ /browser { proxy_pass https://127.0.0.1:9980; proxy_set_header Host $http_host; }
location ^~ /hosting/discovery { proxy_pass https://127.0.0.1:9980; proxy_set_header Host $http_host; }
location ^~ /hosting/capabilities { proxy_pass https://127.0.0.1:9980; proxy_set_header Host $http_host; }
location ~ ^/cool/(.*)/ws$ { proxy_pass https://127.0.0.1:9980; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $http_host; proxy_read_timeout 36000s; }
location ~ ^/(c|l)ool { proxy_pass https://127.0.0.1:9980; proxy_set_header Host $http_host; }
location ^~ /cool/adminws { proxy_pass https://127.0.0.1:9980; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $http_host; proxy_read_timeout 36000s; }
}
|
后来也是借着 cloudreve 官方文档查到了 collaboraonline 官方文档
collaboraonline 官方文档有一处配置 server_name
, 解释是:CODE 没有为 websocket 连接提供正确的主机,如果在它前面有一个代理。

简单来说呢,就是可以设置主机名
所以正确的 docker 部署命令应该是:
1 2 3 4 5 6 7
| docker run -t -d -p 9980:9980 \ -e "aliasgroup1=https://file.aqcoder.cn:443" \ -e "username=xxx" \ -e "password=xxxx" \ -e "server_name=view1.aqcoder.cn" \ --cap-add MKNOD \ --name code --restart always collabora/code
|
总结
多看文档
参考文章
onlyoffice 配置 ssl 证书并进行 Nginx 反向代理遇到的坑,docker 安装 onlyoffice Nginx SSL
在代理后使用 ONLYOFFICE Docs - ONLYOFFICE
CODE Docker image — SDK
扩展文档预览 / 编辑 - Cloudreve