Skip to content

部署 Nginx 反向代理并配置 SSL 加密

本教程将手把手带您在 Ubuntu 服务器上完成从安装 Nginx 到配置反向代理,再到使用 Let's Encrypt 免费配置 SSL 证书的全过程。

第一步:安装 Nginx

如果您的 Ubuntu 服务器上尚未安装 Nginx,我们可以通过 apt 包管理器轻松完成安装。打开您的终端,执行以下命令:

bash
# 更新软件包列表
sudo apt update

# 安装 Nginx
sudo apt install nginx -y

安装过程会自动启动 Nginx 服务。

第二步:验证 Nginx 安装与运行状态

安装完成后,我们需要确认 Nginx 是否已成功安装并正常运行。

首先,检查 Nginx 的版本信息:

bash
nginx -v

您应该会看到类似如下的输出,表明 Nginx 已成功安装:

nginx version: nginx/1.18.0 (Ubuntu)

注意:版本号可能会因您使用的 Ubuntu 发行版和更新时间而异。

接着,使用 systemctl 命令检查 Nginx 服务的运行状态:

bash
systemctl status nginx

如果 Nginx 服务正在运行,您会看到状态显示为 active (running),并附有详细的进程信息,如下所示:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-11-20 22:31:30 CST; 1min 28s ago
       Docs: man:nginx(8)
    Process: 15970 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 15971 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 16161 (nginx)
      Tasks: 3 (limit: 4678)
     Memory: 4.8M
        CPU: 38ms
     CGroup: /system.slice/nginx.service
             ├─16161 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─16163 nginx: worker process
             └─16164 nginx: worker process

确认 Nginx 正常运行后,我们就可以开始配置反向代理了。

第三步:配置 Nginx 反向代理

Nginx 的配置遵循一种模块化的结构。主配置文件位于 /etc/nginx/nginx.conf,而各个站点的独立配置(我们称之为“服务器块”)则推荐存放在 /etc/nginx/sites-available/ 目录下。

  1. 创建新的配置文件

我们为反向代理创建一个新的配置文件。首先,进入配置目录:

bash
cd /etc/nginx/sites-available/

然后,使用您喜欢的文本编辑器(如 nanovim)创建一个新文件,例如 reverse-proxy.conf

bash
sudo nano reverse-proxy.conf
  1. 添加反向代理配置

在打开的文件中,粘贴以下配置内容。这是一个将所有发往 yourdomain.com 的 HTTP 请求(80 端口)代理到本地 3000 端口上运行的后端服务的示例。

nginx
server {
# 监听 80 端口,处理 HTTP 请求
listen 80;

# 替换为您的域名
server_name yourdomain.com;

# 定义根路径 (/) 的请求处理方式
location / {
# 将请求转发至后端服务地址
# 假设您的后端应用运行在 http://localhost:3000
proxy_pass http://localhost: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;
}
}

配置指令详解:

  • listen 80;: 监听服务器的 80 端口。
  • server_name yourdomain.com;: 匹配请求的域名。请务必将其替换为您自己的域名。
  • proxy_pass http://localhost:3000;: 核心指令,指定了请求被转发的目标地址。
  • proxy_set_header ...: 这些指令用于修改转发到后端的 HTTP 请求头。这非常重要,因为它能让后端应用获取到原始客户端的 IP 地址、主机名和协议等信息,对于日志记录和应用逻辑至关重要。

第四步:启用配置并应用更改

创建好配置文件后,我们需要启用它。Nginx 通过在 /etc/nginx/sites-enabled/ 目录中创建配置文件的符号链接(Symbolic Link)来加载配置。

  1. 创建符号链接
bash
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
  1. 测试 Nginx 配置

在重启服务之前,务必检查配置文件是否存在语法错误,这是一个非常好的习惯:

bash
sudo nginx -t

如果配置正确,您将看到如下成功信息:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  1. 重启 Nginx 服务

测试通过后,平滑地重启 Nginx 以应用所有更改:

bash
sudo systemctl restart nginx

现在,打开您的 Web 浏览器并访问 http://yourdomain.com。如果一切配置正确,您应该能看到由您在本地 3000 端口运行的后端应用所渲染的内容。

第五步:使用 Certbot 配置 SSL 加密

为了保障数据传输的安全,为您的网站启用 HTTPS 是必不可少的。我们将使用 Let's Encrypt 提供的免费 SSL 证书,并通过 Certbot 工具来自动化申请和配置过程。

  1. 安装 Certbot

Certbot 及其 Nginx 插件可以通过 apt 进行安装:

bash
sudo apt install certbot python3-certbot-nginx -y
  1. 获取并安装 SSL 证书

运行 Certbot,它会自动检测您 Nginx 配置中的 server_name,并为之申请证书。请将 yourdomain.com 替换为您的真实域名。

bash
sudo certbot --nginx -d yourdomain.com

在执行过程中,Certbot 会引导您完成以下步骤:

  • 输入您的电子邮件地址(用于接收续订提醒和安全通知)。
  • 同意 Let's Encrypt 的服务条款。
  • 选择是否将所有 HTTP 流量自动重定向到 HTTPS(推荐选择此项)。

完成后,Certbot 会自动修改您的 Nginx 配置文件(/etc/nginx/sites-available/reverse-proxy.conf),添加 SSL 相关的设置,并重新加载 Nginx 服务使之生效。

使用 --expand 标志,并列出所有域名:

sudo certbot --nginx --expand -d x.588235.xyz -d heiyu.app

Certbot 会自动更新证书,包含这两个域名,并调整 Nginx 配置。

  1. 验证 SSL 配置

最后,再次访问您的网站,但这次使用 https:// 协议:https://yourdomain.com。您的浏览器地址栏应该会显示一个安全锁标志,表明您的网站已成功启用 SSL 加密。

总结

恭喜您!您已经成功地在 Ubuntu 服务器上部署了 Nginx 作为反向代理,并使用 Let's Encrypt 的免费证书为其配置了 HTTPS 加密。这套架构不仅提升了您应用的安全性,也为未来进行服务扩展和负载均衡打下了坚实的基础。