从裸机到HTTPS:Nginx反向代理配置与免费SSL证书签发,手把手教你搞定

当你的网站逐渐有了流量,或者你想用一台服务器托管多个应用时,Nginx 反向代理就成了绕不开的利器。它就像一个智能交通调度员,将不同域名的请求精准地转发到不同的后端服务(比如 Node.js、Python、Java 应用)。而 HTTPS,则是给这条交通要道加上了加密隧道,保护用户数据不被窃听。今天,我们就从零开始,把这两件事彻底讲透。

很多人觉得配置 Nginx 和 SSL 很复杂,尤其是一想到要生成证书、配置各种参数就头大。其实,只要掌握了核心逻辑,整个流程比你想象的要简单得多。我们不仅会教你如何配置反向代理,还会教你如何利用 Let’s Encrypt 签发完全免费的 SSL 证书,让你的网站在几分钟内从“裸奔”升级为“全副武装”。

为什么你需要 Nginx 反向代理?

想象一下,你的服务器上运行着三个不同的 Web 服务:一个 WordPress 博客、一个 Node.js 的 API 接口、还有一个 Python 的 Flask 应用。它们分别监听在不同的端口(比如 8080, 3000, 5000)。如果让用户直接访问 http://你的IP:8080,不仅不美观,还存在严重的安全隐患。Nginx 反向代理的核心作用就是:

  • 端口统一与隐藏: 所有用户都只访问标准的 80(HTTP)和 443(HTTPS)端口,内部端口被完美隐藏。
  • 负载均衡: 可以将流量分发到多个后端服务器,提升网站吞吐能力。
  • 安全防护: 可以在代理层统一做访问控制、限流、WAF 等安全策略。
  • 统一 SSL 管理: 只需要在 Nginx 这一层配置证书,后端服务无需关心复杂的加密逻辑。

如果你对服务器性能特别在意,我们之前实测过腾讯云 4核4G 轻量服务器的表现,性能相当扎实,跑 Nginx 加几个后端应用完全没问题。你可以参考我们的实测文章:腾讯云4核4G轻量服务器性能深度实测:跑分、压测与真实项目部署全记录,看看它能否满足你的需求。

第一步:安装 Nginx 与基础配置

大多数 Linux 发行版的包管理器都内置了 Nginx。以我们常用的 Ubuntu 系统为例:

# 更新包索引
sudo apt update

# 安装 Nginx
sudo apt install nginx -y

# 启动 Nginx 并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 检查 Nginx 状态
sudo systemctl status nginx

安装完成后,访问你的服务器公网 IP,如果看到 Nginx 的默认欢迎页,说明安装成功。

第二步:配置反向代理(核心干货)

Nginx 的配置文件通常位于 /etc/nginx/sites-available/ 目录下。我们以代理一个本地运行在 3000 端口的 Node.js 应用为例,创建一个新的配置文件:

sudo nano /etc/nginx/sites-available/myapp

在文件中写入以下配置(请将 your_domain.com 替换为你的真实域名):

server {
    listen 80;
    server_name your_domain.com www.your_domain.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;
    }
}

关键参数解释:

  • proxy_pass: 指定要转发到的后端地址。这里是 http://127.0.0.1:3000
  • proxy_set_header: 这些头部信息非常关键。Nginx 需要将客户端的真实 IP、协议等信息传递给后端应用,否则后端应用只能看到 Nginx 本地的 IP。

保存文件后,需要创建一个软链接到 sites-enabled 目录,并测试配置是否正确:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t

如果输出 syntax is oktest is successful,说明配置无误。最后重载 Nginx 使配置生效:

sudo systemctl reload nginx

此时,访问 http://your_domain.com 就能看到你的 Node.js 应用了。

第三步:签发免费的 SSL 证书(Let’s Encrypt)

现在你的网站已经通过 Nginx 代理了,但还差最关键的一步——HTTPS。我们强烈推荐使用 Certbot 工具,它可以自动与 Let’s Encrypt 交互,完成证书的申请和自动续期。

安装 Certbot

# 安装 Certbot 和 Nginx 插件
sudo apt install certbot python3-certbot-nginx -y

签发并自动配置证书

这是最神奇的一步。Certbot 的 Nginx 插件可以自动读取你的 Nginx 配置,为你完成证书申请和 HTTPS 配置的全过程。执行以下命令,并将 your_domain.com 替换为你的域名:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

命令执行后,你会看到交互式界面,需要输入你的邮箱(用于接收证书过期提醒),并同意服务条款。Certbot 会验证你对域名的所有权(通过访问你服务器上的特定路径),验证通过后,会自动修改你的 Nginx 配置文件,将 HTTP 请求重定向到 HTTPS。

整个过程通常只需要不到 30 秒。完成后,访问 https://your_domain.com,你会看到浏览器地址栏出现了一把安全的小锁。

第四步:自动续期,一劳永逸

Let’s Encrypt 的证书有效期为 90 天。Certbot 提供了一个 systemd 定时器来自动续期。你可以通过以下命令检查续期定时器是否运行正常:

sudo systemctl status certbot.timer

你也可以手动测试续期流程是否正常:

sudo certbot renew --dry-run

只要这个定时器在运行,你的证书就会在到期前自动续期,你几乎不需要再操心 SSL 证书的问题。

常见问题与避坑指南

在实际操作中,有几个地方容易踩坑,这里特别提一下:

  • 域名解析: 在签发证书之前,请确保你的域名已经正确解析到了服务器的公网 IP。Certbot 需要能够通过 HTTP 访问你的服务器来验证所有权。
  • 防火墙放行: 确保服务器防火墙(如 UFW)放行了 80 和 443 端口。如果你对防火墙配置不熟悉,可以阅读我们之前写的文章:别再裸奔了!Linux服务器安全加固与UFW防火墙配置,这些坑我替你踩过了
  • WebSocket 支持: 如果你的应用使用了 WebSocket(比如实时聊天),需要在 Nginx 配置中额外添加 proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";

进阶:为 WordPress 配置反向代理与缓存

如果你是用 Nginx 反向代理来优化 WordPress 站点,那么结合 Redis 等缓存工具,效果会非常惊人。我们之前专门写过一篇关于 WordPress 性能优化的文章,详细介绍了如何通过 Redis 缓存和静态资源优化让网站速度飞起来,强烈推荐你一并阅读:网站慢如蜗牛?用Redis缓存加静态资源优化,让你的WordPress飞起来

这篇教程涵盖了从 Nginx 安装、反向代理配置到免费 SSL 证书签发的完整流程。希望你能跟着步骤一步步操作,相信你很快就能为自己的网站或应用构建起一个安全、高效的访问入口。如果在配置过程中遇到任何报错,欢迎在评论区留言,我们一起探讨解决。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部