Nginx - 常用的控制请求处理和响应生成的指令的高阶用法和最佳实践

news2024/11/20 4:51:40

文章目录

  • 指令列表
    • return
    • break
    • rewrite
    • if
    • proxy_pass
    • try_files
  • 执行顺序
  • 基础用法
  • 高阶使用
  • 最佳实践

在这里插入图片描述


指令列表

return

  • 作用:用于立即结束当前请求的处理并生成响应。
  • 用法return code [text];
    • code 是 HTTP 状态码,如 200、301、404 等。
    • text 是可选的,用于指定响应主体内容。
location /example {
    return 200 "Hello, world!";
}

break

  • 作用:用于结束当前 location 块的处理,然后将控制传递给下一个处理阶段。
  • 用法break;
location /example {
    if ($query_string) {
        break;
    }
    # 如果没有 query string,则继续处理请求
}

rewrite

  • 作用:用于修改请求 URI,并将控制传递给下一个处理阶段。
  • 用法rewrite regex replacement [flag];
    • regex 是正则表达式,用于匹配请求 URI。
    • replacement 是替换字符串,用于替换匹配到的部分。
    • flag 是可选的,用于指定修改行为,如 lastbreakredirect 等。
location /example {
    rewrite ^/old-url$ /new-url permanent;
}

if

  • 作用:根据条件执行不同的指令块。
  • 用法if (condition) { ... }
    • condition 是一个条件表达式,可以是变量比较、正则表达式匹配等。
location /example {
    if ($query_string) {
        return 403;
    }
    # 如果没有 query string,则继续处理请求
}

proxy_pass

  • 作用:将请求代理到另一个服务器。
  • 用法proxy_pass URL;
    • URL 是目标服务器的地址。
location / {
    proxy_pass http://backend_server;
}

try_files

  • 作用:尝试按顺序查找文件或目录,并返回第一个找到的资源。
  • 用法try_files file ... uri;
location /images/ {
    try_files $uri $uri/ /images/default.jpg;
}

这些指令都能够在 Nginx 配置中灵活地控制请求处理和响应生成的流程,使得服务器能够根据具体需求进行定制化配置。


执行顺序

  1. set 指令:首先,在 location 块或 server 块中定义的变量会被设置。

  2. rewrite 指令:然后,Nginx 将根据 rewrite 指令修改请求 URI。这可能会导致请求被重新路由到另一个 location 块或处理阶段。

  3. if 指令:接着,Nginx 将根据 if 指令中定义的条件执行相应的指令块。需要注意的是,尽量避免在 if 指令中执行复杂的逻辑,因为它可能会导致性能问题和不可预期的行为。

  4. return 指令:如果 if 指令中的条件被满足,或者在 rewrite 指令之后没有匹配到任何 location 块,那么就会执行 return 指令,立即结束请求处理并生成相应的响应。

  5. break 指令:最后,如果在 if 指令中使用了 break 指令,它将结束当前 location 块的处理,并将控制传递给下一个处理阶段。


基础用法

  1. set 指令
    在 Nginx 的 locationserver 块中,set 指令用于定义变量。这些变量可以在后续的指令中使用。通常用于设置一些动态值或标志位。

    示例:

    server {
        location / {
            set $my_var "some_value";
            ...
        }
    }
    
  2. rewrite 指令
    rewrite 指令用于修改请求 URI。它在当前块中处理,可能导致请求被重新路由到另一个 location 块。rewrite 指令可以在 serverlocation 块中使用。

    示例:

    server {
        location /oldpath {
            rewrite ^/oldpath(.*)$ /newpath$1 permanent;
        }
    }
    
  3. if 指令
    if 指令用于条件判断,根据条件的真假执行特定指令。尽量避免在 if 中执行复杂逻辑,因为它可能引发性能问题和不可预期的行为。

    示例:

    server {
        location / {
            set $my_var "some_value";
            if ($my_var = "some_value") {
                return 200 "Condition met";
            }
        }
    }
    
  4. return 指令
    return 指令用于立即结束请求处理并生成指定的响应。如果 if 指令的条件满足或者没有匹配到其他 location 块时,return 指令会被执行。

    示例:

    server {
        location / {
            if ($request_method = GET) {
                return 200 "GET method";
            }
        }
    }
    
  5. break 指令
    break 指令用于终止当前 location 块的处理,并将控制传递给下一个处理阶段。这在需要提前结束某些处理时非常有用。

    示例:

    server {
        location / {
            if ($request_uri ~* "\.jpg$") {
                break;
            }
            ...
        }
    }
    

