Nginx学习笔记

一.Nginx是什么,常用于哪些场景及其优点是什么??

高性能web服务器,常用于 静态web服务器(动静分离)、反向代理和负载均衡服务器、OpenAPI网关;优点有5个:高并发和高性能、高稳定性、高可扩展性、热部署和热升级、开源免费。

基于异步非阻塞的事件驱动模型(master-worker模式)

严格的来说,Nginx 应该叫做 HTTP Server; Tomcat 则是一个Application Server。

Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活;Nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读《深入理解nginx:模块开发与架构解析》这本书。

Nginx把所有功能都统一抽象成模块,即“万物皆模块”。每个模块仅仅完成一个独立、简单的功能(说白点,就是一个功能模块不能占用cpu时间太长)。

对于一个HTTP请求来说,需要我们考虑的内容很多,因此Nginx将HTTP请求划分成以下11个阶段,每个阶段只处理很简单的功能.

NGX_HTTP_POST_READ_PHASE: 接收完请求头之后的第一个阶段,它位于uri重写之前,实际上很少有模块会注册在该阶段,默认的情况下,该阶段被跳过。

NGX_HTTP_SERVER_REWRITE_PHASE: server级别的uri重写阶段,也就是该阶段执行处于server块内,location块外的重写指令,在读取请求头的过程中nginx会根据host及端口找到对应的虚拟主机配置

NGX_HTTP_FIND_CONFIG_PHASE: 寻找location配置阶段,该阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令

NGX_HTTP_REWRITE_PHASE: location级别的uri重写阶段,该阶段执行location基本的重写指令,也可能会被执行多次

NGX_HTTP_POST_REWRITE_PHASE: location级别重写的后一阶段,用来检查上阶段是否有uri重写,并根据结果跳转到合适的阶段

NGX_HTTP_PREACCESS_PHASE: 访问权限控制的前一阶段,该阶段在权限控制阶段之前,一般也用于访问控制,比如限制访问频率,链接数等

NGX_HTTP_ACCESS_PHASE: 访问权限控制阶段,比如基于ip黑白名单的权限控制,基于用户名密码的权限控制等

NGX_HTTP_POST_ACCESS_PHASE: 问权限控制的后一阶段,该阶段根据权限控制阶段的执行结果进行相应处理

NGX_HTTP_TRY_FILES_PHASE: try_files指令的处理阶段,如果没有配置try_files指令,则该阶段被跳过 NGX_HTTP_CONTENT_PHASE: 内容生成阶段,该阶段产生响应,并发送到客户端

NGX_HTTP_LOG_PHASE: 日志记录阶段,该阶段记录访问日志

二.反向代理和负载均衡

反向代理:代理上游服务器(正向代理:代理客户端)(proxy_pass)

负载均衡:客户端的请求量即为负载,将负载分配到集群中的服务器即为负载均衡

Nginx支持的负载均衡调度算法方式如下:

weight轮询(默认):

接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

ip_hash:

每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

fair:智能调整调度算法

动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。

url_hash:

按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

配置方式:upstream 配置上游服务器

upstream test{

ip_hash; --ip_hash

或者 --url_hash

hash $request_url;

hash_method crc32

或者 --默认weight轮询

默认

server localhost:8080;

server localhost:8081;

}

三.Nginx(Openresty)安装配置及使用配置

1.下载nginx-upsync到openresty-1.13.6.2 的bundle目录(bundle存放第三方模块)

git clone https://github.com/weibocom/nginx-upsync-module.git # 建议使用git clone代码编译,刚开始我使用release的tar.gz 编译nginx失败了

2.cd openresty-1.13.6.2

./configure --prefix=/home/zhangshilei/openresty_sync

--with-luajit

--with-http_iconv_module

--add-module=./bundle/nginx-upsync-module/

-j2

3.make &&make install

四:目录结构及常用Nginx指令

nginx.conf文件中的相对目录是prefix或者-p指定的目录

Nginx worker进程数一般设置与CPU核心数一致

在执行configure命令是已经将很多模块编译进nginx,但是是否启用这些模块,取决于配置文件nginx.conf中对应的配置项

常用指令:

1.另行指定配置文件的启动方式

