Nginx进阶--2

Posted *King*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx进阶--2相关的知识,希望对你有一定的参考价值。

一、nginx配置默认主机

在这里插入图片描述
nginx安装echo模块

1、下载第三方模块

wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar -zxvf v0.61.tar.gz ##解压 
cd nginx-1.15.8 ##进入 nginx 源码目录,准备重新配置 nginx

2、配置,–add-module指向模块目录即会安装插件到nginx中

./configure --add-module=/usr/local/src/echo-nginx-module-0.61/

在这里插入图片描述
3、然后make、make install

make
make install

4、查看安装的插件

nginx -V

在这里插入图片描述

二、路由Location的使用

1、Location语法规则

location [=||*|^~] /uri/ {… }

符号含义
==开头表示精确匹配
^~^~开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可(禁止正则匹配)。
~~ 开头表示区分大小写的正则匹配
~*~* 开头表示不区分大小写的正则匹配
!和!*!和!*分别为区分大小写不匹配及不区分大小写不匹配的正则
/用户所使用的代理(一般为浏览器)

最常用:
location = /
location ^~ /static/
location ~* .(gif|png|css|js)$

location流程匹配规则:
在这里插入图片描述

  • =精准匹配命中时,停止 location 动作,直接走精准匹配,

  • 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条

  • 如果最长的那一条普通匹配声明为非正则,直接此条匹配,停止 location

  • 如果最长的那一条普通匹配不是非正则,继续往下走正则 location

  • 按代码顺序执行正则匹配,当第一条正则 location 命中时,停止 location

2、Location执行过程

url=域名+端口+path+param

path匹配过程:

假设http请求路径为:http://192.168.0.132:8088/mvc/index?id=2 ,匹配过程如下:

  • 将整个url拆解为域名/端口/path/params

  • 先由域名/端口,对应到目标server虚拟主机

  • path部分参与location匹配,path=path1匹配部分+path2剩余部分

  • 进入location方法体内部流程

  • 若是静态文件处理,则进入目标目录查看文件:root指令时找path1+path2 对应的文

    件;alias 指令时找 path2 对应的文件

  • 若是 proxy 代理,则形如 proxy_pass=ip:port 时转发 path1+path2 路径到 tomcat;形如

    proxy_pass=ip:port/xxx 时 转 发 path2 路 径 到 tomcat 。 params 始 终 跟 随 转 发 。

在这里插入图片描述
在这里插入图片描述

三、rewrite使用

rewrite regex replacement [flag];

flag=【break/last/redirect/permanent】

  • regex 是正则表达式
  • replacement 是替换值,新值
  • flag – 后续处理标识

1、flag=break

中断rewrite替换了path路径,直接往下执行

2、flag=last

中断rewrite替换了path路径,还重新laction--------死循环11次后自动中断

3、flag= redirect/permanent

发生页面重定向(301 永久重定向/302 临时重定向),nginx 流程结束,返回 http 响应到浏览

器,页面 url 更新

4、flag 为空

不中断rewrite替换了path路径,还重新laction--------死循环11次后自动中断

四、Nginx处理请求的11个阶段

在这里插入图片描述
Nginx 处理请求的全过程一共划分为 11 个阶段

按阶段由上到下依次执行 (上 一阶段的所有指令执行完毕,才进入下一阶段)

