我有一个相当标准的设置,使用 nginx 作为 Web 前端(带有 https 证书等)和 nextcloud FPM 后端;整个安装的流量非常低,因为我是唯一一个使用它的人。
在某一时刻 https 停止工作,来自外部的每个连接都会导致超时或连接被拒绝;在这种情况下,似乎 nextcloud 正在工作,而 nginx 没有。我认为这可能与我的主机上的一些节能有关,但事实并非如此,因为同一主机上的所有其他容器都可以正常工作;有趣的是,有一种简单的方法可以让它再次工作,那就是在主机上打开一个 shell 并执行以下操作:
cd $NEXTCLOUD_DIRECTORY
其中 NEXTCLOUD_DIRECTORY 是应用程序的基本目录,docker-compose.yml 文件和数据目录都在其中(位于 $HOME/docker/nextcloud-letsencrypt)。
我只是不明白为什么会发生这种情况以及为什么该操作是一种解决方案...
这是我的撰写文件:
version: '3'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "127.0.0.1:8443:443"
volumes:
- ./data/nginx:/etc/nginx/conf.d
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
- ./data/nextcloud/www:/var/www/html:ro
- ./data/nextcloud/apps:/var/www/html/custom_apps:ro
restart: unless-stopped
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
restart: unless-stopped
cloud-db:
container_name: ${DB_CONTAINER_NAME}
image: mariadb:${DB_IMAGE_TAG}
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
...
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
app:
image: nextcloud:21-fpm-alpine
links:
- cloud-db
user: "1000:1004"
volumes:
- ./data/nextcloud/www:/var/www/html
- ./data/nextcloud/apps:/var/www/html/custom_apps
- ./data/nextcloud/config:/var/www/html/config
- /mnt/usb/shared/nextcloud:/var/www/html/data
- /mnt/usb/Expansion_2/serie:/mnt/serie:ro
- /mnt/usb/archivio/archivio:/mnt/archivio:ro
restart: unless-stopped
./data 位于根 FS 中,在用户 1000 的主目录中。
/mnt/usb/shared/nextcloud 在 ext4 USB 驱动器上(ext4 默认值,nofail 0 0),R/W 给用户
/mnt/usb/Expansion_2 是另一个通过 NC 服务的 ex4 USB 驱动器(ext4 默认值,nofail 0 0)(它们在 NC 中注册为外部存储)
似乎解决方案是使用 restart:always 而不是“除非停止”。我真的不知道为什么我需要它,因为没有人停止容器,所以它们应该无限期地运行,就像我在同一台机器上使用“除非停止”并无限期地保持下去的许多其他容器一样。