前言
我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺序。关于OpenResty,我想大家应该不再陌生,随着系统架构的不断升级、优化,OpenResty在被广泛的应用。
OpenResty简介
1、OpenResty又被称为ngx_openresty,是基于Nginx的核心Web应用程序服务器
2、OpenResty是基于Nginx和Lua的高性能Web平台,OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效地变成一个强大的通用Web应用平台
3、OpenResty的目标是让Web服务直接运行在Nginx服务内部,充分利用Nginx的非堵塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端DB都进行一系列的高性能响应
4、OpenResty借助于Nginx的事件驱动模型和非堵塞IO,以实现高性能的Web应用程序
5、OpenResty使我们可以借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端DB等服务
6、OpenRest使用ngx.location.capture_multi极大地减少浏览器的HTTP连接数量,可以异步并发的访问后台接口
OpenResty运行原理
Nginx采用的是master-worker模型,也就是一个master进程管理多个worker进程,基本的时间处理都放在worker进程中,master进程负责全局初始化以及对worker进行的管理
OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量
1、我们都知道计算机的核心是CPU,它承担了所有计算机的任务,它就像一个工厂,时刻运行着
2、假定工厂的电力有限,一次只能供给一个车间使用,也就是说,一个车间开工的时候,其他车间都必须停工,背后的含义就是,单个CPU一次只能执行一个任务
3、进程就好比工厂里的车间,他代表CPU所能处理的单个任务。任意时刻,CPU总是运行一个进程,其它进程处于非运行状态
4、一个车间里,可以有很多工人。他们协同完成一个任务
5、线程就好比是车间里的工人,一个进程可以包含多个线程
6、车间的空间是工人们共享的,比如:许多房间是每个工人都可以进出的,这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存
7、可是,每个房间的大小不同,有些房间最多只能容纳一个人,比如:厕所,里面有人的时候,其他人就不能进了,这代表一个线程使用某些共享内存时,其它线程必须等他结束,才能用这一块的内存
8、一个防止他人进入的简单办法,就是门口加一把锁,先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去,这就叫“互斥锁”,防止多个线程同时读写某一块内存区域
9、还有某些房间,可以同时容纳N个人,比如厨房。也就是说,如果人数大于n,多出来的只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用
10、这时的解决办法,就是在门口挂n把钥匙,进去的人就取一把钥匙,出来的时候再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须要在门口等待了,这种信号叫做“信号量”,用来保证多个线程不会冲突
协程描述
1、协程不是进程,也不是线程,他就是一个函数,一个特殊的函数--可以在某个地方挂起,并且可以重新再挂起处继续执行。协程,进程,线程相比,不是一个维度的概念。ngx_cache_purge-2.3.tar.gz
2、一个进程可以包含多个线程,一个线程可以包含多个协程。 但是,一个线程内的多个协程的运行是串行的。也就是说当一个协程运行时,其它协程必须挂起
3、协程不适合计算密集型的场景,协程适合I/O(输入/输出,读/写)阻塞型
OpenResty的优势
1、首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。
2、借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。
3、而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。
Openresty的安装
下载:OpenResty - 下载
首先安装openresty
[root@C7--11 ~]# yum -y install wget
[root@C7--11 ~]# wget -O /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
........
..
正在保存至: “/etc/yum.repos.d/CentOS7-Base-163.repo”
100%[=========================================================================================>] 1,572 --.-K/s 用时 0s
2021-12-04 03:20:32 (300 MB/s) - 已保存 “/etc/yum.repos.d/CentOS7-Base-163.repo” [1572/1572])
[root@C7--11 ~]# yum -y install epel-release
.............
[root@C7--11 ~]# tar -zxvf openresty-1.15.8.2.tar.gz -C /usr/src
.......
[root@C7--11 ~]# yum install pcre-devel openssl-devel gcc curl
................
#该模块用于清理缓存
[root@C7--11 ~]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
#该模块用于ustream健康检查
[root@C7--11 ~]# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
[root@C7--11 ~]# tar xf ngx_cache_purge-2.3.tar.gz -C /usr/src/openresty-1.15.8.2/bundle/
[root@C7--11 ~]# tar xf nginx_upstream_check_module-0.3.0.tar.gz -C /usr/src/openresty-1.15.8.2/bundle/
[root@C7--11 ~]# cd /usr/src/openresty-1.15.8.2/
[root@C7--11 openresty-1.15.8.2]# ./configure --prefix=/usr/local/openresty --with-http_realip_module --with-http_ssl_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/
解释
--with*** #安装一些内置/集成的模块
--with-http_realip_module #取用户真实ip模块
-with-pcre #Perl兼容的达式模块
--with-luajit #集成luajit模块
--add-module #添加自定义的第三方模块,如此次ngx_che_purge
[root@C7--11 openresty-1.15.8.2]# gmake && gmake install
................
...........
[root@C7--11 openresty-1.15.8.2]# ln -s /usr/local/openresty/nginx /usr/local/nginx
[root@C7--11 openresty-1.15.8.2]# vim /etc/profile
......
... 最后添加内容
export ORPATH=/usr/local/openresty
export PATH=$PATH:$ORPATH/bin:$ORPATH/nginx/sbin
保存
[root@C7--11 openresty-1.15.8.2]# useradd -r -s /sbin/nologin -g www www
[root@C7--11 openresty-1.15.8.2]# vim /usr/local/openresty/nginx/conf/nginx.conf
user www www; #修改为www www
保存
直接复制粘贴
[root@C7--11 openresty-1.15.8.2]# cat >> /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
[Install]
WantedBy=multi-user.target
EOF
[root@C7--11 openresty-1.15.8.2]# systemctl start nginx
访问测试
配置nginx.conf文件
[root@C7--11 ~]# vi /usr/local/openresty/nginx/conf/nginx.conf
........... 在http 中添加内容
http {
include mime.types;
default_type application/octet-stream;
#lua模块路径,多个之间”;”分隔,其中”;;”表示默认搜索路径,默认到/usr/local/openresty/下找
lua_package_path "/usr/local/openresty/lualib/?.lua;;"; #lua 模块
lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; #c模块
include lua.conf;
..........
....
保存
创建lua.conf文件
[root@C7--11 ~]# vi /usr/local/openresty/nginx/conf/lua.conf #添加以下内容
server {
listen 8080;
server_name _;
location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}
location /filelua {
default_type 'text/html';
lua_code_cache off; #关闭缓存,这样调试时每次修改lua代码不需要reload nginx
content_by_lua_file conf/lua/test.lua;
}
}
[root@C7--11 ~]# mkdir /usr/local/openresty/nginx/conf/lua
[root@C7--11 ~]# cd /usr/local/openresty/nginx/conf/lua
[root@C7--11 lua]# vi test.lua
ngx.say("hello world,bbb file");
保存
[root@C7--11 ~]# systemctl restart nginx