EQVPS

如何设置带 HTTPS 的 nginx 反向代理

在任何监听本地端口的应用前面放上干净的域名和自动 HTTPS。两种方式:nginx 搭配 Certbot,或用 Caddy 一行实现自动 TLS。分步讲解,附可复制的配置。

大多数自托管应用监听像 127.0.0.1:3000 这样的本地端口,讲的是明文 HTTP。反向代理站在前面的 80/443 端口,用一张真证书终结 HTTPS,并把流量转发到那个本地端口——给你一个干净的 https://app.yourdomain.com,并让你在一个 IP 后面运行多个应用。下面是两种常见方式。

前提

方式 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 并设置自动续期。

诚实的提醒

下一步

反向代理正是让一台机器提供许多服务的关键——见在一个 IP 后面自托管多个服务。把应用跑在容器里?先看如何安装 Docker。要让应用本身在重启和崩溃后依然存活,见如何创建 systemd 服务

常见问题

什么是反向代理,我为什么需要它?

你的应用通常监听像 127.0.0.1:3000 这样的本地端口。反向代理站在前面的 80/443 端口,终结 HTTPS,并把请求转发到那个本地端口。它给你一个干净的域名、一张有效的 TLS 证书,以及在一个 IP 后面运行多个应用的能力——这些都无需应用自己去处理。

nginx 还是 Caddy——该选哪个?

Caddy 最省事:它自动获取并续期 Let's Encrypt 证书,一个能用的 HTTPS 代理只需一行配置。nginx 更广为人知也更灵活,但 TLS 需要你加上 Certbot。只想少折腾地拿到 HTTPS,就用 Caddy;已经熟悉 nginx 或需要它的功能,就用 nginx。

我需要域名吗?

要拿到受信任的 HTTPS 证书,需要——Let's Encrypt 为域名而非裸 IP 签发证书。把一条 A 记录指向你服务器的 IP,等待 DNS 传播,代理就能为该名称获取证书。

需要开放哪些端口?

入站的 80 和 443。端口 80 用于最初的证书验证并重定向到 HTTPS;443 提供加密流量。在防火墙里把两者都打开(见 UFW 指南),并确保没有别的东西已经占用它们。

证书签发为什么会失败?

几乎总是 DNS 或端口。域名的 A 记录必须指向这台服务器并已传播,端口 80/443 必须可达(防火墙里开放、上游未被拦截)。修好这两点,签发就成功;Caddy 和 Certbot 都会重试。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。