反向代理设置

LinuxBeginner
立即练习

简介

在本实验中,你将学习如何将 Nginx 配置为反向代理。

可以把反向代理想象成大型公司的前台。当你拨打总机时,并不会直接与 CEO 或支持团队通话,而是先与前台沟通。前台会询问「我能为你做什么?」,然后将电话转接给合适的人员。

在这个场景中:

  • Nginx 是前台(监听 80 端口)。
  • Python 应用是「支持团队」(监听 8000 端口)。
  • 你是正在拨入的客户端。

你将配置 Nginx,使其在有人请求 /app 时,把请求转发到 Python 服务器,并将响应返回给客户端。

反向代理是现代 Web 架构的核心组件。它位于应用服务器之前,为外部请求提供稳定的入口,还可以处理 TLS 终止、负载均衡、缓存和请求路由。

这意味着 Nginx 不一定要直接提供文件。有时,它的主要工作是接收客户端流量,再将流量转发给后端的其他服务。

启动后端应用

首先,需要准备一个用于接收代理请求的服务。我们将使用 Python 创建一个非常简单的 Web 应用。

我们会为该应用创建一个专用目录,用来提供文件。

在项目目录中创建名为 app 的目录,并在其中创建一个简单的 HTML 文件:

mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html

现在启动 Python 服务器。该命令会让 Python 充当 Web 服务器,从当前目录提供文件,并监听 8000 端口。

在本实验中,这个 Python 进程就是后端应用服务器。它负责提供实际内容,而 Nginx 位于前端,作为面向外部请求的入口。

命令末尾的 & 符号会让服务器在后台运行。这样,服务器在后台运行时,你仍然可以继续使用终端。

cd ~/project
python3 -m http.server 8000 &

验证服务器是否正确启动。检查是否有进程正在监听 8000 端口:

netstat -tuln | grep 8000

你应该会看到包含 0.0.0.0:8000(LISTEN)的输出。这表示「后端应用」已经准备好在 8000 端口接收请求。

配置 Nginx 反向代理

在此步骤中,你将修改 Nginx 配置文件,告诉它如何访问 Python 应用。

使用 sudo 和 nano 文本编辑器编辑默认配置文件:

sudo nano /etc/nginx/sites-enabled/default

在 server { ... } 代码块中向下滚动。你会看到现有的 location / { ... } 代码块。需要在它下方添加新的 location /app 代码块。

将以下代码添加到文件中(注意花括号 { } 和分号 ;):

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }

这段配置的作用是什么?

  • location /app:告诉 Nginx 处理以 /app 开头的请求。
  • proxy_pass ...:相当于电话转接按钮。它告诉 Nginx:「收到针对 /app 的请求时,将请求转发到 localhost(127.0.0.1)的 8000 端口。」

这种转发正是反向代理的核心。客户端与 Nginx 通信,而 Nginx 代表客户端向后端服务器发起请求。

你的文件结构应与下面类似:

server {
    listen 80 default_server;
    ...
    location / {
        try_files $uri $uri/ =404;
    }

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }
}

按 Ctrl+O,然后按 Enter 保存文件;再按 Ctrl+X 退出 nano。

验证并重新加载

我们已经更新了配置文件,但 Nginx 仍在使用旧规则。现在需要重新加载服务。

首先,重新加载之前务必检查配置中是否有拼写错误。如果重新加载损坏的配置,Web 服务器可能会完全停止工作。

运行测试命令:

sudo nginx -t

你应该会看到:

syntax is ok
test is successful

如果测试通过,重新加载 Nginx 以应用更改:

sudo service nginx reload

Nginx 现在已经更新配置,并准备好转发请求。

此时,Nginx 的作用已经不只是从磁盘读取文件的文件服务器,还充当 URL 与后端服务之间的路由器。

测试代理

在最后一个步骤中,我们将验证「前台」是否正确完成了工作。

我们会向 Nginx(80 端口)发送 Web 请求,请求 /app/。Nginx 应立即将该请求转发到 Python 服务器(8000 端口)。

运行以下命令:

curl http://localhost/app/

你应该会看到后端服务器返回的消息:

Hello from the Python Backend.

刚才发生了什么?

  1. 你向 Nginx(localhost:80)请求了 /app/。
  2. Nginx检查配置规则,匹配到 /app,并按照 proxy_pass 指令执行转发。
  3. Nginx向 8000 端口上的 Python 服务器发起请求。
  4. Python 服务器将「Hello...」页面返回给 Nginx。
  5. Nginx再将「Hello...」页面返回给你。

请记住这条请求链,因为它在现代基础设施中随处可见:

浏览器 -> 反向代理 -> 应用服务器 -> 反向代理 -> 浏览器。

你已经成功构建了一个反向代理!

总结

在本实验中,你已成功将 Nginx 配置为反向代理,并学习了如何:

  1. 使用 Python 托管简单的后端应用。
  2. 为 Nginx 配置用于路由的 location 代码块。
  3. 使用 proxy_pass 指令转发流量。
  4. 使用 curl 验证代理链。

这种架构是现代 Web 应用的基础。你可以使用 Nginx 处理安全和负载均衡,同时让其他应用在后台处理业务逻辑。