各阶段的含义如下:

  • post-read: 接收到完整的 http 头部后处理的阶段,在 uri 重写之前。一般跳过

  • server-rewrite: location 匹配前,修改 uri 的阶段,用于重定向,location 块外的重写指令 (多次执行

  • find-config: uri 寻找匹配的 location 块配置项(多次执行

  • rewrite: 找到 location 块后再修改 uri,location 级别的 uri 重写阶段(多次执行

  • post-rewrite: 防死循环,跳转到对应阶段

  • preaccess: 权限预处理

  • access: 判断是否允许这个请求进入

  • post-access: 向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝

  • try-files: 访问静态文件资源

  • content : 内容生成阶段,该阶段产生响应,并发送到客户端

  • log: 记录访问日志

    rewrite----find_config------rewrite-----access----content

五、负载均衡—upstream

upstream order{
	ip_hash
	server 172.12.0.3:8081  weight=2;
	server 172.12.0.4:8081  weight=1 down;
}

nginx的upstream常规使用:

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务down掉,能自动剔除。

2、weight

指定轮询几率,weigth和访问比率成正比,用于后端服务器性能不均的情况,domn暂时不参与负载

不配置 weight(即默认 weight 均为 1)

down 暂时不参与负载

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

代理时的负载使用

格式:proxy_pass http://负载名;
在这里插入图片描述

六、Openrestr简介与安装

OpenResty 是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,常用的第三方模块以及大多数依赖项。 可以把它看成是 Nginx 附加众多的第三方插件的合集。其主体是嵌入 lua 脚本的支持。

1、删除之前的nginx源码包

在这里插入图片描述
在这里插入图片描述

2、简易的yum安装方式

此方式简单,缺点是无法干预启停插件

yum install yum-utils 
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo 
yum install openresty

3、源码安装openresty方式

wget https://openresty.org/download/openresty-1.15.8.1.tar.gz 
tar -zxvf openresty-1.15.8.1.tar.gz 
##选择需要的插件启用, --with-Components 激活组件,--without 则是禁止组件 
cd openresty-1.15.8.1
./configure --without-http_redis2_module --with-http_iconv_module 
make  
make install 

vi /etc/profile ##加入 path 路径 
export PATH=$PATH:/usr/local/openresty/nginx/sbin/ 
source /etc/profile ##生效配置

安装检测

nginx -V  ##如下显示,则表示安装成功

在这里插入图片描述

4、Lua介入Nginx带来的基础api

ngx.arg 指令参数,如跟在 content_by_lua_file 后面的参数 
ngx.var request 变量,ngx.var.VARIABLE 引用某个变量 
ngx.ctx 请求的 lua 上下文 
ngx.header 响应头,ngx.header.HEADER 引用某个头 
ngx.status 响应码 
ngx.log 输出到 error.log 
ngx.send_headers 发送响应头 
ngx.headers_sent 响应头是否已发送 
ngx.resp.get_headers 获取响应头 
ngx.is_subrequest 当前请求是否是子请求 
ngx.location.capture 发布一个子请求 
ngx.location.capture_multi  发布多个子请求 
ngx.print 输出响应 
ngx.say 输出响应,自动添加‘\\n‘ 
ngx.flush 刷新响应
ngx.exit 结束请求

5、Lua嵌入Nginx的时机阶段

nginx执行lua脚本片断时,需要明确指明执行的nginx阶段时机,主要有以下几种时机:

set_by_lua* : 设置 nginx 变量,实现复杂的赋值逻辑 
rewrite_by_lua* : 实现转发、重定向等功能 
access_by_lua* : IP 准入、接口访问权限等情况集中处理 
content_by_lua* : 接收请求处理并输出响应 
header_filter_by_lua* : 设置 header 和 cookie 
body_filter_by_lua* : 对响应数据进行过滤,如截断/替换等

6、Lua基础功能使用介绍

在这里插入图片描述
(1)在content阶段,执行lua脚本,输出 hello ,lua

location /hello {
	##ngx.say---输出内容lua
	content_by_lua 'ngx.say("hello lua")';
}

(2)执行lua脚本文件
在这里插入图片描述
(3)lua取get参数

页面请求路径:http://lua.enjoy.com/args?a=20&b=50

则 ngx.var.arg_a 即取得 a 参数值,如下图:
在这里插入图片描述
(4)lua取全量参数

请求:http://lua.enjoy.com/args_read?a=20&b=50
在这里插入图片描述
(5)lua取request中header信息
在这里插入图片描述
(6)给lua脚本传参

使用端传参
在这里插入图片描述
脚本中借助ngx.arg取参
在这里插入图片描述
(7)权限校验

一般校验动作,指定在access阶段执行脚本
在这里插入图片描述
脚本处理
在这里插入图片描述
(8)内容过滤

nginx有时候需要对下游服务生成的内容进行处理过滤
在这里插入图片描述
脚本中的处理
在这里插入图片描述

7、Lua引入第三方模块的使用

OpenResty 提供了非常多的第三方插件,支持操作 redis/mysql 等服务,lua 使用它们的模式

一般按以下流程

  • require “resty/xxx” :导入模块功能,类似 java 中的 import 导入类
  • local obj = xxx:new() :模块创建对象 obj
  • local ok, err = obj :connect :对象连接到目标库
  • obj :method :这里可以为所欲为,尽情操纵目标库了

(1)Lua-resty-redis连接redis用法

lua-resty-redis插件,对nginx操作redis的支持十分强大,成熟的用法演示如下:

基础的引入、连接动作
在这里插入图片描述
redis操作动作
在这里插入图片描述
(2)lua-resty-mysql连接mysql数据库

引入模块、创建连接
在这里插入图片描述
mysql 查询操作
在这里插入图片描述

以上是关于Nginx进阶--2的主要内容,如果未能解决你的问题,请参考以下文章

Nginx进阶--2

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

Nginx 进阶篇

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?