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的主要内容,如果未能解决你的问题,请参考以下文章
我的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启动报错Job for nginx.service failed because the control process exited with error code(代码片段