通过绿联 UGREENlink 访问内网 Web 站点

通过绿联 UGREENlink 访问内网 Web 站点
Photo by Robynne O / Unsplash

前置条件

  • 懂基本 Linux 命令
  • 懂基本 Nginx 配置
  • 有绿联 NAS 的 SSH root 权限
  • Web应用支持设置子路径(sub-path)

原理说明

绿联 NAS 使用 Nginx 作为反向代理来管理 Web 应用。通过在 Nginx 配置中插入自定义规则,可以让特定子路径指向内网的 Web 应用。

关键目录:

  • /etc/nginx/conf.d - 子路径配置目录
  • /etc/nginx/service.d - 服务配置目录

实现效果

假设 UGREENlink ID 为:mylinkid

通过访问 https://ug.link/mylinkid 获取到当前的服务器为:https://mylinkid.cn33.ug.link/desktop/

配置完成后可实现:

通过 https://mylinkid.cn33.ug.link/SUBPATH/ 直接访问内网的 Web 应用

例如:

  • https://mylinkid.cn33.ug.link/pma/ → phpMyAdmin
  • https://mylinkid.cn33.ug.link/monitor/ → 监控系统
  • https://mylinkid.cn33.ug.link/dav/ → Webdav
  • https://mylinkid.cn33.ug.link/app/ → 其他应用
通过绿联 UGREENlink 访问 phpMyAdmin 效果

配置步骤

1. 准备自定义配置目录

假设自定义 Nginx 配置路径为:/volume1/data/nginx

创建目录结构:

mkdir -p /volume1/data/nginx/conf.d

2. 创建主配置文件

/volume1/data/nginx 下创建 custom_conf.d.conf

