一、nginx配置默认主机

nginx 返回数据设置 nginx 返回206_redis

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/

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_02

3、然后make、make install

make
make install

4、查看安装的插件

nginx -V

nginx 返回数据设置 nginx 返回206_nginx_03

二、路由Location的使用

1、Location语法规则

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

符号

含义

=

=开头表示精确匹配

^~

^~开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可(禁止正则匹配)。

~

~ 开头表示区分大小写的正则匹配

~*

~* 开头表示不区分大小写的正则匹配

!和!*

!和!*分别为区分大小写不匹配及不区分大小写不匹配的正则

/

用户所使用的代理(一般为浏览器)

最常用:

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

location流程匹配规则:

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_04

  • =精准匹配命中时,停止 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 始 终 跟 随 转 发 。

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_05


nginx 返回数据设置 nginx 返回206_lua_06

三、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 返回数据设置 nginx 返回206_lua_07


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://负载名;

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_08

六、Openrestr简介与安装

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

1、删除之前的nginx源码包

nginx 返回数据设置 nginx 返回206_lua_09


nginx 返回数据设置 nginx 返回206_lua_10

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  ##如下显示,则表示安装成功

nginx 返回数据设置 nginx 返回206_lua_11

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基础功能使用介绍

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_12

(1)在content阶段,执行lua脚本,输出 hello ,lua

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

(2)执行lua脚本文件

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_13


(3)lua取get参数

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

则 ngx.var.arg_a 即取得 a 参数值,如下图:

nginx 返回数据设置 nginx 返回206_lua_14


(4)lua取全量参数请求:http://lua.enjoy.com/args_read?a=20&b=50

nginx 返回数据设置 nginx 返回206_nginx_15


(5)lua取request中header信息

nginx 返回数据设置 nginx 返回206_lua_16


(6)给lua脚本传参使用端传参

nginx 返回数据设置 nginx 返回206_nginx_17


脚本中借助ngx.arg取参

nginx 返回数据设置 nginx 返回206_lua_18


(7)权限校验一般校验动作,指定在access阶段执行脚本

nginx 返回数据设置 nginx 返回206_lua_19


脚本处理

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_20


(8)内容过滤nginx有时候需要对下游服务生成的内容进行处理过滤

nginx 返回数据设置 nginx 返回206_lua_21


脚本中的处理

nginx 返回数据设置 nginx 返回206_nginx_22

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的支持十分强大,成熟的用法演示如下:

基础的引入、连接动作

nginx 返回数据设置 nginx 返回206_nginx_23


redis操作动作

nginx 返回数据设置 nginx 返回206_nginx_24


(2)lua-resty-mysql连接mysql数据库引入模块、创建连接

nginx 返回数据设置 nginx 返回206_nginx_25


mysql 查询操作

nginx 返回数据设置 nginx 返回206_nginx 返回数据设置_26