Openresty案例讲解

前言

我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺序。关于OpenResty,我想大家应该不再陌生,随着系统架构的不断升级、优化,OpenResty在被广泛的应用。

OpenResty简介

1、OpenResty又被称为ngx_openresty,是基于Nginx的核心Web应用程序服务器
2、OpenResty是基于NginxLua的高性能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协程,协程之间数据隔离,每个协程都具有独立的全局变量

Openresty案例讲解_第1张图片

进程,线程,协程的一个简单解释

进程和线程的关系

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案例讲解_第2张图片

首先安装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

访问测试

Openresty案例讲解_第3张图片

 配置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

Openresty案例讲解_第4张图片

Openresty案例讲解_第5张图片

你可能感兴趣的:(lua,nginx,运维)