关闭

配置Nginx 反向代理

2025-09-12
-
-

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/private
sudo nano trilium.key

粘贴 → 保存退出:

右键粘贴→Ctrl + O → Enter → Ctrl + X

⑤ 权限改安全:

sudo chown root:root trilium.key
sudo 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那获取最终解决问题的优化。

用Xftp 8可以很方便的替换文件

相较于原版的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
回车yes同意

✅ 放行 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

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

嗯…自己是谁,应当由自己去探寻……
给自己多充充电,多学点东西,总会有用得到的地方。