在 Nginx 配置中,指令的处理顺序通常是先设置变量(set),然后进行 URI 重写(rewrite),接着根据条件执行特定指令块(if),如果需要则立即返回响应(return),最后在特定情况下结束处理并传递控制(break)。理解这些指令的作用和顺序,有助于编写高效、正确的 Nginx 配置文件。


高阶使用

  1. 高级 set 指令
    set 指令在复杂场景下可用于动态赋值和条件赋值。在 map 指令中,set 可以根据不同的条件动态赋值,从而简化配置。

    示例:

    http {
        map $http_user_agent $mobile {
            default no;
            "~*Android" yes;
            "~*iPhone" yes;
        }
        
        server {
            location / {
                set $device_type $mobile;
                if ($device_type = yes) {
                    rewrite ^ /mobile redirect;
                }
            }
        }
    }
    
  2. 高级 rewrite 指令
    rewrite 指令不仅可以简单地修改 URI,还能通过正则表达式和不同标志(如 lastbreakredirectpermanent)实现复杂的重写逻辑。

    示例:

    server {
        location / {
            rewrite ^/oldpath/(.*)$ /newpath/$1 break;
        }
        
        location /newpath {
            rewrite ^/newpath/(.*)$ /$1 last;
        }
    }
    
  3. 高级 if 指令
    使用 if 指令时,需小心避免复杂逻辑,以防性能问题。使用 try_filesmap 指令往往是更好的选择。

    示例:

    server {
        location / {
            try_files $uri $uri/ /index.html;
            if ($http_user_agent ~* "(MSIE|Trident)") {
                return 403;
            }
        }
    }
    
  4. 高级 return 指令
    return 指令适用于立即返回特定状态码和消息。结合条件判断,可以实现灵活的响应控制。

    示例:

    server {
        location /admin {
            if ($remote_addr !~* "^192\.168\.1\.") {
                return 403 "Access denied";
            }
        }
    }
    
  5. 高级 break 指令
    break 指令可用于终止当前 location 块的处理,尤其在结合条件判断时使用。

    示例:

    server {
        location / {
            if ($request_uri ~* "\.jpg$") {
                set $static 1;
                break;
            }
            if ($static) {
                root /static/images;
            }
        }
    }
    
  6. 综合实例
    通过具体示例展示如何结合使用上述指令实现复杂的配置需求,例如,根据用户代理进行重定向并处理静态文件请求。

    示例:

    http {
        map $http_user_agent $device {
            default desktop;
            "~*Android" mobile;
            "~*iPhone" mobile;
        }
    
        server {
            location / {
                if ($device = mobile) {
                    rewrite ^ /mobile last;
                }
    
                try_files $uri $uri/ /index.html;
            }
    
            location /mobile {
                root /var/www/mobile;
                try_files $uri $uri/ /mobile/index.html;
            }
    
            location ~* \.(jpg|jpeg|png|gif)$ {
                expires 30d;
                root /var/www/images;
            }
        }
    }
    

最佳实践

优化复杂的 Nginx 配置可以通过使用更多的高级指令和最佳实践来提高性能和可维护性。

