记录OnlyOffice跨域问题排查过程
OnlyOffice跨域问题
- Docker安装OnlyOffice
- 拉取镜像
- 启动容器
- Https访问OnlyOffice
- 443端口映射
- 配置SSL证书
- 重启容器
Docker安装OnlyOffice
拉取镜像
镜像地址:onlyoffice镜像
我用的onlyoffice版本是6.4版本
docker pull onlyoffice/documentserver:6.4
启动容器
如果不用https访问,运行以下命令启动onlyoffice容器
#创建挂载目录
#onlyoffice日志挂载目录
mkdir /opt/dockerfile/onlyoffice/log
#onlyoffice数据目录
mkdir /opt/dockerfile/onlyoffice/data
#onlyoffice配置文件目录
mkdir /opt/dockerfile/onlyoffice/lib
#onlyoffice数据库目录
mkdir /opt/dockerfile/onlyoffice/db
#onlyoffice nginx配置文件目录
mkdir /opt/dockerfile/onlyoffice/nginxdocker run -i -t -d -p 8013:80 --name onlyoffice --restart=always
-v /opt/dockerfile/onlyoffice/log:/var/log/onlyoffice
-v /opt/dockerfile/onlyoffice/data:/var/www/onlyoffice/Data
-v /opt/dockerfile/onlyoffice/lib:/var/lib/onlyoffice
-v /opt/dockerfile/onlyoffice/db:/var/lib/postgresql
-v /opt/dockerfile/onlyoffice/nginx:/etc/onlyoffice/documentserver/nginx
onlyoffice/documentserver:6.4
注:挂载nginx配置文件目录是为了方便后续更改nginx配置,不知道什么原因,用以上命令启动,容器内nginx配置文件会消失,或者说被宿主机空的nginx文件夹覆盖,我的做法是第一次启动容器先不挂载nginx目录,然后把容器内nginx配置文件复制到宿主机的挂载目录,然后删除容器后再次启动挂载nginx目录,具体如下
#第一次启动
docker run -i -t -d -p 8013:80 --name onlyoffice --restart=always
-v /opt/dockerfile/onlyoffice/log:/var/log/onlyoffice
-v /opt/dockerfile/onlyoffice/data:/var/www/onlyoffice/Data
-v /opt/dockerfile/onlyoffice/lib:/var/lib/onlyoffice
-v /opt/dockerfile/onlyoffice/db:/var/lib/postgresql
onlyoffice/documentserver:6.4#复制nginx配置文件到宿主机
docker cp onlyoffice:/etc/onlyoffice/documentserver/nginx /opt/dockerfile/onlyoffice#停止容器并删除
docker stop onlyoffice
docker rm onlyoffice#重新启动容器(挂载nginx)
docker run -i -t -d -p 8013:80 --name onlyoffice --restart=always
-v /opt/dockerfile/onlyoffice/log:/var/log/onlyoffice
-v /opt/dockerfile/onlyoffice/data:/var/www/onlyoffice/Data
-v /opt/dockerfile/onlyoffice/lib:/var/lib/onlyoffice
-v /opt/dockerfile/onlyoffice/db:/var/lib/postgresql
-v /opt/dockerfile/onlyoffice/nginx:/etc/onlyoffice/documentserver/nginx
onlyoffice/documentserver:6.4
至此容器启动成功,浏览器输入地址localhost:8013
按照命令可以启动演示页面
sudo docker exec f8f17ec4aa3f sudo supervisorctl start ds:example
然后点击GO TO TEST EXAMPLE进入演示页面,可以上传文件演示在线预览和编辑的效果
Https访问OnlyOffice
因为公司生产环境必须https访问,否则出现跨域问题,刚开始我是直接在宿主机nginx配置8013端口号映射的,如下
location /onlyoffice/ {proxy_pass http://192.168.0.183:8013/;
}
这种方式可以通过https://我的域名/onlyoffice访问到onlyoffice主页,但是当预览文件的时候会报unknown error,查看接口调用,发现Edit.bin接口报错,原因是该接口调用形式还是http
http://192.168.0.183:8013/cache/files/7f8268a6c914b496ea63/Editor.bin/Editor.bin?md5=zk5o68w3kpMTY_pVaEt0hQ&expires=1670380981&filename=Editor.bin
443端口映射
删除容器,映射443端口重新启动容器,命令如下
#重新启动容器(挂载nginx)
docker run -i -t -d -p 8013:80 -p 8443:443 --name onlyoffice --restart=always
-v /opt/dockerfile/onlyoffice/log:/var/log/onlyoffice
-v /opt/dockerfile/onlyoffice/data:/var/www/onlyoffice/Data
-v /opt/dockerfile/onlyoffice/lib:/var/lib/onlyoffice
-v /opt/dockerfile/onlyoffice/db:/var/lib/postgresql
-v /opt/dockerfile/onlyoffice/nginx:/etc/onlyoffice/documentserver/nginx
onlyoffice/documentserver:6.4
因为我宿主机的443端口被占用,所以用宿主机8443端口映射容器443端口,然后防火墙开放端口
#开放8443端口
firewall-cmd --zone=public --add-port=8443/tcp --permanent
#刷新
firewall-cmd --reload
配置SSL证书
首先进入数据挂载目录/opt/dockerfile/onlyoffice/data,创建certs目录mkdir certs,然后将我们的SSL文件pem和key文件放到该目录下,使用openssl命令把pem转为crt文件
openssl x509 -in onlyoffice.pem -out onlyoffice.crt
onlyoffice容器内已经把nginx配置文件挂载出来,所以进入nginx挂载目录,找到ds.conf文件,修改ssl配置
## HTTPS host
server {listen 0.0.0.0:443 ssl http2;listen [::]:443 ssl http2 default_server;server_tokens off;root /usr/share/nginx/html;## Strong SSL Security## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.htmlssl on;ssl_certificate /var/www/onlyoffice/Data/certs/onlyoffice.crt;ssl_certificate_key /var/www/onlyoffice/Data/certs/onlyoffice.key;# Uncomment string below and specify the path to the file with the password if you use encrypted certificate key# ssl_password_file {{SSL_PASSWORD_PATH}};ssl_verify_client off;ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_session_cache builtin:1000 shared:SSL:10m;ssl_prefer_server_ciphers on;add_header Strict-Transport-Security max-age=31536000;# add_header X-Frame-Options SAMEORIGIN;add_header X-Content-Type-Options nosniff;## [Optional] If your certficate has OCSP, enable OCSP stapling to reduce the overhead and latency of running SSL.## Replace with your ssl_trusted_certificate. For more info see:## - https://medium.com/devops-programming/4445f4862461## - https://www.ruby-forum.com/topic/4419319## - https://www.digitalocean.com/community/tutorials/how-to-configure-ocsp-stapling-on-apache-and-nginx# ssl_stapling on;# ssl_stapling_verify on;# ssl_trusted_certificate /etc/nginx/ssl/stapling.trusted.crt;# resolver 208.67.222.222 208.67.222.220 valid=300s; # Can change to your DNS resolver if desired# resolver_timeout 10s;## [Optional] Generate a stronger DHE parameter:## cd /etc/ssl/certs## sudo openssl dhparam -out dhparam.pem 4096##include /etc/nginx/includes/ds-*.conf;}
注:ssl_certificate证书配置的路径是/var/www/onlyoffice/Data/certs(挂载至宿主机了)
重启容器
重启容器访问https://我的域名:8443/可以访问到onlyoffice主页,进入演示页面上传文件进行预览会报Download failed Press “OK” return to document list,问题产生的原因是Document Server默认拒绝未认证的请求(签名认证的HTTPS请求)
解决方案:进入容器修改default.json配置
#进入容器
docker exec -it onlyoffice /bin/bash
#修改default.json配置
vim /etc/onlyoffice/documentserver/default.json
将rejectUnauthorized属性设置为false,如下
"requestDefaults": {"headers": {"User-Agent": "Node.js/6.13","Connection": "Keep-Alive"},"gzip": true,"rejectUnauthorized": false},
再次重启容器后正常预览文件,至此onlyoffice跨域问题解决
参考文章:
https://www.cnblogs.com/Magiclala/p/15497267.html
https://blog.csdn.net/weixin_44048054/article/details/126057999
记录OnlyOffice跨域问题排查过程相关推荐
- 还在问跨域?本文记录js跨域的多种实现实例
前言 众所周知,受浏览器同源策略的影响,产生了跨域问题,那么我们应该如何实现跨域呢?本文记录几种跨域的简单实现 前期准备 为了方便测试,我们启动两个服务,10086(就是在这篇博客自动生成的项目,请戳 ...
- SSO的几种跨域方案
在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...
- js跨域的理解与实现
域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation).信任关系是连接在域与域之间的桥梁.当一个域与其他域建立了信任关系后,2个域之 ...
- Web应用跨域访问解决方案
Web应用跨域访问解决方案 Web应用的跨域访问解决方案 Web跨域访问解决方案 做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与 ...
- CockRoachDB配置跨域集群
这段时间老师需要我测试CRDB的性能,因而对CRDB做了些简单的了解,可以进行简单使用及测试编译,首先说明我使用的是阿里云服务器Ubuntu20.04,各位可以根据需要自行选择操作系统,centos和 ...
- Web应用跨域访问及单点登录解决方案汇总
做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.Ajax的跨域访问问题是现有的Aj ...
- js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource
js跨域访问提示错误:XMLHttpRequest cannot load http://...... No 'Access-Control-Allow-Origin' header is prese ...
- Ajax请求利用jsonp实现跨域
跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资 ...
- 后端工程师的「跨域」之旅
跨域,对后端工程师来说,可谓既熟悉又陌生. 这两个月我以架构师的角色参与一款教育产品的孵化,有了一段难忘的跨域之旅. 写这篇文章,我想分享我在跨域这个知识点上的经历和思考,希望对大家有所启发. 1 遇 ...
最新文章
- 科普丨深度神经网络与生命的意义
- 海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践
- SpringBoot 2.0 编程方式配置,不使用默认配置方式
- 手持GPS坐标系统的转换与应用
- 【转】搭建Java版WebService
- CDQ 分治解决和点对有关的问题
- 【Elasticsearch】 Full text queries query_string 等 字符串查询
- pintos project (2) Project 1 Thread -Mission 1 Code
- 工程选择LibGdx--开发环境搭建Strut2教程-java教程
- 2016 Android Top 10 Library
- 维纳滤波及其简单实现
- 什么是防病毒网关 防病毒网关的功能特点
- 微信群控二次开发SDK
- 企业网络安全区域划分的原则和方法
- 克鲁斯卡尔算法(Kruskal Algorithm)——图的最小生成树
- Echarts折线图X轴Y轴图例位置调整
- 开放平台设计之接口签名认证
- 白山搜索引擎优化收费_白山SEO-白山网站优化-白山新站整站快速排名-【
- 嵌入式Linux 的Cramfs 根文件系统配置成可读可写
- 商城类小程序源码,拼团、砍价、秒杀、优惠券,客服系统一套源码全搞定!