搭建环境
- vps:Berohost
- 操作系统:debian 12
- 面板:1panel
-使用docker搭建
问题
刚开始搭建时,都是使用1panel里的默认设置,搭建完成后,我尝试使用http://ip:端口
访问,出现下面错误:
这个错误是因为客户端的请求使用协议与服务器配置的协议不匹配造成的。
于是我去查看了1panel里nextcloud的docker compose文件,如下:
networks:
1panel-network:
external: true
services:
nextcloud:
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
environment:
- PUID=1000
- PGID=1000
- TZ=${TIME_ZONE}
image: linuxserver/nextcloud:28.0.3
labels:
createdBy: Apps
networks:
- 1panel-network
ports:
- ${HOST_IP}:${PANEL_APP_PORT_HTTPS}:443
restart: always
volumes:
- ./data/config:/config
- ./data/data:/data
version: "3"
从${HOST_IP}:${PANEL_APP_PORT_HTTPS}:443
这里可以看到,服务器的端口是映射到容器内的443端口的,问题就出现在这里了,我们原来是使用http协议去与https协议匹配,自然不能成功访问了。因此,我们应该使用https://ip:端口
来访问nextcloud。
反代时遇到的问题
这里我使用的是caddy。
域名 {
reverse_proxy https://ip:端口 {
}
}
我刚开始在caddy中使用的是这个配置文件,不出意外,果然我们不能通过域名成功反代。
问了GPT后,由于我们`reverse_proxy https://ip:端口`中用的是https,caddy在进行反代时会进行tls握手验证证书,而我们的https://ip:端口显然是没有ssl证书的,所以证书验证失败,自然不能反代成功。
正确的配置文件:
域名 {
reverse_proxy https://ip:端口 {
transport http {
tls_insecure_skip_verify
}
}
}
补充:
docker compose文件中端口映射到容器的443端口,这也就是说容器内的nextcloud已经申请了ssl证书了。
这里我尝试了一下,docker容器内的ssl.config文件是映射到服务器的/opt/1panel/apps/nextcloud/nextcloud/data/config/nginx(根据你安装1panel的位置会有所不同),我更改了一下配置文件,把ssl证书文件和密钥文件的名字改了。
然后重启容器,果然,访问nextcloud服务时出错了。
因为我们是将外部端口映射到容器的443端口,而容器内的ssl验证失败,自然无法通过443访问。
这里的补充仅仅是加深一下我对ssl的理解。
评论区