文章目录
简介
Nginx简介
Nginx是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
由于 Nginx 使用基于事件驱动的架构,能够并发处理百万级别的 TCP 连接,高度模块化的设计和自由的许可证使得扩展 Nginx 功能的第三方模块层出不穷。因此其作为 Web 服务器被广泛应用到大流量的网站上,包括淘宝、腾讯、新浪、京东等访问量巨大的网站。
Nginx特点:
-
跨平台、配置简单;
-
非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发;
-
内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术;
-
nginx处理静态文件好,耗费内存少;
-
内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
-
节省宽带:支持GZIP压缩,可以添加浏览器本地缓存;
-
稳定性高:宕机的概率非常小
-
master/worker结构:一个master进程,生成一个或者多个worker进程。
-
接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力;
-
一边接收web服务器的返回数据,一边发送给浏览器客户端;
-
网络依赖性比较低,只要ping通就可以负载均衡;
-
可以有多台nginx服务器;
-
事件驱动:后端通信机制采用epoll模型。
OpenResty简介
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
基础知识
文档:基础知识简介
nginx进程模型
master/worker结构:一个master进程,生成一个或者多个worker进程;master对worker进程采用信号进行控制。
Master进程:监控进程,不处理具体的http、tcpi请求,读取及评估配置和维持;Worker进程:处理请求。
Nginx是处理一个请求过程:
- 首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址;然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen;然后再fork出多个子进程出来, 子进程会竞争accept新的连接。
- 此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后;
- 此时,某一个子进程会accept成功,然后Nginx创建对连接的封装。接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。
- 最后,nginx或客户端来主动关掉连接,到此,一个连接就完成了。
OpenResty运行机制
OpenResty基于Nginx,将整个web服务的生命周期和请求处理流程划分出若干个阶段,针对不同阶段openresty给出了不同指令来利用lua代码进行相关的控制
web生命周期
- initing阶段:服务启动,读取配置初始化内部数据结构
- configuration 读取配置文件,解析配置指令,设置运行参数,无控制指令
- master-init 配置文件解析完后,master进程初始化公用数据,可用init_by_lua进行定制
- worker-init worker进程自己初始化进程专用数据, 可用init_worker_by_lua进行定制
- running阶段:服务运行,接受请求,返回响应,对于每个请求都按照下面的流水线进行处理
- ssl SSL和TLS安全通信和验证,ssl_certificate_by_lua握手时设置安全证书
- ssl SSL和TLS安全通信和验证,ssl_certificate_by_lua握手时设置安全证书
- preread 预读数据,接收http请求头
- rewrite 改写nginx变量,set_by_lua || 改写url,实现重定向、跳转,rewrite_by_lua
- access 访问控制或者限速,access_by_lua
- content 产生响应内容,content_by_lua || 反向代理时选择后端服务器 balancer_by_lua
- filter 加工处理响应头 header_filter_by_lua, 加工处理响应体 body_filter_by_lua
- log 记录日志,log_by_lua
- exiting 服务停止,进行清理工作,如关闭监听端口
上面的xxx_by_lua都有三种形式的实现
- xxx_by_lua ‘lua code’(字符串形式)
- xxx_by_lua_block {lua code}(花括号形式,低版本的不行)
- xxx_by_lua_file lua_file.lua(文件形式)
使用参考文档
restydoc nginx
#查找模块的说明
restydoc -s proxy_pass
#-s指定小节
配置说明
location 匹配规则
模式 | 含义 |
---|---|
location = /uri | = 表示精确匹配,只有完全匹配上才能生效 |
location ^~ /uri | ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 |
location ~ pattern | 开头表示区分大小写的正则匹配 |
location ~* pattern | 开头表示不区分大小写的正则匹配 |
location /uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
location / | 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default |
基础用法
#定位lua库和so库指令,apinginx的nginx.conf中的配置
# lua package path
lua_package_path "/mnt***/nginx/lua/?.lua;;";
# lua package cpath
lua_package_cpath "/mnt/***nginx/baselib/?.so;";
#缓存lua代码,