Nginx 的 proxy_pass 使用简介

文章目录
    • [1. 基本概念](#1. 基本概念)
      • [1.1 `proxy_pass` 概述](#1.1 proxy_pass 概述)
      • [1.2 语法](#1.2 语法)
      • [1.3 使用场景](#1.3 使用场景)
    • [2. 基本用法](#2. 基本用法)
      • [2.1 HTTP 代理](#2.1 HTTP 代理)
        • [2.1.1 基本示例](#2.1.1 基本示例)
        • [2.1.2 绝对根路径 vs 相对路径](#2.1.2 绝对根路径 vs 相对路径)
      • [2.2 Stream 代理](#2.2 Stream 代理)
    • [3. 高级用法](#3. 高级用法)
      • [3.1 正则匹配](#3.1 正则匹配)
      • [3.2 变量使用](#3.2 变量使用)
      • [3.3 重定向](#3.3 重定向)
      • [3.4 精确匹配](#3.4 精确匹配)
      • [3.5 `if` 语句](#3.5 if 语句)
      • [3.6 `limit_except`](#3.6 limit_except)
    • [4. 实际案例](#4. 实际案例)
      • [4.1 转发到多个后端服务器](#4.1 转发到多个后端服务器)
      • [4.2 转发到不同路径](#4.2 转发到不同路径)
      • [4.3 转发到 Unix Domain Socket](#4.3 转发到 Unix Domain Socket)

proxy_pass 是 Nginx 中一个非常重要的指令,用于将请求代理到后端服务器。本文将详细介绍 proxy_pass 的基本用法、配置示例以及一些高级用法。

1. 基本概念

1.1 proxy_pass 概述

proxy_pass 指令用于将请求转发到后端服务器。它可以用于 HTTP 和 Stream 模块,分别处理 HTTP 请求和 TCP/UDP 流量。

1.2 语法
复制代码
proxy_pass URL;
  • URL:后端服务器的地址,可以是 HTTP/HTTPS 地址或 TCP/UDP 地址。
1.3 使用场景
  • HTTP 代理:将 HTTP 请求转发到后端服务器。
  • Stream 代理:将 TCP/UDP 流量转发到后端服务器。

2. 基本用法

2.1 HTTP 代理
2.1.1 基本示例
复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
    }
}

在这个示例中,所有访问 example.com 的请求都会被转发到 backend_server

2.1.2 绝对根路径 vs 相对路径
  • 绝对根路径 :在 proxy_pass 后面的 URL 以斜杠 / 结束,表示绝对根路径。

    复制代码
    location /proxy/ {
        proxy_pass http://127.0.0.1/;
    }

    例如,访问 http://example.com/proxy/test.html 会被转发到 http://127.0.0.1/test.html

  • 相对路径 :在 proxy_pass 后面的 URL 不以斜杠 / 结束,表示相对路径。

    复制代码
    location /proxy/ {
        proxy_pass http://127.0.0.1;
    }

    例如,访问 http://example.com/proxy/test.html 会被转发到 http://127.0.0.1/proxy/test.html

2.2 Stream 代理
复制代码
stream {
    upstream backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 12345;
        proxy_pass backend;
    }
}

在这个示例中,所有连接到 12345 端口的 TCP 流量都会被转发到 127.0.0.1:8080

3. 高级用法

3.1 正则匹配

location 使用正则表达式时,proxy_pass 不能包含 URI 部分。

复制代码
location ~ /testc {
    proxy_pass http://127.0.0.1:8801;
}

如果包含 URI 部分,会导致配置文件解析错误:

复制代码
location ~ /testd {
    proxy_pass http://127.0.0.1:8801/;  # 错误
}
3.2 变量使用

可以使用变量来动态生成转发地址。

复制代码
location /novel/ {
    proxy_pass http://book-server/books$request_uri;
}

例如,访问 http://example.com/novel/three-body.html?page=3 会被转发到 http://book-server/books/novel/three-body.html?page=3

3.3 重定向

Nginx 会在某些情况下自动进行 301 重定向,例如当请求的 URI 没有以斜杠 / 结束,但 Nginx 认为这是一个目录时。

复制代码
location /films/nature/ {
    proxy_pass http://film-server;
}

如果访问 http://example.com/films/nature,Nginx 会返回 301 重定向到 http://example.com/films/nature/

3.4 精确匹配

可以使用精确匹配来避免 301 重定向。

复制代码
location /films/nature/ {
    proxy_pass http://film-server;
}

location = /films/nature {
    proxy_pass http://film-server;
}
3.5 if 语句

location 中使用 if 语句时,proxy_pass 不能包含 URI 部分。

复制代码
location /google {
    if ($geoip_country_code ~ (RU|CN)) {
        proxy_pass http://www.google.hk;
    }
}
3.6 limit_except

limit_except 中使用 proxy_pass 时,不能包含 URI 部分。

复制代码
location /yongfu/ {
    proxy_pass http://unix:/tmp/backend.socket:/uri/;

    limit_except PUT DELETE {
        proxy_pass http://127.0.0.1:9080;
    }
}

4. 实际案例

4.1 转发到多个后端服务器
复制代码
upstream backend_servers {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
    }
}
4.2 转发到不同路径
复制代码
server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://api_server/;
    }

    location /static/ {
        proxy_pass http://static_server/;
    }
}
4.3 转发到 Unix Domain Socket
复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://unix:/tmp/backend.socket:/uri/;
    }
}
相关推荐
随便做点啥17 分钟前
32卡64G-910B4-16后端集群部署报告
java·大数据·运维
我的小卷呀37 分钟前
Linux ip 命令底层逻辑与实战指南
linux·运维·c语言·网络协议·tcp/ip·网络安全
CingSyuan1 小时前
4U GPU服务器整机无法上电故障排查实录:通过交叉替换、逐项回装与跨槽位测试,定位RTX 4080显卡故障及硬盘槽位异常并完成临时恢复
运维·服务器
handler011 小时前
【Linux】ELF、链接与动态库,程序装载全解析
linux·运维·服务器·chrome·c·elf·文件
考虑考虑1 小时前
elasticSearch中的element_type
运维·后端·elasticsearch
Huangjin007_1 小时前
【Linux 系统篇(十九)】进程(七):深入理解虚拟地址空间:从进程地址空间到内核管理
linux·运维·服务器
智塑未来2 小时前
短剧出海平台选择:技术视角下的翻译配音工具选型与自动化流程实战
运维·自动化·xcode
A-刘晨阳3 小时前
K8s集群中的数据库新范式:KES-Operator解锁部署、扩缩容、备份全链路自动化
运维·数据库·云原生·kubernetes·自动化
JoyCong19983 小时前
知识科普:ToDesk鸿蒙版高级功能免费开放使用了!
运维·服务器·华为·智能手机·harmonyos·远程工作
cjp5604 小时前
011. UG二次开发,UG管道通讯服务器与wpf客户端通讯
linux·运维·服务器