./nginx -c tempnginx.conf

  1. 另行指定安装目录的启动方式

./nginx -p xxx/xx/

3.另行指定全局配置项

./nginx -g "pid xx/xx/test.pid;" eg ./nginx -g "pid xx/xx/test.pid;" -s stop

4.测试配置文件是否有误

./nginx -t -c tempnginx.conf

5.显示Nginx版本信息

./nginx -v

6.显示编译阶段的参数

./nginx -V

7.向master进程发信号

./nginx -s stop ./nginx -s quit ./nginx -s reload ./nginx -s reopen

8.ps命令来查看nginx master的进程ID:

ps -ef| grep nginx

netstat -ntlp sudo netstat -anp | grep nginx 查看虚拟主机端口号

9.根据master进程进程号关闭nginx

kill -s SIGTERM pid

五:nginx.conf配置

虚拟主机:

常用配置分类:

虚拟主机和请求的分发、文件路径的定义、内存及磁盘资源的分配、网络连接的设置、MIME类型的设置、对客户端请求的限制、文件操作的优化、对客户端请求的特殊处理等

nginx.conf:

定义Nginx运行的用户和用户组

user www www;

启动进程,通常设置成和cpu的数量相等

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

指定Nginx worker进程可以打开的最大句柄描述符个数

worker_rlimit_nofile 102400;

全局错误日志及PID文件

error_log /usr/local/nginx/logs/error.log;

错误日志定义等级,[ debug | info | notice | warn | error | crit ]

pid /usr/local/nginx/nginx.pid;

工作模式及连接数上限

events {

use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能

worker_connections 102400;

单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)

multi_accept on;

尽可能多的接受请求

}

设定http服务器,利用它的反向代理功能提供负载均衡支持

http {

设定mime类型,类型由mime.type文件定义

include mime.types; #相对nginx.conf的相对路径下

default_type application/octet-stream;

设定日志格式

access_log /usr/local/nginx/log/nginx/access.log;

sendfile on;

sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用必须设为 on

如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的 uptime.

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

keepalive_timeout 60; #keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后,继请求时,keepalive-timeout功能可避免建立或重新建立连接。

tcp_nodelay on; #提高数据的实时响应性

开启gzip压缩

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。

值越大,消耗CPU比较高。

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

client_max_body_size 10m; #允许客户端请求的最大单文件字节数

client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数

proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)

proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

设定请求缓冲

large_client_header_buffers 4 4k;

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k #不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s; #这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1; #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive

包含其它配置文件,如自定义的虚拟主机

include vhosts.conf;

这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定 #但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。weight配置权重,在fail_timeout 内检查max_fails次数,失败则剔除均衡。

upstream tdt_wugk {

server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;

server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;

}

虚拟主机配置

server {

侦听80端口

listen 80;

定义使用www.wuguangke.cn访问

server_name www.wuguangke.cn;

设定本虚拟主机的访问日志

access_log logs/access.log main;

root /data/webapps/wugk; #定义服务器的默认网站根目录位置

index index.php index.html index.htm; #定义首页索引文件的名称 #默认请求

location ~ /{

root /data/www/wugk;

定义服务器的默认网站根目录位置

index index.php index.html index.htm;

定义首页索引文件的名称 #以下是一些反向代理的配置.

proxy_next_upstream http_502 http_504 error timeout invalid_header;

如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

proxy_redirect off; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://tdt_wugk; #请求转向后端定义的均衡模块

}

定义错误提示页面

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。

location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {

root /data/www/wugk;

expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力。

expires 3d;

}

PHP脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

location ~ .php$ {

root /root;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/www/wugk$fastcgi_script_name;

include fastcgi_params;

}

设定查看Nginx状态的地址

location /NginxStatus {

stub_status on;

}

}

}

一些模块处理请求时可以产生丰富的变量,当然,这些变量还可以用于其他Http模块

Nginx会拿到完整的用户请求存到nginx服务器硬盘或内存后,再向上游服务器发起连接,把缓存的客户端其你去转发到上游服务器

缺点:延长一个请求的处理时间,增大磁盘和内存压力

优点:降低上游服务器负载,把压力放在nginx服务器上

Nginx不会将请求和响应的头部发给对方,可配置加入

