Nginx 的 proxy_pass 使用简介

embedded/2025/2/8 11:45:09/
文章目录
    • 1. 基本概念
      • 1.1 `proxy_pass` 概述
      • 1.2 语法
      • 1.3 使用场景
    • 2. 基本用法
      • 2.1 HTTP 代理
        • 2.1.1 基本示例
        • 2.1.2 绝对根路径 vs 相对路径
      • 2.2 Stream 代理
    • 3. 高级用法
      • 3.1 正则匹配
      • 3.2 变量使用
      • 3.3 重定向
      • 3.4 精确匹配
      • 3.5 `if` 语句
      • 3.6 `limit_except`
    • 4. 实际案例
      • 4.1 转发到多个后端服务器
      • 4.2 转发到不同路径
      • 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/;}
}

http://www.ppmy.cn/embedded/160526.html

相关文章

介绍10个比较优秀好用的Qt相关的开源库

记录下比较好用的一些开源库 1. Qt中的日志库“log4qt” log4qt 是一个基于 Apache Log4j 设计理念的 Qt 日志记录库,它为 Qt 应用程序提供了强大而灵活的日志记录功能。Log4j 是 Java 领域广泛使用的日志框架,log4qt 借鉴了其优秀的设计思想&#xff…

基于Typescript,使用Vite构建融合Vue.js的Babylon.js开发环境

一、创建Vite项目 使用Vite初始化一个VueTypeScript项目: npm create vitelatest my-babylon-app -- --template vue-ts cd my-babylon-app npm create vitelatest my-babylon-app -- --template vue-ts 命令用于快速创建一个基于 Vite 的 Vue TypeScript 项目。…

前端控制器模式

前端控制器模式 引言 前端控制器模式(Front Controller Pattern)是一种设计模式,旨在简化应用程序的请求处理过程。它将应用程序的所有请求统一由一个控制器处理,从而减少请求分发和响应的复杂性。本文将详细介绍前端控制器模式…

项目顺利交付,几个关键阶段

年前离放假还有10天的时候,来了一个应急项目, 需要在放假前一天完成一个演示版本的项目,过年期间给甲方领导看。 本想的最后几天摸摸鱼,这么一来,非但摸鱼不了,还得加班。 还在虽然累,但也是…

python编程-内置函数bin(),bool(),abs() ,all(),any(),ascii(),max(),min() 详解

1、bin()函数用于将整数转换为其二进制字符串表示。并返回一个以0b开头的字符串,表示该整数的二进制形式。 # 十进制数转换为二进制字符串 decimal_number 42 binary_string bin(decimal_number) print(f"Decimal {decimal_number} is {binary_string} in b…

开箱即用的.NET MAUI组件库 V-Control 发布了!

之前写过挺多的MAUI Sample,其中有很多代码可以打包成组件,当组件完善到一定程度,我会把控件封装起来放到控件库中。 今天,在这个仓库建立一年零八个月后,我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET …

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…

修改SSH登录密码,只需要登录SSH,之后输入命令即可,这里登录使用的软件为 MobaXterm1

在登入终端之后输入命令 passwd {用户名} 即可进行修改。需要注意的是,输入的密码不会有星号代替,也不会出现明文。 如果想要修改SSH的登录端口,比如修改为1433,则只需要执行以下命令即可: /usr/sbin/sshd -p 1433…