干掉群晖 DSM 内置 Nginx,我的 NAS 我做主!

群晖 DSM 使用 Nginx 提供 Web 和反代服务,虽然方便,但有许多功能限制。例如不能批量替换、不能片段复用。这还不算什么,难受的是这内置的 Ng­inx 反应极其迟钝,修改配置等待重载生效的时间,都够我扒完一碗饭了。更别提配套的证书申请效率低下,即便换用 acme.sh 来签发证书也十分麻烦(例如这篇、这篇)。所以总体而言,并不好用。

我早就对群晖 DSM 的 Docker 和 Shell 深恶痛绝,而这次巴掌扇到了 Ng­inx 的脸上。

下面,就让我来教大家如何自立门户,额外安装一个 Ng­inx,接管群晖的网络反代乃至整个 DSM 内部的网页功能。

或者你可以使用 caddy,这样就连 SSL 证书都直接搞定了。但我不会,我只能讲讲我会的 Ng­inx。
解除端口占用
既然咱都另起炉灶了,那这内置 Ng­inx 占用的 443 和 80 端口就要先解除掉。

如果你不想执行这一步,可以在后续为自行安装的 Ng­inx 配置 8443 和 8080 端口。但本地内网访问还要敲端口我觉得超级麻烦,所以还是建议你先解除端口占用。
使用 root 用户登录 ssh,然后使用以下命令:

sed -i -e 's/80/8080/' -e 's/443/8444/' /usr/syno/share/nginx/server.mustache /usr/syno/share/nginx/DSM.mustache /usr/syno/share/nginx/WWWService.mustache

这一段命令的意思是,将 /usr/syno/share/nginx/server.mustache、/usr/syno/share/nginx/DSM.mustache、/usr/syno/share/nginx/WWWService.mustache 文件内的所有 80 替换成 8080, 443 替换成 8443。

再重启 Ng­inx,使修改生效:

synosystemctl restart nginx

可以在「控制面板 - 网络 - DSM 设置」里随便改一个端口号保存再改回去,就会自动重启 WEB 服务。或者直接重启 NAS 也可以,但耗时较长。

实际使用中重启系统并不会导致配置被覆盖,但以防万一,你可以在「控制面板 - 任务计划」中新增一个「触发的任务」,用户账号选择 root,事件选择「开机」,然后在「任务设置」内填入以下运行命令:

sed -i -e 's/80/8080/' -e 's/443/8444/' /usr/syno/share/nginx/server.mustache /usr/syno/share/nginx/DSM.mustache /usr/syno/share/nginx/WWWService.mustache

synosystemctl restart nginx

之后保存即可。

关闭反代服务
如果你已经在使用内置的反代服务,那么请全部关闭。即删除「控制面板 - 登录门户 - 反向代理服务器」中的所有配置。

如果你是正版群晖用户,请关闭 Quick­Con­nect,否则后续无法使用自己安装的 Ng­inx 接管系统服务,如 Syn­ol­ogy Photo、Syn­ol­ogy Drive。

安装 Nginx 和 acme.sh
安装时需要连接 GitHub,请自行解决连接问题,比如使用镜像服务(如 mir­ror.gh­proxy.com)。

使用 Docker 安装 Ng­inx 和 acme.sh。

这里用上我为了水博客容器化而准备的 dnmp:https://github.com/mikusaa/dnmp 。ng­inx 使用的是包含了 QUIC、HTTP/3、Google's brotli compression 的非官方的版本,具体信息可以参考官方文档。acme.sh 则是官方版本。

建议使用非 root 用户安装容器
首先,登录 SSH,进入 docker 文件夹:

cd /volume1/docker

因为群晖中安装 Docker 需要先创建文件夹,所以咱直接克隆这个仓库,就不手动创建文件夹了:

git clone https://github.com/mikusaa/dnmp.git

如果没有安装 Git 套件,请参考《优化群晖 NAS 的 Shell 使用体验》中的相关步骤安装一下吧!
由于指定使用了名为 dnmp 的网络,所以咱需要先创建一个 docker 网络。当然,也可以修改为任意你想要的网络名称,只是别忘了同时修改后面的 com­pose 网络配置。

那么,就新建一个名为 nas 的网络吧

docker network create -d bridge nas

再进入目录:

cd dnmp

复制一份配置文件:

cp docker-compose.yml.example docker-compose.yml

自行注释除 Ng­inx 和 acme.sh 以外的部分,因为 mysql 和 PHP 在 NAS 中你应该用不到,除非想在 NAS 里建站玩。或者,直接复制下面的内容替换上面的 docker-com­pose.yml 文件:

services:
  acme.sh:
    image: neilpang/acme.sh:latest
    container_name: acme.sh
    command: daemon
    environment:
      - DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=dnmp
      # - DEPLOY_DOCKER_CONTAINER_KEY_FILE=""
      # - DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE=""
      - DEPLOY_DOCKER_CONTAINER_RELOAD_CMD=nginx -s reload
      - TZ=Asia/Shanghai
    volumes:
      - ./acme.sh:/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
    networks:
      - nas

  nginx:
    image: macbre/nginx-http3
    container_name: nginx
    user: root:root
    ports:
      - 80:80
      - 443:443/tcp
      # - 443:443/udp #若需使用quic,取消该端口的注释
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:rw
      - ./nginx/ssl:/etc/nginx/ssl:rw
      - ./nginx/rewrite:/etc/nginx/rewrite:ro
      - ./nginx/logs:/home/wwwlogs:rw
      - ./nginx/cache:/home/wwwcache:rw
      - ./www:/home/wwwroot:rw
    environment:
      - TZ=Asia/Shanghai
    labels:
      - sh.acme.autoload.domain=dnmp
    restart: unless-stopped
    networks:
      - nas

networks:
  nas:
    external: true

启动便可:

docker compose up -d

如果没有 Com­pose 或者不是最新版本导致报错,使用以下命令快速安装或更新:

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
sh -c "curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > $DOCKER_CONFIG/cli-plugins/docker-compose"
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

检查版本:

docker compose version

输出 Docker Compose version v2.25.0 即可。

具体 Com­pose 的相关使用请参考《原来,群晖也能用 Docker Compose!》或自行搜索文档
签发证书
后续操作都默认是在 acme.sh 的容器内部终端中执行,否则请自行在命令前加上 docker exec acme.sh。或者在安装 ohmyzsh 后使用 alias 别名,具体参考《优化群晖 NAS 的 Shell 使用体验》。

申请 SSL 证书
acme.sh 是一个用于签发证书的脚本。关于 ACME 协议 的相关知识,你可以自行查找资料。这里直接介绍 acme.sh 的使用方法。

启动容器后,进入 acme.sh 容器内部的终端 sh :

docker exec -it acme.sh sh

原文

  ~  ~  The   End  ~  ~  


 赏 
感谢您的支持,我会继续努力哒!
支付宝收款码
tips
(*) 3 + 8 =
快来做第一个评论的人吧~
歌曲封面
0:00