自定义模块

一个模块是一个或多个.c文件,将这些文件放到一个文件夹,并在该文件夹下建一个conf文件

在该conf文件中加入下面变量

ngx_addon_name=ngx_http_mytest_module ##指定模块名

HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module" ##在http模块中加入本模块(也可以是其他模块)

NGX_ADDON_SRCS="NGX_ADDON_SRCSngx_addon_dir/ngx_http_mytest_module.c" ##加入本模块源码

$ngx_addon_dir等价于—add-module=path中的path

编写.c文件

内涵:

ngx_command_t/ngx_http_module_t/ngx_module_t/nginx_http_Xxx_handler/ngx_http_xxx(注册handler)

Server匹配规则: 请求找到对应server处理(找到处理请求的组件)

1.Nginx取出请求头中的Host,与server_name进行匹配

规则:完全匹配>匹配通配符在前>匹配通配符在后>正则表达式

另外 server_name 默认为”” 表示匹配没有host的请求

host形式: 域名; 域名:port; ip:port

2.如果上一步没有匹配到则进行端口匹配

规则:端口中配置default|default_server>匹配listen端口的第一个server

端口:listen 8000;表示监听*:80000

listen 127.0.0.1 表示监听 127.0.0.1:80

listen 127.0.0.1:8000 表示监听 127.0.0.1:8000
先server_name匹配,匹配不到看listen有没有配置默认server,最后进行端口匹配**

我的理解:请求首先根据请求端口进入端口,服务器中端口上保存对应的server信息,开始匹配server_name,当host与其中的server_name匹配,对应server处理,如果不匹配找寻该port下是否存在listen配置了default|default_server ,若有则由该server处理,没有则匹配该port下的找到的第一个server处理

Location匹配规则:请求URI匹配location(找到组件中具体处理方法)

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

[] 内为可选项

location匹配分两种:普通匹配、正则匹配

一般以[=,^~。@]或者不加任何前缀表示普通匹配,普通匹配没有书写顺序,匹配规则是”最大前缀“,

以[,*]开头表示正则匹配,正则匹配有书写顺序,一旦匹配就进入到该location块执行

:区分大小写的正则匹配;*:不区分大小写的正则匹配

前缀含义:不加任何前缀:表示普通匹配,后续仍会进行正则匹配,可以被正则匹配覆盖

= 表示严格精准匹配 ^~表示部分匹配最大长度匹配后不需要再进行正则匹配

(如果不加前缀达到完全匹配,则也是不需要正则匹配的)

正则location 匹配让步普通 location 的精确匹配结果;但覆盖普通 location的最大前缀匹配结果

究极总结:location = >location完全匹配>location ^~ >location | >location部分匹配

https://www.cnblogs.com/lidabo/p/4169396.html

请求转发与重定向

在****nginx****的****rewrite****阶段

包含

匹配进入对应location的处理

1.root 和alias规则

2.proxy_pass规则

六:goaccess使用

服务器访问监控的UI:goaccess

安装:

wget https://tar.goaccess.io/goaccess-1.3.tar.gz

tar -xzvf goaccess-1.3.tar.gz

cd goaccess-1.3/

./configure --enable-utf8 --enable-geoip=legacy

make

make install

使用:

1.配置

goaccess-1.3目录下运行:实时的将nginx的access.log 转存为report.html

[root@localhost goaccess-1.3]#./goaccess /home/zhangshilei/openresty_lua/logs/access.log -o /home/zhangshilei/openresty_lua/html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED

!!!!需要执行上述命令,才能实时监控

2.修改nginx.conf

location report.html{

alias html/report.html;

}

3.访问

10.10.38.195:8002/report.html 该页面监控对服务器的的访问

七:ngx_lua API (Lua<-->C相互调用API)

https://github.com/openresty/lua-nginx-module#ngxshareddictcapacity

nginx lua 的8个阶段

init_by_lua

set_by_lua

rewrite_by_lua

access_by_lua

content_by_lua

header_filter_by_lua

body_filter_by_lua

log_by_lua

上述网址中有相关的nginx_lua的指令和api 在nginx中使用lua 在lua代码中使用nginx的参数

项目结构:

