Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nginx正确配置Location

Nginx正确配置Location

作者头像
创译科技
发布于 2019-08-30 04:07:47
发布于 2019-08-30 04:07:47
1.2K00
代码可运行
举报
文章被收录于专栏:Node开发Node开发
运行总次数:0
代码可运行

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

安装echo模块

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

下载Nginx-echo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/nginx-1.12.2/
wget https://github.com/openresty/echo-nginx-module/archive/v0.60.tar.gz
代码语言:javascript
代码运行次数:0
运行
复制

解压文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar zxvf v0.60.tar.gz

查看已安装的模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nginx -V

进入Nginx目录下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make && make install

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

输出请求参数

请求结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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定时输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location /echo_with_sleep/ {
echo hello;
    echo_flush;  
    echo_sleep   3;
echo world;
}

可以通过echo_sleep设置延迟输出,单位为秒。

异步访问其他url

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location [=|~|~*|^~] patt { }

Location类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = patt {} [精准匹配]
location patt {}     [普通匹配]
location ~ patt {}  [正则匹配]

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

Nginx匹配类型的优先级:

Nginx配置虚拟服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root DOCUMENT_ROOT;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listen 192.168.0.100:8000;  监听192.168.0.1008000端口
listen 192.168.0.100;  监听192.168.0.10080端口
listen 8000;  监听本地8000端口
listen *:8000;  监听本地8000端口
listen localhost:8000;  监听127.0.0.180端口
listen [::]:8000;  监听本地的ipv6的8000端口
listen [::1];  监听本地的ipv6地址的80端口

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server_name niyueling.cn www.niyueling.cn

Location配置

Location语法规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location [=|~|~*|^~] patt { }

Location命中过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
先进行精准匹配,如果命中立即返回结果并结束解析的过程;精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;3.继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

匹配模式及优先级顺序:

优先级排序自顶向下,优先级逐步降低。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.location = /uri   =开头表示精确匹配,只有完全匹配上才能生效。
2.location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
3.location ~ pattern  ~开头表示区分大小写的正则匹配。
4.location ~* pattern  ~*开头表示不区分大小写的正则匹配。
5.location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。6.location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

