我有一个相当标准的设置,以 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),用户可读写
/mnt/usb/Expansion_2 是另一个通过 NC 提供服务的 ex4 USB 驱动器(ext4 默认值,nofail 0 0)(它们在 NC 中注册为外部存储)
答案1
看来解决方案是使用 restart:always 而不是“unless-stopped”。我真的不知道为什么我需要这样做,因为没有人停止容器,所以它们应该无限期地运行,就像我在同一台机器上使用“unless-stopped”并无限期保持运行的许多其他容器一样。