Nginx 反代 80/443
🔑 先记住 3 个路径
| 路径 | 作用 | 本教程用到的文件名 |
|---|---|---|
| /etc/nginx/sites-available/ | 存放“草稿”配置文件 | trilium |
| /etc/nginx/sites-enabled/ | 存放“正式启用”的配置 | 软链接指向上面草稿 |
| /etc/ssl/ | 存放证书 |
解释:软链接 = 快捷方式,不改文件就能启用。

准备工作:生成 / 下载 Cloudflare Origin CA 证书
登录 Cloudflare → SSL/TLS → 源服务器 → 创建证书

私钥类型:RSA(兼容最好)
主机名填写你自己绑定的域名,例如我的设置是这个:trilium.dpdns.org 和*.trilium.dpdns.org,有效期选择15年。

点击创建,会生成你的源证书和私钥。
🔑 一定要保存好!一定要保存好!一定要保存好!
⚠️ 私钥下面的页面关闭后就再也不能查看了。

上面的页面关闭后,只有证书还能再次下载查看,如下图。如果私钥没保存,请删除重建。

把证书“放”到服务器
运行安装的Xshell 8,连接VPS。

① 进入证书目录
cd /etc/ssl/certs② 新建证书文件(空文件)
sudo nano trilium.pem③ 把 Cloudflare Origin CA 证书 内容一次性粘进去