将lua代码写到一个文件中。在nginx.conf 的http模块中加入lua_package_path 指定?.lua的搜索路径,并写一个lua.conf 在nginx.conf中 include lua.conf;在lua.conf中引用对应的lua文件。在lua代码中使用 require("a.b.c")的方式引入对应的lua代码(c为文件名,a/b为包名)

八:nginx 高可用(keepAlive使用)

#九:Lua脚本学习

Nginx 变量的创建和赋值操作发生在全然不同的时间阶段。Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候(rewrite阶段);而赋值操作则只会发生在请求实际处理的时候(content阶段)。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。(变量在一个请求处理过程被赋值,不同请求有不同的值,所以变量作用域是一个请求处理过程)

Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的server配置块

Nginx 内建变量最常见的用途就是获取关于请求或响应的各种信息

在Nginx 配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串 ,在Nginx中,除非特殊说明,大部分地方字符串的不需要引号括住,字符串和变量的拼接也不需要引号

一个请求处理过程中维护一个变量副本,不同的请求变量副本不同

“主请求”以及各个“子请求”都拥有不同的变量$var的值容器副本

并非所有的内建变量都作用于当前请求。少数内建变量只作用于“主请求”

ngx_lua API: 从nginx中获取到请求通过lua处理后返回给nginx,最终返回给客户的整个过程

ngx.arg是一个表,可以把nginx的变量放到这个表中,供给Lua使用

context:set_by_lua, body_filter_by_lua

set_by_lua sum 'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'a $b;

ngx.var.VARNAME: 相当于直接操作nginx变量

context:set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua

ngx.var :table保存了Nginx中的变量ngx.var[1] ngx.var.varname

Nginx中已经定义的变量可以被直接使用;

在lua中将变量设置为nil,则Nginx中该变量也会消失. 注意:最好在lua中定义一个变量接收该变量,避免修改导致无法使用
ngx.ctx是一个当前请求对应的lua上下文表(一个请求对应的存储域)

context:init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua

ngx.shared.DICT共享内存多worker共用

在http模块中定义如下

lua_shared_dict dog 10m;

在其他地方通过ngx.shared.dog:XX()方法使用该内存* ngx_shared_DICT API

print(...)等价于 ngx.log(ngx.NOTICE, …) 向日志文件中写入内容

ngx.log(log_level, ...)

ok, err = ngx.print(...):向客户端发送内容,需要先发送响应头

ngx.say():跟ngx.print()一样,只是尾随一个换行符

secs = ngx.req.start_time()请求发起时间

num = ngx.req.http_version()num值:.0, 1.0, 1.1, 0.9,nil表示为识别

ngx.status 读写请求的响应状态(发出响应header之前使用,否则也没大影响只会在error.log中记录error message)

ok, err = ngx.send_headers()发出响应头

value = ngx.headers_sent检测是否发出了响应头

ok, err = ngx.flush(wait?)Flushes response output to the client :发出响应

ngx.exit(status)结束执行并向nginx返回状态吗

ok, err = ngx.eof()显式指定响应输出流的结尾

时间相关

ngx.sleep(seconds)

str = ngx.today()

secs = ngx.time()

secs = ngx.now()

ngx.update_time()

str = ngx.localtime()当前位置时间 time stamp format yyyy-mm-dd hh:mm:ss

str = ngx.utctime()* UTC time time stamp format yyyy-mm-dd hh:mm:ss

正则支持

captures, err =ngx.re.match(subject, regex, options?, ctx?, res_table?)正则 subject是否匹配正则表达式regex

from, to, err = ngx.re.find(subject, regex, options?, ctx?, nth?)返回正则匹配的位置

iterator, err = ngx.re.gmatch(subject, regex, options?)正则匹配后返回一个迭代器

newstr, n, err = ngx.re.sub(subject, regex, replace, options?)正则匹配后返回第一个匹配的字符串

Nginx提供获取请求的uri的变量 所以ngx_lua没有提供对应的方法

ngx.var.request_uri

$uri指的是请求的文件和路径,不包括“?”或者“#”之后的东西,

$request_uri则是请求的整个字符串,包含了后面的query_string的

请求转发与重定向

rewrite regrex replacement option;