# 引入自定义子路径配置
include /volume1/data/nginx/conf.d/*.conf;

3. 创建初始化脚本

/volume1/data/nginx 下创建 init_custom_conf.d.sh

#!/bin/bash

# 先删除旧的软链接(如果存在)
rm -rf /etc/nginx/conf.d/custom_conf.d.conf

# 创建新的软链接,将自定义配置引入 Nginx
ln -s /volume1/data/nginx/custom_conf.d.conf /etc/nginx/conf.d/custom_conf.d.conf

echo "自定义配置已初始化"

赋予执行权限:

chmod +x /volume1/data/nginx/init_custom_conf.d.sh

4. 执行初始化

cd /volume1/data/nginx
./init_custom_conf.d.sh

执行后,Nginx 会自动加载 /volume1/data/nginx/conf.d/ 目录下的所有 .conf 文件。

示例一:phpMyAdmin

步骤 1:部署 phpMyAdmin 容器

创建 docker-compose.yaml

services:
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: phpmyadmin
    network_mode: bridge
    environment:
      PUID: 1000
      PGID: 100
      TZ: Asia/Shanghai
      PMA_ARBITRARY: 1  # 允许连接任意数据库
      PMA_ABSOLUTE_URI: "https://mylinkid.cn33.ug.link/pma"  # 指定子路径
    ports:
      - 3380:80  # 映射到宿主机 3380 端口
    restart: unless-stopped

关键配置说明:

  • PMA_ABSOLUTE_URI:告诉 phpMyAdmin 它运行在子路径下,确保资源路径正确
  • ports:映射到宿主机端口,供 Nginx 反向代理,端口设置为 3380

启动容器:

docker-compose up -d

步骤 2:添加 Nginx 配置

/volume1/data/nginx/conf.d/ 下创建 phpMyAdmin.conf

location ~ ^/pma {
    include proxy_params;
    
    # 代理配置
    proxy_intercept_errors on;
    proxy_pass http://127.0.0.1:3380;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    
    # 重写路径,去掉 /pma 前缀
    rewrite ^/pma(/.*)$ $1 break;
}

步骤 3:验证并重载 Nginx

检查配置是否正确:

nginx -t

如果输出 syntax is oktest is successful,则重载配置:

nginx -s reload

步骤 4:访问测试

在浏览器中访问:https://mylinkid.cn33.ug.link/pma/

应该能看到 phpMyAdmin 的登录界面。

示例二:代理系统的Webdav 服务

💡
出于安全考虑,不建议通过互联网直接访问 NAS 的 WebDAV 服务,因为用户名和密码仅经过简单的 Base64 编码即可被还原,存在泄露风险。如果必须使用,建议为此创建一个专用的、权限受限的账号,并仅将其用于 WebDAV 访问。

关键配置说明:

  • 要在系统中启用 Webdav,默认 HTTP 端口是 5005
  • 绿联的 Webdav 服务是没有子路径的,添加代理时要增加 /dav 子路径,这个子路径 nginx 处理时要去除,返回给用户的时候又要加上。

Nginx 配置 /volume1/data/nginx/conf.d/dav.conf

location = /dav {
    return 301 $scheme://$http_host/dav/;
}

location /dav/ {
    include proxy_params;               # 绿联默认请求头
    proxy_pass http://localhost:5005/;  # 注意:末尾的 / 不可省略!

    proxy_pass_request_headers on;
    proxy_request_buffering off;
    proxy_buffering off;
    client_max_body_size 0;
    proxy_http_version 1.1;

    # 替换返回结果,在路径前面加上 /dav
    proxy_set_header Accept-Encoding "";
    sub_filter '<D:href>' '<D:href>/dav';       # 增加路径前缀返回
    sub_filter_once off;
    sub_filter_types text/xml application/xml;  # 仅处理 WebDAV 响应

    proxy_redirect default;
}

访问地址:https://mylinkid.cn33.ug.link/dav/
在 nPlayer 等应用中参考这样填写
主机:mylinkid.cn33.ug.link
端口:443
路径:/dav/
HTTPS:勾选
用户名、密码:写你自己的

浏览器直接访问 Webdav 效果

示例三:Jellyfin 媒体服务器

docker-compose.yaml

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    network_mode: bridge
    environment:
      PUID: 1000
      PGID: 100
      TZ: Asia/Shanghai
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /volume1/Media:/media  # 媒体库路径
    ports:
      - 8096:8096  # HTTP 端口
    restart: unless-stopped

关键配置说明:

  • Jellyfin 支持通过管理界面设置基础 URL(Base URL)
  • 登录 Jellyfin 后,进入 控制台 → 网络 → 基础 URL,填写 /jellyfin

或者编辑配置文件 /volume1/data/jellyfin/config/config/network.xml,添加:

<BaseUrl>/jellyfin</BaseUrl>

Nginx 配置 /volume1/data/nginx/conf.d/jellyfin.conf

location /jellyfin {
    proxy_pass http://127.0.0.1:8096;
    include proxy_params;
    
    # WebSocket 支持(用于实时更新)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    # 缓冲区设置(重要:视频播放需要)
    proxy_buffering off;
    
    # 超时设置
    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;
}

访问地址:https://mylinkid.cn33.ug.link/jellyfin/

💡 提示:Jellyfin 首次访问时需要完成初始化向导,设置管理员账号和媒体库路径。记得在网络设置中将基础 URL 设置为 /jellyfin。硬件转码需要确保容器有 GPU 访问权限。

注意事项

1. 应用必须支持子路径

并非所有 Web 应用都支持在子路径下运行。应用需要:

  • 能够配置 base path / sub path
  • 正确处理相对路径和绝对路径
  • 支持通过环境变量或配置文件设置基础路径

2. WebSocket 支持

如果应用使用 WebSocket(如 Home Assistant、Node-RED),需要在 Nginx 配置中添加:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

3. 路径重写规则

根据应用的不同,可能需要调整 rewrite 规则:

  • rewrite ^/pma(/.*)$ $1 break; - 去掉前缀
  • rewrite ^/app$ /app/ permanent; - 添加尾部斜杠

4. 安全建议

  • 限制访问源:如果只在特定网络使用,可以配置 IP 白名单
  • 启用认证:考虑在 Nginx 层面添加 HTTP Basic Auth
  • 定期更新:及时更新容器镜像,修复安全漏洞

故障排查

问题 1:403 Forbidden

可能原因:

  • Nginx 配置语法错误
  • 应用未正确配置子路径
  • 权限问题

解决方法:

# 查看 Nginx 错误日志
tail -f /var/log/nginx/error.log

# 检查容器是否正常运行
docker ps | grep phpmyadmin

# 测试容器端口是否可访问
curl http://127.0.0.1:3380

问题 2:样式丢失或资源 404

**原因:**应用未正确配置子路径,导致静态资源路径错误

解决方法:

  • 检查应用的子路径配置(如 PMA_ABSOLUTE_URI
  • 确认 proxy_set_header 配置正确
  • 查看浏览器控制台,确认资源请求路径

问题 3:配置不生效

检查步骤:

# 1. 确认软链接存在
ls -la /etc/nginx/conf.d/custom_conf.d.conf

# 2. 确认配置文件存在
ls -la /volume1/data/nginx/conf.d/

# 3. 测试 Nginx 配置
nginx -t

# 4. 查看 Nginx 进程
ps aux | grep nginx

# 5. 重启 Nginx(如果重载无效)
systemctl restart nginx

问题 4:系统更新后配置丢失

绿联 NAS 系统更新可能会清除软链接。

解决方案:重新执行初始化脚本

/volume1/data/nginx/init_custom_conf.d.sh

扩展应用

批量配置多个应用

/volume1/data/nginx/conf.d/ 下创建多个配置文件:

/volume1/data/nginx/conf.d/
├── phpMyAdmin.conf
├── dav.conf
├── jellyfin.conf

每次添加新配置后,执行 nginx -s reload 即可。