服务器与部署 / 技术笔记

Nginx 与反向代理

从用户的一次访问开始,理解 Nginx 怎样接收请求、匹配规则并转发到后端服务。

内容章节
6 节
阅读重点
匹配与转发
示例语言
Nginx

用户访问网站时,通常不会直接连接 Node.js 或 Spring Boot 的内部端口。Nginx 会站在入口,接收公开请求,再把它交给真正处理业务的服务。

文本示意

text

浏览器 :443Nginx应用 :3000

反向代理隐藏了后端服务的位置,并为它们提供统一入口。

1. 反向代理到底反向在哪里

普通代理代表客户端去访问外部网站,反向代理代表服务器接收客户端请求。用户只知道域名,不需要知道内部运行了几个服务。

文本示意

text

/          前端应用/api/      后端接口/uploads/  文件服务

Nginx 可以根据路径把请求送到不同目标,也可以统一处理 HTTPS、压缩和访问日志。

2. server 和 location 怎样匹配

server 先根据端口和域名选择站点,location 再根据路径选择处理规则。

终端命令

bash

server {    listen 80;    server_name example.com;
    location /api/ {        proxy_pass http://127.0.0.1:8080/;    }}

proxy_pass 末尾有没有斜杠会影响转发后的路径。修改前先写出原始 URL 和目标 URL,避免靠猜测调整。

3. 请求头为什么要转发

后端直接看到的连接来自 Nginx。如果不转发信息,应用可能不知道用户原始 IP、域名和协议。

终端命令

bash

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;

应用只有在信任当前代理时才应该读取这些头,否则客户端可以自己伪造它们。

4. 静态文件和接口怎样分流

静态文件可以由 Nginx 直接读取,动态接口继续转发给应用。

终端命令

bash

location /assets/ {    root /srv/site/public;    expires 7d;}
location /api/ {    proxy_pass http://127.0.0.1:8080/;}

这样应用不用处理图片和样式文件,接口也能保持独立的超时与日志策略。

5. 超时与上传限制怎样设置

默认配置不一定适合文件上传或长时间任务。

终端命令

bash

client_max_body_size 20m;proxy_connect_timeout 5s;proxy_read_timeout 60s;

数值不应盲目增大。合理限制可以尽早拒绝异常请求,也能避免连接长时间占用服务器资源。

6. 一次请求穿过 Nginx 的完整过程

一次接口访问会经过下面的步骤:

文本示意

text

域名解析到服务器Nginx 接收 HTTPS 请求根据 server_name 选择站点根据 location 匹配 /api/补充代理请求头转发到内部应用端口把应用响应返回浏览器

排错时按照同样顺序检查域名、端口、匹配规则、上游服务和响应日志,通常比直接重写配置更快。