大多数自托管应用监听像 127.0.0.1:3000 这样的本地端口,讲的是明文 HTTP。反向代理站在前面的 80/443 端口,用一张真证书终结 HTTPS,并把流量转发到那个本地端口——给你一个干净的 https://app.yourdomain.com,并让你在一个 IP 后面运行多个应用。下面是两种常见方式。
前提
- 一个域名,其 A 记录指向你服务器的 IP(等待 DNS 传播)。
- 端口 80 和 443 开放——见如何配置 UFW 防火墙。
- 你的应用在本地运行,例如在
127.0.0.1:3000。
方式 A — Caddy(自动 HTTPS,一行)
sudo apt install -y caddy
echo 'app.yourdomain.com { reverse_proxy 127.0.0.1:3000 }' | sudo tee /etc/caddy/Caddyfile
sudo systemctl restart caddy
就这样——Caddy 为该域名获取一张 Let's Encrypt 证书并自动续期。
方式 B — nginx + Certbot
sudo apt install -y nginx certbot python3-certbot-nginx
创建 /etc/nginx/sites-available/app:
server {
listen 80;
server_name app.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
启用它并加上 HTTPS:
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app.yourdomain.com
Certbot 会改写配置以提供 HTTPS 并设置自动续期。
诚实的提醒
- DNS 和端口是常见的失败点。 A 记录必须指向这里并已传播,80/443 必须可达,否则证书签发会失败。修好后两个工具都会重试。
- 只暴露你打算暴露的东西。 让应用绑定在
127.0.0.1,这样它只能通过代理访问,而不能直连。 - HTTPS 需要域名,而非裸 IP——Let's Encrypt 为名称签发。
下一步
反向代理正是让一台机器提供许多服务的关键——见在一个 IP 后面自托管多个服务。把应用跑在容器里?先看如何安装 Docker。要让应用本身在重启和崩溃后依然存活,见如何创建 systemd 服务。
评论
暂无评论。来做第一个吧。