请求uri匹配regex表达式后,使用replacement改写uri,

option:

last: 发起一次重新匹配location server块中使用last

break:不发起重新匹配location location块中常用break

redirect:客户端重发请求

(请求包含)ngx.location.capture:发送子请求的方式实现location的重新定位(一般在location中的content_by_lua 重新匹配location 且指定了请求参数)

res = ngx.location.capture(uri, options?)一般在location中发送子请求得到响应res res.status/ res.body/ res.header/ res.truncated 参数是请求uri和请求参数 请求参数类似一个table,内部可配置多参数method body args ctx

inherit all the request headers of the current request by default :子请求继承本请求的headers

When the body option is not specified and the always_forward_body option is false (the default value), the POST and PUT subrequests will inherit the request bodies of the parent request

ngx.location.capture.mutil发送多个子请求

res1, res2, ... = ngx.location.capture_multi({ {uri, options?}, {uri, options?}, ... })

value = ngx.is_subrequest是否是子请求

(请求转发)

ngx.exec(uri, args?):内部转发请求到uri 和args(lua string 或乱table)

等价于rewrite regrex replacement last;

请求URI处理

ngx.req.set_uri(uri, jump?):改写请求uri,并根据jump的boolean值决定是否跳转

jump为true,等价于rewrite...last 改写uri,并重新匹配location

jump为false,等价于rewrite...break

三者的区别:

is_internal =ngx.req.is_internal()判断当前请求是否是内部请求 返回boolean

内部请求定义: 从当前nginx服务器内部发出而不是从客户端启动的请求。(子请求都是内部请求)//并非是请求当前服务器内部

(请求重定向)重定向到uri

ngx.redirect(uri, status?):客户端以修改的uri重发一起请求

转发与重定向的区别

转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变

转发是服务器行为,重定向是客户端行为

转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;

转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失

请求和响应头处理

ngx.header.HEADER = VALUE设置响应头的参数

value = ngx.header.HEADER获得请求头的参数

headers, err =ngx.resp.get_headers(max_headers?, raw?)

返回当前请求的响应头 lua table

headers, err =ngx.req.get_headers(max_headers?, raw?)*

返回当前请求头 lua table

ngx.req.set_header(header_name, header_value):设置当前请求的请求头

ngx.req.clear_header(header_name):清理header_name的请求头内容(删除该请求头的信息)

str = ngx.req.raw_header(no_request_line?)string形式服务器接收到的原始请求头 (默认包含请求行)

请求方法处理

method_name = ngx.req.get_method(): 返回请求方法 (请求方法常量)

ngx.req.set_method(method_id):改写当前请求的请求方法

请求参数处理(或请求体):有些格式不对,需要读取请求体

ngx.req.set_uri_args(args) :改写请求参数 参数可以使lua string 或者lua table

args, err = ngx.req.get_uri_args(max_args?) :获取请求参数 lua table存

请求体:某种格式的请求数据

nginx核心本身不会主动读取请求体

请求体的读取一般发生在nginx的content handler中

读取body到内存是第一步(对于lua来说两种方式)

1.ngx.req.read_body():没有返回 只是读取body到内存

2.lua_need_request_body:是一个指令 将请求的body读入$request_body变量中

从Nginx中读到Lua是第二部

需要配合ngx.req.get_post_args使用

data = ngx.req.get_body_data()返回lua string形式的请求体 vs ngx.req.get_post_args(从内存中将body读取到lua中使用时第二步)

args, err = ngx.req.get_post_args(max_args?)***获取post请求的参数table形式存

ngx.req.set_body_data(data) 修改请求体内容

file_name = ngx.req.get_body_file() 读到文件中 利用lua io

ngx.req.set_body_file(file_name, auto_clean?)通过文件形式写入body*

销毁body

ngx.req.discard_body()读取并丢弃请求体 如果请求体已经被读取,则立即返回不做任何处理

新建body(下述3个共同使用)

ngx.req.init_body(buffer_size?)为当前请求新建一个空的body并初始化大小

写入:body

ngx.req.append_body(data_chunk):Append new data chunk specified by the data_chunk *argument onto the existing request body created by thengx.req.init_bodycall.

完成写入

ngx.req.finish_body()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容