前言
由于目前跨省跨运营商限速严重,导致我即使宽带有公网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,更新软件包列表并升级所有已安装的软件,确保系统处于最新状态。
shell# 更新软件包列表
apt update
# 升级已安装的软件包
apt upgrade -y
# 安装一些必备工具
# curl: 用于下载文件
# sudo: 用于权限管理
# socat: acme.sh 申请证书时可能需要的依赖
# nginx: 我们将用它作为反向代理服务器
apt install curl sudo socat nginx -y
第二步:安装 Docker
我们使用官方提供的一键安装脚本来安装 Docker。
shell# 下载 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 的帮助下部署更多有趣的应用。祝你玩得开心!