Trilium 分享 — OpenResty / Nginx 反向代理 配置与说明
本文档介绍如何使用 OpenResty / Nginx 将外网域名 https://srv.isrv.cn 映射到本地 Trilium 分享服务 http://127.0.0.1:40172/share/...。要求为:
- 根地址
https://srv.isrv.cn映射到http://127.0.0.1:40172/share/server(主页特例) - 其它任意路径
https://srv.isrv.cn/<path>映射到http://127.0.0.1:40172/share/<path>(自动前缀/share)
1. 配置目的与需求
目标是只将 Trilium 的分享功能暴露到互联网,同时保持 Trilium 的管理界面仅在内网或 VPN 中访问。你要求的映射规则是:
- 主页(
/) 特殊映射到/share/server - 其它任何路径都在外部路径前自动加上
/share转发到本地 Trilium
这能保证:
- 浏览器看到的 URL 友好(无需显式包含
/share) - Trilium 分享链接(包括静态资源、图片、脚本)能正确被后端服务处理
2. 完整可用的 OpenResty / Nginx 配置
server {
listen 443 ssl http2;
server_name srv.isrv.cn;
ssl_certificate /www/sites/p1.isrv.cn/ssl/fullchain.pem;
ssl_certificate_key /www/sites/p1.isrv.cn/ssl/privkey.pem;
# 主页(精确匹配) → /share/server
location = / {
proxy_pass http://127.0.0.1:40172/share/server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# 其它所有请求 → /share<原始请求 URI>
location / {
# 将外部请求 URI 透传到后端,但在最前面加上 /share
proxy_pass http://127.0.0.1:40172/share$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
将上面的
ssl_certificate与ssl_certificate_key路径替换为你实际使用的证书文件路径。若在本机使用 HTTP(不推荐),将listen改为80并移除ssl_*行。
3. 配置详解(逐行说明)
listen 443 ssl http2;:监听 443(HTTPS),启用 HTTP/2 提升并发性能。server_name srv.isrv.cn;:匹配域名。ssl_certificate/ssl_certificate_key:SSL 证书与私钥位置。
location = /(精确匹配根路径)
location = /:仅在请求路径精确为/时匹配(不包含/foo)。proxy_pass http://127.0.0.1:40172/share/server;:把根路径代理到后端的/share/server(你的 Trilium 分享主页)。proxy_set_header Host $host;:将原始主机名传给后端(有些应用用来生成 URL)。X-Forwarded-*头:保留客户端 IP 与原始协议,便于后端日志或处理。proxy_http_version 1.1与proxy_set_header Connection "":改善长连接与 WebSocket/事件流等场景兼容性。
location /(所有其它路径)
proxy_pass http://127.0.0.1:40172/share$request_uri;:关键点,将原始请求 URI(包含路径与查询字符串)追加到/share之后发往后端。例如:- 外部
/a/b?x=1→ 内部http://127.0.0.1:40172/share/a/b?x=1
- 外部
- 通过这种写法,可以透明代理静态资源、api 路径与带参数的分享链接。
4. 变体与常见场景
4.1 后端只在 /share/server 下工作
如果你的后端只能处理 /share/server/... 而不是 /share/...,可以改写 proxy_pass:
location / {
proxy_pass http://127.0.0.1:40172/share/server$request_uri;
}
这会把 /foo 转到 /share/server/foo。
4.2 保持 Host 为后端原始(不推荐)
如果需要把 Host 设为后端的主机(例如后端严格校验 Host),可以把 proxy_set_header Host 改为 127.0.0.1:40172。但通常保留原 Host 更有利于生成外部链接。
4.3 支持 WebSocket / SSE
Trilium 的分享功能大部分是普通 HTTP,但若后端使用 WebSocket/SSE,确保 proxy_http_version 1.1; 与 proxy_set_header Connection ""; 已设置,且没有 proxy_buffering on 强制缓冲影响实时性。
5. 测试方法与验证步骤
-
重载配置(有修改配置后)
sudo nginx -t && sudo systemctl reload nginx -
测试首页
curl -I https://srv.isrv.cn/ # 或者 curl -v https://srv.isrv.cn/- 期望返回 200,且页面内容为 Trilium 分享主页(或跳转后显示)。
-
测试其它路径
curl -v https://srv.isrv.cn/some-share-id- 期望代理到
http://127.0.0.1:40172/share/some-share-id并返回正常内容。
- 期望代理到
-
检查静态资源
- 在浏览器打开一个分享页面,观察开发者工具(Network),确认 CSS/JS/图片请求返回 200 且路径为
/share/...(代理后端)。
- 在浏览器打开一个分享页面,观察开发者工具(Network),确认 CSS/JS/图片请求返回 200 且路径为
-
查看 Nginx 与 后端 日志
- Nginx:
/var/log/nginx/access.log与error.log - Trilium: 你部署 Trilium 的容器/服务日志,确认没有 404/500 错误。
- Nginx:
6. 常见问题与排查建议
- 样式/脚本加载失败:通常因为后端生成资源链接时使用了不带
/share的绝对路径,或代理没有正确转发查询字符串。使用proxy_pass ...$request_uri可保留查询字符串。 - 302 重定向到错误路径:若后端返回重定向(Location 头指向
/share/...之外),检查后端生成 URL 的逻辑。proxy_redirect可以用来重写 Location 头:proxy_redirect http://127.0.0.1:40172/share/ https://srv.isrv.cn/;但通常保留
Host并让后端生成正确的外部 URL 更好。 - 静态资源返回 404:确认后端应用实际提供的路径(是否确实在
/share/下),并检查 Nginx 的 error_log 获取精确信息。
7. 安全与性能建议
-
仅暴露分享服务:你的配置已经将
/与/any映射到分享功能,未暴露 Trilium 管理界面(前提是后端管理界面不在/share下)。若管理界面与分享共存于同一路径,请使用更严格的访问控制(IP 白名单、VPN)。 -
强制 HTTPS:如果你还监听 80 端口,建议强制重定向到 HTTPS:
server { listen 80; server_name srv.isrv.cn; return 301 https://$host$request_uri; } -
限流 / 防暴力:可以用
limit_req、limit_conn或 OpenResty Lua 插件实现简单限流,防止恶意扫链或暴力请求。 -
缓存静态资源:对
/share/assets/*等静态资源设置expires或cache-control可提高性能(注意动态分享内容不要缓存)。 -
安全头:可以添加
X-Frame-Options、X-Content-Type-Options等头部提升浏览器安全性。
8. 部署与运维小贴士
- 在修改配置前备份原
nginx配置文件。 - 使用
nginx -t检查语法再 reload。 - 若使用 Docker 容器运行 Trilium,请确认容器监听
127.0.0.1:40172或内部网络能被主机访问;若在容器内监听0.0.0.0且端口映射合理,OpenResty 能访问到服务。 - 定期检查证书有效期(使用 acme.sh 或 certbot 自动续期)。
9. HTTP 自动跳转 HTTPS(301 重定向)
在你的主 HTTPS 配置之外,建议额外添加一个 80 端口的 server 区块,实现 http → https 自动跳转:
server {
listen 80;
server_name srv.isrv.cn;
# 访问 http://srv.isrv.cn 自动跳转到 https://srv.isrv.cn
return 301 https://$host$request_uri;
}
这是强制 HTTPS 的标准写法,避免明文访问。
附:常用命令
# 检查 nginx 配置
sudo nginx -t
# 重新加载 nginx(不重启进程)
sudo systemctl reload nginx
# 查看最近 200 条 nginx 访问日志
tail -n 200 /var/log/nginx/access.log
# 查看最近 200 条 nginx 错误日志
tail -n 200 /var/log/nginx/error.log
如果你需要,我可以:
- 把配置再改为包含
proxy_redirect/add_header等增强版本; - 帮你写一个
systemd/ Docker Compose 部署示例来一起运行 OpenResty 与 Trilium; - 根据你的后端响应(贴
curl -v的输出)进一步调整 proxy 规则与重写策略。
MinIO 二进制标准化部署指南(含你此次迁移的全过程)
以下内容将整理成一篇完整、规范、可作为你知识库文章使用的 MinIO 二进制部署与迁移教程。文章严格遵循 Linux FHS(文件系统层次结构标准),路径布局清晰,适合作为长期参考文档。
MinIO 二进制部署(标准 FHS 布局)与迁移完整教程
本教程基于你的实际操作过程整理而成,适用于 Ubuntu / Debian / Arch / CentOS 等系统,并严格按照 Linux FHS 规范进行目录规划,使 MinIO 安装结构清晰、标准、可维护。
适用场景:
- 二进制方式部署 MinIO(非 Docker)
- 从旧服务器迁移 MinIO 数据
- 规范 MinIO 存放路径,避免未来忘记位置
文章内容包括:
- 目录规划(符合 FHS)
- 创建运行用户
- 放置二进制程序
- 配置文件位置
- 数据目录位置
- systemd 服务文件
- 启动、开机自启
- 迁移数据的方法
- 验证运行状态
1. MinIO 标准目录规划(符合 FHS)
按照 Linux FHS:
| 类型 | 放置路径 | 说明 |
|---|---|---|
| 可执行程序 | /usr/local/bin/minio |
二进制程序放这里最标准 |
| 配置文件 | /etc/minio/ |
环境变量、启动参数等 |
| 数据 / 存储桶数据 | /var/lib/minio/ |
MinIO 数据(重点) |
| 日志文件(若使用文件日志) | /var/log/minio/ |
systemd 会管理,不强制 |
| systemd 服务文件 | /etc/systemd/system/minio.service |
MinIO 服务管理 |
这是 官方推荐且最通用的平台级布局。
2. 新建 MinIO 运行用户
MinIO 不应使用 root 运行:
useradd -r minio
说明:
-r:创建系统用户(无 home 目录,不允许登录)- 更安全
3. 安装 MinIO 二进制程序
假设你解压后得到:
miniominio.serviceminio-distributed-start.shdata/(旧数据)
将二进制移动到:
mv minio /usr/local/bin/
4. 创建配置目录
mkdir -p /etc/minio
你可以在其中放:
/etc/minio/minio.env
用来设置:
MINIO_ROOT_USER=youradmin
MINIO_ROOT_PASSWORD=yourpassword
systemd 将自动加载环境文件。
5. 数据目录放置(重点)
MinIO 所有数据(桶内容、元数据等)必须放在统一的 FHS 标准位置:
/var/lib/minio/
你的操作完全正确:
mv data/ minio # 把 data 重命名为 minio
mv minio /var/lib/ # 放到标准数据目录
最终数据路径:
/var/lib/minio/
6. 设置权限
非常关键:
chown -R minio:minio /var/lib/minio
chown -R minio:minio /etc/minio
7. systemd 服务文件(最终版)
这里是最标准的 MinIO 服务文件配置(你已正确使用):
[Unit]
Description=MinIO Object Storage
After=network.target
[Service]
User=minio
Group=minio
EnvironmentFile=/etc/minio/minio.env
ExecStart=/usr/local/bin/minio server
--address :9000
--console-address :9001
/var/lib/minio/
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
将其保存为:
/etc/systemd/system/minio.service
8. 启动并设置开机自启
systemctl daemon-reload
systemctl enable --now minio
查看运行状态:
systemctl status minio
你实际输出示例:
Active: active (running)
API: http://127.0.0.1:9000
WebUI: http://127.0.0.1:9001
说明运行正常。
9. 从旧机器迁移 MinIO 的正确方法
你实际做的是 完美且标准的方法:
(1)备份旧机器 /var/lib/minio/
你当时的文件是:
minio_2025-11-15.tar.gz
例如:
tar -czf minio_backup.tar.gz /var/lib/minio/
(2)在新机器解压
tar xf minio_backup.tar.gz
你得到:
data/ → minio/ → /var/lib/minio/
操作完全正确。
(3)确保权限
chown -R minio:minio /var/lib/minio
(4)systemd 启动即可
不需要其它操作。
总结:你此次迁移非常标准
你的目录最终布局达到最佳实践:
/usr/local/bin/minio ← 程序
/etc/minio/minio.env ← 配置
/var/lib/minio/ ← 数据(桶文件)
/etc/systemd/system/minio.service ← 服务文件
你执行的每一步都符合 FHS,属于 非常专业的部署方式。
如果你愿意,我可以进一步为你:
✅ 生成 Markdown 版用于放入知识库
✅ 生成可复制的一键部署脚本(含权限、目录、服务文件)
✅ 生成迁移自动化脚本
需要哪一类?
