zoukankan      html  css  js  c++  java
  • Nginx正确配置Location

    文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
    file

    之前已经讲过Nginx的基本配置,本篇文章主要对Nginx中Location指令的作用进行介绍。本篇文章主要对Nginx的Location配置原则进行详细的讲述。Location是根据用户请求的URI来进行不同的定位,定位到不同的处理方式上,匹配成功即进行相关的操作。首先需要先介绍一下Nginx的echo模块,它可以配置的Location标签是否正确,是否达到配置的目的。

    安装echo模块
    echo模块可以在Nginx中用来输出一些信息,是在调试排错过程中一个比较好的工具。安装此模块后可以在Nginx用echo命令输出字符到用户的浏览器中,可用于检测Nginx的配置的正确性。

    下载Nginx-echo

    cd /usr/local/nginx-1.12.2/
    wget https://github.com/openresty/echo-nginx-module/archive/v0.60.tar.gz

    解压文件

    tar zxvf v0.60.tar.gz

    查看已安装的模块

    nginx -V

    进入Nginx目录下配置

    cd /usr/local/nginx-1.12.2/
    ./configure --add-module=/usr/local/nginx-1.12.2/echo-nginx-module-0.61 --add-module=/usr/local/nginx-1.12.2/ngx_image_thumb-master

    编译安装,如果是升级可以使用make upgrade

    make && make install

    Nginx实际处理请求的模块是ngxhttpcore_module模块, 在处理请求时,变量可以通过访问日志记录下来,也可以用于echo 模块进行输出。我们可以简单看个例子:
    输出请求参数
    file

    请求结果:

    [root@VM_0_2_centos ~]# curl www.niyueling.cn/index.html?author=niyueling --header "content-type:text/html;" -H "content-length:200"
    query_string: from=jdilong
    request_method: GET
    content_type: text/html;
    content_length: 200
    fastcgi_script_name: /index.php
    request_uri: /index.php?from=jdilong
    document_uri: /index.php
    document_root: /application/nginx1.8.1/html
    server_protocol: HTTP/1.1
    https:
    nginx_version: 1.8.1
    remote_addr: 192.168.229.196
    remote_port: 46786
    server_addr: 192.168.229.196
    server_port: 80
    server_name: www.xyz.com
    uri: /index.php

    可以看到我们可以通过echo模块将我们请求中的一系列参数提取打印出来。

    echo_sleep定时输出
    location /echo_with_sleep/ {
    echo hello;
    echo_flush;
    echo_sleep 3;
    echo world;
    }
    可以通过echo_sleep设置延迟输出,单位为秒。

    异步访问其他url
    location / {
    echo_reset_timer;

    echo_location_async /sub1/;
    echo_location_async /sub2/;

    echo "took $echo_timer_elapsed sec for total.";
    }

    location /sub1/ {
    echo_sleep 2;
    echo hello;
    }

    location /sub2/ {
    echo_sleep 1;
    echo world;
    }
    echo_location_async可以异步访问其他地址,不影响当前函数执行。上述执行结果$echo_timer_elapsed最终输出值为0。
    使用echo有一点需要注意的是,如果echo后边有配置return 或者配置 proxy_pass,则echo的输出会被覆盖,即浏览器无法看到echo的内容。

    Location配置
    Location的语法

    location [=||*|^~] patt { }

    Location类型:

    location = patt {} [精准匹配]
    location patt {} [普通匹配]
    location ~ patt {} [正则匹配]

    中括号中为修饰符,可以不写任何参数。此时为一般匹配。

    Nginx匹配类型的优先级:
    file

    Nginx配置虚拟服务器
    server {
    listen address[:PORT]|PORT;
    server_name SERVER_NAME;
    root DOCUMENT_ROOT;
    }

    通过listen可以对端口进行监听,有多种设置方案:

    listen 192.168.0.100:8000; 监听192.168.0.100的8000端口
    listen 192.168.0.100; 监听192.168.0.100的80端口
    listen 8000; 监听本地8000端口
    listen *:8000; 监听本地8000端口
    listen localhost:8000; 监听127.0.0.1的80端口
    listen [::]:8000; 监听本地的ipv6的8000端口
    listen [::1]; 监听本地的ipv6地址的80端口

    通过server_name设置虚拟服务器名称,简单一点来说就是我们在浏览器中访问的域名,如果域名需要设置多个则通过空格隔开,支持*通配任意长度的任意字符。简单举个例子:

    server_name niyueling.cn www.niyueling.cn

    Location配置
    Location语法规则:

    location [=||*|^~] patt { }

    Location命中过程

    1. 先进行精准匹配,如果命中立即返回结果并结束解析的过程;
    2. 精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;
    3. 继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

    匹配模式及优先级顺序:
    优先级排序自顶向下,优先级逐步降低。

    • location = /uri   =开头表示精确匹配,只有完全匹配上才能生效。
    • location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
    • location ~ pattern  ~开头表示区分大小写的正则匹配。
    • location ~* pattern  ~*开头表示不区分大小写的正则匹配。
    • location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
    • location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。

    简单举个例子:
    server {
    listen 80;
    server_name localhost;
    location =/text.html
    root /var/www/html;
    index text.html;
    }

    	location / {
    			root html;   
    			index default.html;
    	}
    
    	location ~ image { 
    			root /var/www/image;
    			index index.html;
    	}
    

    }

    第一个location对应精准匹配,浏览器输入127.0.0.1/text.html,定位到服务器/var/www/html/text.html文件。第二个location对应普通匹配,浏览器输入127.0.0.1,定位到服务器/usr/local/nginx/html/default.html文件。第三个location对应正则匹配,浏览器输入127.0.0.1/image,定位到服务器/var/www/html/text.html文件。

    注意:
    进行前缀匹配时,会先一直找到最长的前缀匹配,然后看该前缀匹配有没有前置的^~ 修饰符,如果没有^~ 修饰符就接着去查找正则匹配,查找到匹配正则匹配后执行该location。如果最长前缀匹配有^~修饰符则命中该location,不回去匹配其他的正则匹配location;例子如下:
    请求 http://localhost/static/files/test.jpg 命中规则C,如果规则B有 ^~修饰符,则会命中规则B:

    location ^~ /static/ {
    echo "规则A";
    }

    location /static/files {
    echo "规则B";
    }

    location ~ .(gif|jpg|png|js|css)$ {
    echo "规则C
    }

    欢迎关注我的个人公众号:程序猿周先森。
    file

  • 相关阅读:
    数据分析之可反复与独立样本的T-Test分析
    朗朗上口的两幅对联
    mysql编码、数据表编码查看和改动总结
    2014-04-19编程之美初赛题目及答案解析
    测试集群模式安装实施Hadoop
    笔记:常用排序算法
    笔记:常用排序算法
    安装Redis并测试
    常见架构风格举例总结
    转载:PostgreSQL SQL的性能提升
  • 原文地址:https://www.cnblogs.com/niyueling/p/11563251.html
Copyright © 2011-2022 走看看