以下是一些指导原则和示例:

  1. 使用 try_files 替代 if 来处理文件和目录
    try_files 指令能够更有效地处理文件和目录请求,而不需要使用复杂的 if 条件判断。

    示例:

    location / {
        try_files $uri $uri/ /index.html;
    }
    
  2. 避免在 if 中执行复杂逻辑
    if 指令中执行复杂逻辑可能会导致性能问题和不可预期的行为。尽量将逻辑转移到其他指令中,如 maptry_files 等。

  3. 合理使用 map 指令
    map 指令可以根据变量的值将其映射到其他值,用于简化配置和避免重复代码。

    示例:

    map $http_user_agent $is_mobile {
        default 0;
        "~*Android" 1;
        "~*iPhone" 1;
    }
    
    server {
        location / {
            if ($is_mobile) {
                return 301 https://m.example.com$request_uri;
            }
            ...
        }
    }
    
  4. 使用 proxy_pass 实现反向代理
    proxy_pass 指令用于将请求代理到后端服务器,适用于实现反向代理和负载均衡。

    示例:

    server {
        location / {
            proxy_pass http://backend_server;
            ...
        }
    }
    
  5. 启用缓存
    启用适当的缓存可以显著提高性能,减少服务器负载。可使用 proxy_cachefastcgi_cache 等指令来配置缓存。

    示例:

    server {
        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            ...
        }
    }
    
  6. 定期优化配置文件
    定期检查和优化配置文件,删除不再使用的指令和块,以确保配置的简洁性和可维护性。

  7. 使用 include 指令
    使用 include 指令将重复使用的配置片段提取到单独的文件中,以便统一管理和维护。

    示例:

    http {
        include /etc/nginx/conf.d/*.conf;
    }
    

通过采用以上最佳实践和高级指令,可以优化复杂的 Nginx 配置,提高服务器性能和可维护性。 。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1687017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitLab集成DingTalk(超级详细)

目录 参考文档1 简介2 集成方法2.1 钉钉测操作2.2 极狐GitLab侧操作2.3 钉钉群内操作 参考文档 钉钉集成 1 简介 极狐GitLab集成钉钉,可以在群组中机器人或者直接与机器人创建一对一的聊天框发送消息。当您未将钉钉账户和极狐GitLab 账户进行绑定时,机…

Blazor 下支持 Azure AD 的多套登录方案

比如上图配置了两套不同的登录方案,各有自己的 TenantId 和 ClientId ,要同时支持他们的登录(其实在同一套 TenantId 和 ClientId 里面配置多个登录账户不就好了,但是......那套登录的管理是在客户自己的Azure AD账户管理下的&…

C++BuilderXE 如何让listView按文件名数字排序而非字母排序

int m_nDataColSort0; bool IsAsctrue; void __fastcall TForm1::RzListView4Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare) { if(m_nDataColSort0) { //按列表第二列排序 //CompareCompareText(Item1->SubItems-…

新书发布——《机器学习大数据平台的构建、任务实现与数据治理——使用Azure、DevOps、MLOps》

内容简介 机器学习大数据平台的构建、任务实现与数据治理 你需要构建安全、稳定的数据平台,需要可以扩展到任何规模的工作负载。当项目从实验室进入生产环境时,你需要确信它可以应对现实工作中的挑战。本书能够帮助你实现这些需求,将讲述如…

ARM9驱动开发基础概念

2、arm9的通用寄存器有几个? 3、异常向量表中irq的异常向量是多少? 4、cpsr中的那几位是用来设置工作模式的? 5、r13,r14,15别名是什么?有什么作用? r13栈顶指针 :它用于实现堆栈指针操作,实…

安装测缝计安装事项详解

在建筑和工程领域,测量缝隙和裂缝的准确性对于工程质量和安全性至关重要。测缝计作为一种专业的测量工具,能够帮助工程师和施工人员准确测量和监测建筑结构的缝隙情况,进而采取合适的修复和加固措施,保证建筑物的稳定性和安全性。…

YOLOv8独家改进:KAN系列 | 「一夜干掉MLP」的KAN ,全新神经网络架构一夜爆火

💡💡💡创新点:来自 MIT 等机构的研究者提出了一种非常有潜力的替代方法 KAN。该方法在准确性和可解释性方面表现优于 MLP。而且,它能以非常少的参数量胜过以更大参数量运行的 MLP。 KAN 在边上具有激活函数,而 MLP 在节点上具有激活函数。KAN 似乎比 MLP 的参数效率更…

预约直播丨ETLCloud训练营:ETL中多流数据合并与运算专题

在大数据处理领域,一个至关重要的步骤是对多源数据流进行汇聚与融合,进而开展深度处理与剖析。此操作对于构建高效数据仓库、实现数据动态变化的实时洞察,以及驾驭复杂事件流的处理机制尤为关键。过程涉及从多样化的数据源中抽取信息&#xf…

【408精华知识】Cache类题目解题套路大揭秘

有关Cache的题目,需要理解Cache的工作原理,也即给出一个地址,要知道如何在Cache中寻找或者如何将其从主存中复制入Cache,同时理解Cache中具体是如何存储的,包含三种存储方式,分别是直接映射、全相联映射、组…

最有效的企业数据防泄漏手段 | 数据泄漏防护系统推荐

随意信息安全意识不断提高,企业纷纷寻求高效的数据防泄漏手段。在众多解决方案中,这五款软件各具特色,但它们的共同目标都是确保企业数据的安全性和保密性。 接下来,我们将逐一介绍这五款软件的特点和优势。 1、Ping 32 Ping32…

前端面试项目细节重难点(已工作|做分享)

面试官提问:需求场景:页面上有一个单选框,有是否两个选项:当用户选择是,出现一个输入框,用户可以输入内容,给后端的保存接口传入参数radio和content这两个字段,值分别是用户选项和输…

【Python】 如何在Python中创建GUID UUID

基本原理 GUID(全局唯一标识符)和UUID(通用唯一标识符)都是用来在分布式系统中唯一标识信息的。在Python中,我们可以使用内置的uuid模块来生成这些唯一标识符。 UUID有几种不同的版本,每种版本都有其特定…

图形学初识--光栅化直线算法

文章目录 什么叫做光栅化?为什么需要光栅化?直线的光栅化算法有哪些?Bresemham算法问题定义:问题模型简化:算法核心理解:算法拓展: 结尾:喜欢的小伙伴可以点点关注赞哦 什么叫做光栅…

【Java】手把手学会数组的使用

数组的基本用法 创建数组 基本语法: // 动态初始化 数据类型 [] 数组名称 new 数据类型 [] { 初始化数据 }; // 静态初始化 数据类型 [] 数组名称 { 初始化数据 }; 代码示例: int[] array1 {1,2,3,4,5};int[] array2 new int[]…

如何在OpenHarmony上使用SeetaFace2人脸识别库?

简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony(以下简称“OpenHarmony”)了,但你一定没在OpenHarmony上实现过人脸识别功能,跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。 项目效…

c++ 实现 梯度下降线性回归模型

理论与python实现部分 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation c代码 没能力实现反向传播求梯度&#xff0c;只能自己手动算导数了 #include <bits/stdc.h> #include <time.h> using namespace std;//y_hat X * W b // linreg 函数&#xff1a…

9 个适用于小型企业的顶级API管理解决方案

应用程序接口管理解决方案可帮助各种规模的企业开发、部署和管理其应用程序接口&#xff0c;并实现收入最大化。 建立 API 的组织和开发人员可能会被整个 API 生命周期中需要完成的大量任务压得喘不过气来。从规划和构建到部署、维护和货币化&#xff1b;这是一项具有挑战性的工…

【计算机网络原理】对传输层TCP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

7.从0做一个vue键盘组件

文章目录 1. 从0做一个键盘组件1.1. 最终效果1.2. 分析1.3. 实现1.4. 如何引用 1. 从0做一个键盘组件 首先是why的问题&#xff1a;为什么需要做键盘组件&#xff1f; 我们目前可知的场景&#xff1a; 在新增账单的时候&#xff0c;需要用到键盘在比如从账单列表页&#xff…

2024年 电工杯 (B题)大学生数学建模挑战赛 | 大学生平衡膳食食谱的优化设计 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是电工杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 问题1&…