• 深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」


    proxy_pass的疑问?

    很多小伙伴们跟我沟通说之前章节的介绍的proxy_pass介绍的并不是很详细和清晰,那么我们就针对于Nginx proxy_pass 使用在进行复习回顾一下。

    proxy_pass的使用场景

    在使用Nginx服务,很多情况Nginx用于反向代理,那就离不开使用proxy_pass,它的作用主要用于路由转发到后台服务使用,作为代理到后台服务而已。而针对于proxy_pass后面的url是否以/结尾的场景还有很多学问哦!

    如果你不知道后面url添加其它路由等场景,下面来聊聊这些分别代表什么含义和实现。

    proxy_pass的详解介绍

    第一种场景 后面url加 /
    location /statistic/ {
        proxy_pass http://127.0.0.1/;
    }
    
    • 1
    • 2
    • 3

    那么当客户端请求URL到Nginx所在的服务器时候,Nginx所在的服务器IP地址为:172.168.2.21,那么请求URL:https://172.168.2.21/statistic/index.html

    结果:代理到URL:http://127.0.0.1/index.html, 所以你应该明白了,他会将客户传递的statistic的这段path直接忽略掉和strip掉

    第二种场景 后面url没有 /
    location /statistic/ {
        proxy_pass http://127.0.0.1;
    }
    
    • 1
    • 2
    • 3

    结果:代理到URL:http://127.0.0.1/statistic/index.html

    第三种场景 后面url添加其它路由,并且最后添加 /
    location /statistic/ {
        proxy_pass http://127.0.0.1/customer/;
    }
    
    • 1
    • 2
    • 3

    结果:代理到URL:http://127.0.0.1/customer/index.html

    第四种场景 后面url添加其它路由,但最后没有添加 /
    location /statistic/ {
        proxy_pass http://127.0.0.1/customer;
    }
    
    • 1
    • 2
    • 3

    结果:代理到URL:http://127.0.0.1/customerindex.html


    进入正题,实战开发技巧

    夯实server_name的路由代理机制

    通过server_name指令实现选择服务器块(server block)的选择。如果具体细节还可以参考”How nginx processes a request“

    使用精确名称

    使用精确匹配模式:匹配server_name的值为wiz.org或者www.wiz.biz 的值。

    server {
        listen       80;
        server_name  wiz.org  www.wiz.biz;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    使用通配符

    通配符名称可以在名称的开头和结尾包含星号,并且只能紧挨着点号(.)。server_name “.wiz.org” 不仅可以匹配 wiz.wiz.org 还可以匹配www.test.wiz.org. “.wiz.org”这种特殊的通配符名称可以用于匹配精确名称”wiz.org”和通配符名称”.wiz.org”.

    server {
        listen       80;
        server_name  *.wiz.org;
        ...
    }
    server {
        listen       80;
        server_name  wiz.*;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面主要就是通过 * 这个特殊符号进行匹配选择对应的server块,下面就是监听了80端口的两个server服务块,最后选择以.wiz.org结尾的server块,还是以wiz.* 为开始部分的host值,如果有两个都命中了,则会选择配置位置靠前的,目前就是优先会去选择*.wiz.org。

    使用正则表达式

    Nginx的正则表达式兼容于Perl编程语言(PCRE)。为了使用正则表达式, server_name必须以波浪号(~)开头

    server {
        listen       80;
        server_name  ~^(?.+)\.wiz\.biz$;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:server_name ~^(?.+).wiz.biz ; 如 果 不 采 用   开 头 会 被 当 成 是 精 准 名 称 或 者 如 果 表 达 式 中 包 含 星 号 就 被 当 成 通 配 符 名 称 ( 而 且 大 都 被 认 为 时 不 合 法 ) , 不 要 忘 记 设 置 ” ” 和 ” ;如果不采用~开头会被当成是精准名称或者如果表达式中包含星号就被当成通配符名称(而且大都被认为时不合法),不要忘记设置”^”和” ; ()”锚点。虽然语法上没要求,但是逻辑上需要他们。还要注意域名的点号要使用反斜杠做转义,包含字符”{“和”}”的正则表达式需要使用引号:

    server_name  "~^(?\w\d{1,3}+)\.example\.net$";
    
    • 1

    否则nginx会启动失败并显示错误信息:

    directive "server_name" is not terminated by ";" in ...
    
    • 1
    被命名的正则表达式捕获器可以随后作为变量使用:
    server {
        server_name   ~^(www\.)?(?.+)$;
        location / {
            root   /sites/$domain;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的配置很容易理解,在root定向指令的时候,可以使用之前匹配到的domain对应的实际数据值,进行映射,形成动态映射的模式

    匹配模式优先级选择

    当通过server_name搜索服务器时, 如果名字和多个指定的变量匹配, 例如同时匹配通配符和正则表达式,在下面的优先级次序中,第一个匹配的变量将被选择:

    • 精确名称
    • 星号开头的最长的通配符名称, 例如 “*.wiz.biz”
    • 星号结束的最长的通配符名称, 例如 “wiz.*”
    • 第一个匹配的正则表达式(按照出现在配置文件中的顺序)

    index指令的作用

    index指令的作用和目的就是通过Nginx配置,设置网站的默认请求内容(页面)。

    index指令简介

    index指令后面可以跟多个内容,并且采用空格隔开;

    • 如果包括多个请求内容,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止;
    • 文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后;
    • 文件可以使用变量$来命名;
    案例配置
    location / {
    	root /usr/local/nginx/html;
    	index index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4

    访问该location的时候,可以通过 http://ip:port/,地址后面如果不添加任何内容,则默认依次访问/usr/local/nginx/html/index.html和/usr/local/nginx/html/index.htm,找到第一个来进行返回。

    该指令拥有默认值,index index.html ,即,如果没有给出index,默认初始页为index.html


    总结实战案例

    创建服务名称为:wiz.test.org,目标http://wiz.test.org 和 http://*.test.net 应该都指向同一个虚拟主机

    server {
           listen 80;
           server_name wiz.test.org *.test.net;
           root /var/html/wiz;
           index index.html;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后建立 /var/html/wiz目录,准备好站点的html文件。

    配置完成之后,在重新转载前,先验证一下:

    $ sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    • 1
    • 2
    • 3

    验证通过,再重新装载:

    sudo nginx -s reload
    
    • 1

    最后访问一下对应的nginx服务看看是否可以保证访问到对应的 /var/html/wiz/index.html呢?

  • 相关阅读:
    计算机网络期末复习题四
    为什么大厂压力大,竞争大,还有这么多人热衷于大厂呢?
    在java中操作Redis
    2022-09-01 mysql/stonedb-多线程并行遍历元组遇到的问题分析
    R语言使用ggplot2包可视化指定连续变量和风险比HR值的关系、、基于限制性立方样条分析方法、限制性立方样条cox回归模型
    数字化转型系列主题:战略咨询常用术语解释和样例说明
    QTableWidget 合并单元格
    MySQL如何查询某个字段含有字母数字的值
    每日学习03--List与ArrayList的区别以及Arraylist的方法
    go协程栈底层讲解
  • 原文地址:https://blog.csdn.net/l569590478/article/details/127832225