前言
由于目前跨省跨运营商限速严重,导致我即使宽带有公网ip,在跨运营商的情况下网络质量惨不忍睹。
因此,我入坑了优化线路的VPS,利用其CN2GIA+CMIN2的三网优化,通过Nginx反向代理Plex作为我的plex中转服务器,有效改善了跨网环境下的plex播放体验。
同时,使用nginx作为Movie Pilot的企业微信通知代理。
顺便再使用sing-box自建了节点。
将此过程记录为下文内容。
我们将在这篇指南中完成以下核心任务:
- 系统初始化:更新系统并安装必备工具。
- 获取泛域名证书:使用
acme.sh和 Cloudflare API 自动申请并续签免费的 Let's Encrypt 泛域名 SSL 证书。 - 部署核心服务:安装并配置强大的
sing-box,同时启用 VLESS-Reality 和 Hysteria2 两种协议。 - 配置 Web 反向代理:利用 Nginx 为其他服务(如 Plex、企业微信 API)提供安全的 HTTPS 访问。
准备工作:
在开始之前,请确保你拥有:
- 一台全新的 VPS(推荐使用 Debian 12 系统)。
- 一个属于你自己的域名,并已将其 DNS 解析托管到 Cloudflare。
- Cloudflare 账户的邮箱和 Global API Key 或专用的 API Token。
让我们开始吧!
第一步:基础环境准备
首先,登录你的 VPS,更新软件包列表并升级所有已安装的软件,确保系统处于最新状态。
# 更新软件包列表
apt update
# 升级已安装的软件包
apt upgrade -y
# 安装一些必备工具
# curl: 用于下载文件
# sudo: 用于权限管理
# socat: acme.sh 申请证书时可能需要的依赖
# nginx: 我们将用它作为反向代理服务器
apt install curl sudo socat nginx -y第二步:安装 Docker
我们使用官方提供的一键安装脚本来安装 Docker。
# 下载 Docker 安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
# 执行脚本进行安装
sh get-docker.sh安装完成后,Docker 服务会自动启动。
第三步:配置泛域名 SSL 证书 (acme.sh)
为了后续服务的安全,我们需要配置 HTTPS。使用 acme.sh 可以自动化申请和续签 Let's Encrypt 提供的免费 SSL 证书。我们将申请一张泛域名证书(*.example.com),这样你所有的子域名都可以使用它,一劳永逸。
-
安装 acme.sh 将
my@example.com替换成你自己的邮箱,用于接收证书到期提醒。shellcurl https://get.acme.sh | sh -s email=my@example.com -
重载 Shell 环境并配置自动更新 安装脚本会自动将
acme.sh的路径添加到环境变量中,我们需要重新加载~/.bashrc使其生效。shell# 使 acme.sh 命令立即生效 source ~/.bashrc # 开启 acme.sh 的自动更新功能 acme.sh --upgrade --auto-upgrade -
设置默认 CA 为了更好的兼容性,我们将默认的证书颁发机构(CA)切换为 Let's Encrypt。
shellacme.sh --set-default-ca --server letsencrypt -
配置 Cloudflare API 并申请证书
acme.sh需要通过 Cloudflare 的 API 来自动添加 DNS 记录,以验证你对域名的所有权(DNS-01 质询)。如何获取 Cloudflare API Token? 登录 Cloudflare -> 我的个人资料 -> API 令牌 -> 创建令牌 -> 使用“编辑区域 DNS”模板 -> 在“区域资源”中选择你的域名 -> 创建令牌。创建后请立即复制保存好。
在终端中执行以下命令,将
你的CloudFlare Token和你的邮箱替换为真实信息。shellexport CF_Token="你的CloudFlare_Token" export CF_Email="你的Cloudflare账户邮箱"现在,开始申请证书。请将
example.com替换为你的主域名。--keylength ec-384表示我们使用 ECC 384 位密钥,安全性更高。shellacme.sh --issue -d "example.com" -d "*.example.com" --dns dns_cf --keylength ec-384如果一切顺利,你将看到证书成功生成的提示。证书文件默认存放在
~/.acme.sh/目录下。
第四步:配置 Nginx 反向代理
Nginx 是一个高性能的 Web 服务器和反向代理。我们将用它来代理两个服务:Plex 媒体服务器和一个企业微信通知 API。
-
为 Nginx 安装证书 首先,为 Nginx 使用的域名安装证书。同样地,
acme.sh会在证书续签后自动重载 Nginx。shell# 创建 Nginx 的 SSL 证书目录 mkdir -p /etc/nginx/ssl # 安装证书 acme.sh --install-cert -d example.com --ecc \ --key-file /etc/nginx/ssl/example.com.key \ --fullchain-file /etc/nginx/ssl/example.com.fullchain.pem \ --reloadcmd "systemctl reload nginx"注意:这里我们为
example.com这个主域安装了证书。由于申请的是泛域名证书,它对所有子域名(如plex.example.com)都有效。 -
配置 Plex 反向代理 创建一个新的 Nginx 配置文件。
shellvim /etc/nginx/sites-available/plex.conf将以下内容粘贴进去,并替换
plex.example.com和https://yourplex.com为你自己的 Plex 域名和实际的 Plex 服务器地址。nginx# HTTP (80) 请求自动跳转到 HTTPS (8443) server { listen 80; server_name plex.example.com; return 301 https://$host:8443$request_uri; } # Plex HTTPS 服务主配置 server { listen 8443 ssl http2; server_name plex.example.com; client_max_body_size 100M; // 允许上传的最大文件大小,如字幕 # --- SSL 证书配置 --- ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; # --- SSL 优化与安全配置 --- ssl_protocols TLSv1.2 TLSv1.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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # --- Plex 特定的反向代理配置 --- location / { # 代理到你的 Plex 服务器地址 proxy_pass https://yourplex.com; # --- 重要的代理头部信息 --- 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_set_header X-Plex-Client-Identifier $http_x_plex_client_identifier; proxy_set_header Cookie $http_cookie; # --- WebSocket 支持 --- proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; # --- 针对流媒体的优化 --- proxy_buffering off; # 关闭代理缓冲,对流媒体至关重要 proxy_read_timeout 36000s; # 防止长时间观看导致连接中断 proxy_redirect off; } } -
配置企业微信 API 代理
shellvim /etc/nginx/sites-available/qyapi.conf粘贴以下配置,并将
qyapi.example.com替换为你的域名。nginx# HTTPS 服务器块:处理 SSL 和反向代理 server { listen 8443 ssl http2; # 与 Plex 共用 8443 端口 server_name qyapi.example.com; # 替换为你的域名 # --- SSL 证书配置 --- ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; # --- SSL 性能和安全优化 --- ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; # --- 反向代理配置 --- # 只代理特定的 API 路径 location ~ ^/cgi-bin/(gettoken|message/send|menu/create)$ { proxy_pass https://qyapi.weixin.qq.com; # --- 代理头部设置 --- proxy_set_header Host qyapi.weixin.qq.com; 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_buffers 4 256k; proxy_buffer_size 128k; proxy_busy_buffers_size 256k; } # --- 其他所有路径返回 404 --- location / { return 404; } } -
应用 Nginx 配置 将写好的配置文件链接到
sites-enabled目录,使其生效。shellln -s /etc/nginx/sites-available/plex.conf /etc/nginx/sites-enabled/ ln -s /etc/nginx/sites-available/qyapi.conf /etc/nginx/sites-enabled/最后,检查配置语法是否正确,然后重启 Nginx。
shell# 测试 Nginx 配置 nginx -t # 如果显示 "syntax is ok" 和 "test is successful",则可以重启 # 重启 Nginx 服务 systemctl restart nginx
第五步:安装与配置 sing-box
sing-box 是一个功能强大且高度可配置的代理平台。我们将配置 VLESS-Reality 和 Hysteria2 两种协议。
-
安装 sing-box 使用官方一键脚本进行安装。
shellcurl -fsSL https://sing-box.app/install.sh | sh安装后,将其设置为开机自启。
shellsystemctl enable sing-box -
为 Hysteria2 安装证书 Hysteria2 协议需要使用真实的 SSL 证书。我们使用
acme.sh将刚刚申请的证书安装到sing-box的配置目录。注意: 将下面的
sub.example.com替换为你计划用于 Hysteria2 的子域名。shell# 创建证书存放目录 mkdir -p /etc/sing-box/certs # 使用 acme.sh 安装证书 acme.sh --install-cert -d sub.example.com \ --key-file /etc/sing-box/certs/private.key \ --fullchain-file /etc/sing-box/certs/certificate.crt \ --reloadcmd "systemctl restart sing-box"--reloadcmd参数能确保每次证书自动续签后,sing-box服务都会自动重启以加载新证书。 -
配置 sing-box 编辑
sing-box的配置文件:shellvim /etc/sing-box/config.json在编辑前,我们需要生成一些必要的密钥:
shell# 生成 Reality 公私钥对 sing-box generate reality-keypair # 输出示例: # Private key: OGF8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx # Public key: df4dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx # 生成一个随机的 short_id (可选,但推荐) sing-box generate rand 8 --hex # 输出示例: # a1b2c3d4e5f6a7b8 # 生成一个随机密码用于 Hysteria2 sing-box generate rand 16 # 输出示例: # YourStrongPassword123现在,将以下 JSON 内容粘贴到
config.json文件中,并根据注释和刚刚生成的密钥替换相应字段:json{ "log": { "level": "info", "timestamp": true }, "dns": { "servers": [ { "address": "tls://8.8.8.8", "detour": "direct" } ] }, "inbounds": [ { "type": "vless", "listen": "::", "listen_port": 443, "users": [ { "uuid": "换成你自己的UUID", // 可使用 `sing-box generate uuid` 生成 "flow": "xtls-rprx-vision" } ], "tls": { "enabled": true, "server_name": "sub.example.com", // 替换为你的子域名,不能是通配符 "reality": { "enabled": true, "handshake": { "server": "www.microsoft.com", // 伪装的目标网站,要求支持TLS 1.3, X25519, H2 "server_port": 443 }, "private_key": "粘贴你生成的Reality私钥", // 刚刚生成的 Private key "short_id": [ "粘贴你生成的short_id" // 刚刚生成的 16 位 hex 字符串 ] } } }, { "type": "hysteria2", "listen": "::", "listen_port": 8444, // 自定义一个未被占用的端口 "users": [ { "password": "设置一个强大的密码" // 粘贴你刚刚生成的 Hysteria2 密码 } ], "masquerade": "https://bing.com", // 可选,用于伪装 "tls": { "enabled": true, "alpn": ["h3"], "certificate_path": "/etc/sing-box/certs/certificate.crt", "key_path": "/etc/sing-box/certs/private.key" } } ], "outbounds": [ { "type": "direct", "tag": "direct" }, { "type": "dns", "tag": "dns-out" } ], "route": { "rules": [ { "protocol": "dns", "outbound": "dns-out" } ] } } -
启动 sing-box 保存配置文件后,启动并检查
sing-box的状态。shellsystemctl restart sing-box systemctl status sing-box如果状态显示
active (running),则表示服务已成功启动。 -
追踪 sing-box 日志
textjournalctl -u sing-box -o cat -f
总结
恭喜你!你已经成功地将一台全新的 VPS 打造成了一个功能强大的多用途服务器。
我们完成了:
- 系统的基础更新与软件安装。
- 通过
acme.sh实现了泛域名证书的自动化管理。 - 部署了
sing-box并提供了 VLESS-Reality 和 Hysteria2 两种高性能服务。 - 利用 Nginx 成功反向代理了 Plex 和企业微信 API,并为它们提供了安全的 HTTPS 访问。
现在,你的服务器已经准备就绪。你可以开始享受安全的网络访问,或者继续探索,在 Docker 的帮助下部署更多有趣的应用。祝你玩得开心!