当前位置: 代码网 > it编程>数据库>Oracle > Nginx中proxy_pass使用小结

Nginx中proxy_pass使用小结

2025年01月11日 Oracle 我要评论
proxy_pass是 nginx 中一个非常重要的指令,用于将请求代理到后端服务器。本文将详细介绍proxy_pass的基本用法、配置示例以及一些高级用法。1. 基本概念1.1proxy_pass概

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/;
    }
}

到此这篇关于nginx中proxy_pass使用小结的文章就介绍到这了,更多相关nginx proxy_pass使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com