粘贴 → 保存退出:
右键粘贴→Ctrl + O → Enter → Ctrl + X
④ 同样把私钥也放好
cd /etc/ssl/privatesudo nano trilium.key
粘贴 → 保存退出:
右键粘贴→Ctrl + O → Enter → Ctrl + X
⑤ 权限改安全:
sudo chown root:root trilium.keysudo chmod 600 trilium.key服务器装 Nginx
✅第 1 步:装 Nginx
sudo apt update && sudo apt install nginx -y✅第 2 步:新建站点配置
sudo nano /etc/nginx/sites-available/trilium✅第 3步:粘贴 → 保存退出
右键粘贴→Ctrl + O → Enter → Ctrl + X
🤖注意:要将代码中所有与域名
trilium.dpdns.org相关的内容,替换成你自己的,再粘贴进配置里。
# ========== 80 端口 Server:强制跳 HTTPS ==========
server {
listen 80;
listen [::]:80;
server_name trilium.dpdns.org;
return 301 https://trilium.dpdns.org$request_uri;
}
# ========== HTTPS 主 Server:HTTP + WebSocket 通用 ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name trilium.dpdns.org;
# ---- 证书 ----
ssl_certificate /etc/ssl/certs/trilium.pem;
ssl_certificate_key /etc/ssl/private/trilium.key;
# ---- TLS 强化 ----
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# ---- 上传大小 ----
client_max_body_size 800M;
# ---- 通用 location:同时支持普通 HTTP 与 WebSocket(路径 /) ----
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
# 核心:允许协议升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 常规透传头
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 https;
# WebSocket 长连优化
proxy_buffering off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}🤖 进阶加强版配置:双域名+统一重定向+静态页托管+Twikoo 评论后端等
# ========== 80 端口强制跳 HTTPS ==========
server {
listen 80;
listen [::]:80;
server_name trilium.dpdns.org www.trilium.dpdns.org;
return 301 https://www.trilium.dpdns.org$request_uri;
}
# ========== 443 非 www → www ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name trilium.dpdns.org;
# ---- 证书 ----
ssl_certificate /etc/ssl/certs/trilium.pem;
ssl_certificate_key /etc/ssl/private/trilium.key;
return 301 https://www.trilium.dpdns.org$request_uri;
}
# ========== 443 主站(www) ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.trilium.dpdns.org;
# ---- 证书 ----
ssl_certificate /etc/ssl/certs/trilium.pem;
ssl_certificate_key /etc/ssl/private/trilium.key;
# ---- TLS 强化 ----
ssl_protocols TLSv1.2 TLSv1.3; # 1.2 保底,1.3 加速
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off; # 让客户端选最快、最安全的
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# ---- 上传大小 ----
client_max_body_size 800M;
# ---- gzip ----
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6; # 1. 级别降到 6,CPU/压缩率最划算
gzip_types
text/plain text/css text/xml text/javascript
application/javascript application/xml+rss application/json
image/svg+xml
font/ttf font/otf font/woff font/woff2 # 2. 补全 woff2,删掉旧 x-font-*
application/x-font-ttf; # 3. 只留一个兼容老浏览器的
# ---------- 静态页:无扩展名自动补 .html ----------
location / {
root /var/www/html;
try_files $uri.html $uri @trilium; # ① 先找本地 .html ② 找不到进 @trilium
}
# ---------- 命名位置:真正反向代理到 Trilium ----------
location @trilium {
proxy_pass http://127.0.0.1:8080 ;
proxy_http_version 1.1;
# 核心:允许协议升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 常规透传头
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 https;
# WebSocket 长连优化
proxy_buffering off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# ===== Twikoo 评论后端 =====
location ^~ /twikoo/ {
proxy_pass http://127.0.0.1:8095/ ; # 注意末尾斜杠
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 https;
}
# ===== Twikoo 评论表情包 =====
location = /Twikoo/owo.json {
add_header Access-Control-Allow-Origin '*' always;
add_header Access-Control-Allow-Methods 'GET, OPTIONS';
if ($request_method = OPTIONS) { return 204; }
root /var/www/html;
}
}
# ========== 第2域名 80 端口强制跳 HTTPS ==========
server {
listen 80;
listen [::]:80;
server_name aiphm.cn www.aiphm.cn;
return 301 https://www.aiphm.cn$request_uri;
}
# ========== 443 非 www → www ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name aiphm.cn;
# ---- 证书 ----
ssl_certificate /etc/ssl/certs/aiphm.cn.pem;
ssl_certificate_key /etc/ssl/private/aiphm.cn.key;
return 301 https://www.aiphm.cn$request_uri;
}
# ========== 443 主站(www) ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.aiphm.cn;
# ---- 证书 ----
ssl_certificate /etc/ssl/certs/aiphm.cn.pem;
ssl_certificate_key /etc/ssl/private/aiphm.cn.key;
# ---- TLS 强化 ----
ssl_protocols TLSv1.2 TLSv1.3; # 1.2 保底,1.3 加速
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off; # 让客户端选最快、最安全的
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# ---- 上传大小 ----
client_max_body_size 800M;
# ---- gzip ----
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6; # 1. 级别降到 6,CPU/压缩率最划算
gzip_types
text/plain text/css text/xml text/javascript
application/javascript application/xml+rss application/json
image/svg+xml
font/ttf font/otf font/woff font/woff2 # 2. 补全 woff2,删掉旧 x-font-*
application/x-font-ttf; # 3. 只留一个兼容老浏览器的
# ---------- 静态页:无扩展名自动补 .html ----------
location / {
root /var/www/html;
try_files $uri.html $uri @trilium; # ① 先找本地 .html ② 找不到进 @trilium
}
# ---------- 命名位置:真正反向代理到 Trilium ----------
location @trilium {
proxy_pass http://127.0.0.1:8080 ;
proxy_http_version 1.1;
# 核心:允许协议升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 常规透传头
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 https;
# WebSocket 长连优化
proxy_buffering off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}✅ 第 4 步:让 Nginx 加载这个新配置
# 启用站点(建立软链接)
sudo ln -s /etc/nginx/sites-available/trilium /etc/nginx/sites-enabled/# 检查语法有没有写错
sudo nginx -t正常会显示:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
✅ 第 5 步:替换服务器上/etc/nginx路径下的nginx.conf文件
nginx.conf (若附件失效,可自行去nginx.conf配置文件中加入下面这串代码)
为什么要替换这个nginx.conf文件,因为我遇到了一个bug困扰了好几天才从AI那获取最终解决问题的优化。
![]() | ![]() |
相较于原版的nginx.conf文件只在http {后增加了以下代码:
http {
# ① 升级变量映射(WebSocket 需要)★★★ 放在最顶部 ★★★
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
##
# Basic Settings
##
✅第 6 步:检查服务器上/etc/nginx/sites-enabled路径下的只保留trilium的快捷方式,删除/etc/nginx/sites-enabled路径下nginx可能生成的default文件,防止80端口冲突。

✅第 7 步:重载 Nginx(不停服务)。
sudo systemctl reload nginx✅ 第 8 步:确认 80 端口已监听
sudo netstat -tlnp | grep :80
防火墙 80/443端口放行
✅ 安装保存工具丨出现彩色提示框直接按 ← 左箭头选 YES → 回车(没提示就继续)。
sudo apt install iptables-persistent -y
✅ 放行 80 端口(IPv4 最前)
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT✅ 放行 80 端口(IPv6 最前)
sudo ip6tables -I INPUT 1 -p tcp --dport 80 -j ACCEPT✅ 放行 443 端口(IPv4 最前)
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT✅ 放行 443 端口(IPv6 最前)
sudo ip6tables -I INPUT 1 -p tcp --dport 443 -j ACCEPT✅ 保存规则(重启不失效)
sudo netfilter-persistent save
✅ 【检查是否成功】
sudo iptables -L -n --line-numbers | grep -E 'dpt:80|dpt:443'只要看到类似,就说明 80 和 443 防火墙已打开!
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443