简单举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ^~ /static/ {
     echo "规则A";
}
location /static/files {
     echo "规则B";
}
location ~ \.(gif|jpg|png|js|css)$ {
     echo "规则C}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿周先森 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Deep learning with Python 学习笔记(8)
利用 Keras 函数式 API,你可以构建类图(graph-like)模型、在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型。Keras 回调函数和 TensorBoard 基于浏览器的可视化工具,让你可以在训练过程中监控模型
范中豪
2019/09/10
7030
Deep learning with Python 学习笔记(8)
[Deep-Learning-with-Python] Keras高级概念
目前为止,介绍的神经网络模型都是通过Sequential模型来实现的。Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在一起的。
用户1631856
2018/08/09
1.7K0
[Deep-Learning-with-Python] Keras高级概念
使用keras开发非串行化神经网络
我们当前所开发的网络都遵循同一个模式,那就是串行化。多个网络层按照前后次序折叠起来,数据从底层输入,然后从最高层输出,其结构如下图:
望月从良
2018/12/28
6800
使用keras开发非串行化神经网络
keras 基础入门整理
在进行自然语言处理之前,需要对文本进行处理。 本文介绍keras提供的预处理包keras.preproceing下的text与序列处理模块sequence模块
学到老
2019/01/25
1.5K0
数据科学 IPython 笔记本 四、Keras(下)
为了节省时间,你可以采样一个观测子集(例如 1000 个),这是你选择的特定数字(例如 6)和 1000 非特定数字的观察值(即非 6)。我们将使用它构建一个模型,并查看它在测试数据集上的表现。
ApacheCN_飞龙
2022/05/07
8700
数据科学 IPython 笔记本 四、Keras(下)
Keras 学习笔记(四)函数式API
Keras 函数式 API 是定义复杂模型(如多输出模型、有向无环图,或具有共享层的模型)的方法。
种花家的奋斗兔
2020/11/13
9790
Keras 学习笔记(四)函数式API
keras知识点
所有的函数都在keras.preprocessing 分别有text ,sequence, image
润森
2019/08/29
4800
【tensorflow2.0】构建模型的三种方法
可以使用以下3种方式构建模型:使用Sequential按层顺序构建模型,使用函数式API构建任意结构模型,继承Model基类构建自定义模型。
西西嘛呦
2020/08/26
8390
【tensorflow2.0】构建模型的三种方法
使用CNN进行情感分类
参考文章: Embedding层详解 Keras: GlobalMaxPooling vs. MaxPooling
Michael阿明
2021/02/19
1.1K0
使用CNN进行情感分类
Python深度学习精华笔记2:基于keras建模解决深度学习二分类问题
本文是第二篇:基于keras建模解决Python深度学习的二分类问题,使用keras内置的IMDB数据集
皮大大
2023/08/29
4970
从零开始学keras(六)
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
5220
从零开始学keras(六)
关于深度学习系列笔记五(层、网络、目标函数和优化器)
损失函数,即用于学习的反馈信号;损失函数将这些预测值与目标进行比较,得到损失值,用于衡量网络预测值与预期结果的匹配程度
python与大数据分析
2022/03/11
9300
关于深度学习系列笔记五(层、网络、目标函数和优化器)
深度学习-卷积神经网络
在之前的分类学习中,使用普通的神经网络能够达到97.8的精确度,使用卷积神经网络能够达到0.99的精确度
火星娃统计
2020/09/15
4140
第一个深度学习实战案例:电影评论分类
这是一个典型的二分类问题。使用的是IMDB数据集,训练集是25000条,测试也是25000条
皮大大
2022/04/02
5180
第一个深度学习实战案例:电影评论分类
keras系列︱Sequential与Model模型、keras基本结构功能(一)
中文文档:http://keras-cn.readthedocs.io/en/latest/ 官方文档:https://keras.io/ 文档主要是以keras2.0。
全栈程序员站长
2022/11/03
1.9K0
keras系列︱Sequential与Model模型、keras基本结构功能(一)
该文章介绍了在深度学习模型中,不同的层对输入进行计算,从而影响模型的性能。文章详细讨论了卷积层、池化层、全连接层和LSTM层的特点和作用,以及如何使用这些层来构建高性能的模型。此外,文章还探讨了如何通过冻结层和重新训练层来提高模型的性能。
悟乙己
2018/01/02
10.3K0
keras系列︱Sequential与Model模型、keras基本结构功能(一)
人工智能生成内容(AIGC)在图像生成领域的技术进展
人工智能生成内容(AIGC,AI-Generated Content)在图像生成领域取得了显著的进展。本文将探讨从卷积神经网络(CNN)到风格迁移(Style Transfer)的技术演变,并通过代码实例展示其应用。
一键难忘
2024/06/21
1.3K0
Python深度学习精华笔记3:基于Keras解决多分类问题
机器学习中的路透社数据集是一个非常常用的数据集,它包含来自新闻专线的文本数据,主要用于文本分类任务。这个数据集是由路透社新闻机构提供的,包含了大量的新闻文章,共计22类分类标签。
皮大大
2023/09/09
1K0
深度学习精要之CapsuleNets理论与实践(附Python代码)
神经网络于上世纪50年代提出,直到最近十年里才得以发展迅速,正改变着我们世界的方方面面。从图像分类到自然语言处理,研究人员正在对不同领域建立深层神经网络模型并取得相关的突破性成果。但是随着深度学习的进一步发展,又面临着新的瓶颈——只对成熟网络模型进行加深加宽操作。直到最近,Hinton老爷子提出了新的概念——胶囊网络(Capsule Networks),它提高了传统方法的有效性和可理解性。
用户3578099
2019/08/16
7620
神经网络基础及Keras入门
人工神经网络,简称神经网络,在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。
小歪
2018/12/17
5870
推荐阅读
相关推荐
Deep learning with Python 学习笔记(8)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验