简介
在本实验中,你将学习如何将 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 oktest 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.
刚才发生了什么?
- 你向 Nginx(
localhost:80)请求了/app/。 - Nginx检查配置规则,匹配到
/app,并按照proxy_pass指令执行转发。 - Nginx向 8000 端口上的 Python 服务器发起请求。
- Python 服务器将「Hello...」页面返回给 Nginx。
- Nginx再将「Hello...」页面返回给你。
请记住这条请求链,因为它在现代基础设施中随处可见:
浏览器 -> 反向代理 -> 应用服务器 -> 反向代理 -> 浏览器。
你已经成功构建了一个反向代理!
总结
在本实验中,你已成功将 Nginx 配置为反向代理,并学习了如何:
- 使用 Python 托管简单的后端应用。
- 为 Nginx 配置用于路由的
location代码块。 - 使用
proxy_pass指令转发流量。 - 使用
curl验证代理链。
这种架构是现代 Web 应用的基础。你可以使用 Nginx 处理安全和负载均衡,同时让其他应用在后台处理业务逻辑。



