01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布

简介

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 等都进行一致的高性能响应。

下载部署

wget https://openresty.org/download/openresty-1.13.6.2.tar.gz
cd openresty-1.13.6.2
./configure 
make && make install

目录结构

[root@server openresty]# ls
bin  COPYRIGHT  luajit  lualib  nginx  pod  resty.index  site


# 分析目录结构
# 相比Nginx源代码目录相比少了很多东西,少了的东西在bundle目录下。build是编译后生成的目标中间文件
# 在bundle目录中有很多模块,最核心的是Nginx源代码,nginx-相应的版本中,当前的openresty基于nginx-1.13.6.2这个版本进行二次开发。


/root/openresty-1.13.6.2/configure --help
# 查看configure脚本帮助文件
# 和nginx帮助文件基本没有太大的不同,只不过openresty集成了很多第三方模块
# 前缀带有without是默认是内置在编译版本中的
# 前缀带有with是默认是没有在编译版本中的

添加Lua代码启动

添加lua注意
/*
		在nginx.conf 中实际是可以直接添加Lua代码,但是不能把Lua的语法Lua的源代码直接放在conf中,因为nginx的解析器它的配置语法是跟Lua代码是不相同的。
		在openresty的nginx lua模块中,它提供了几条指令,其中有一条指令是content_by_lua
		content_by_lua是在http请求处理的内容生成阶段,我们用Lua代码来处理。
*/


/*
		openresty的Lua模块中提供了一些API 如ngx.say,会去生成http响应,浏览器在发起http请求中,它会在User-Agent这样的head中,
		去添加当前浏览器的类型,我是xxx,我用了什么样的内核,用ngx.req.ge_headers把用户请求中的头部取出来,然后找出User-Agent,把User-Agent值通过这样一种文本方式返回给浏览器中.
		通过openresty的nginx lua模块,我们可以用它提供给我们的API完成很多功能,我们可以利用Lua本身的一些工具库把Lua语言添加进来参加我们生成响应的这样一个过程中。
		直接使用openresty提供的API或者Lua代码生成响应,为浏览器客户端提供服务。
		我们可以使用Lua语言以及提供的相应的API库直接去访问Redis,Mysql,Tomcat等这样的服务,然后把不同的响应通过程序逻辑组成相应的http响应返回给用户
*/
修改配置文件
[root@server nginx]# cat /usr/local/openresty/nginx/conf/nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;

				location /lua {
	    		 default_type text/html;
	    		 content_by_lua '
	    		 ngx.say("User-Agent: ",ngx.req.get_headers()["User-Agent"])
	    		 ';
				}

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

# 启动
[root@server nginx]# cat /usr/local/openresty/nginx/sbin/nginx
访问

Linux下ab性能测试

下载配置ab
[root@server openresty]# yum -y install httpd-tools
[root@server openresty]# ab -V
This is ApacheBench,Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss,Zeus Technology Ltd,http://www.zeustech.net/
Licensed to The Apache Software Foundation,http://www.apache.org/
1W并发压力测试
[root@server openresty]# ab -c 10000 -n 100000 127.0.0.1/lua
This is ApacheBench,http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        openresty/1.13.6.2   # 服务器信息和版本
Server Hostname:        127.0.0.1		# 服务器的域名
Server Port:            80		# 端口

Document Path:          /lua  # 访问的路径
Document Length:        28 bytes   # 文档大小

Concurrency Level:      10000   # 并发请求数
Time taken for tests:   5.978 seconds   # 整个测试持续的时间
Complete requests:      100000  # 完成的请求数
Failed requests:        196008  # 失败的请求数
   (Connect: 0,Receive: 0,Length: 98912,Exceptions: 97096)
Write errors:           0        # 网络连接写入错误数
Total transferred:      511104 bytes   # 传输的总数据量
HTML transferred:       81312 bytes    # 传输的HTML内容量
Requests per second:    16729.18 [#/sec] (mean)   # 平均每秒请求数
Time per request:       597.758 [ms] (mean)   # 所有用户请求一次的平均时间
Time per request:       0.060 [ms] (mean,across all concurrent requests)  # 单个用户请求一次的时间
Transfer rate:          83.50 [Kbytes/sec] received  # 传输速率

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  323 302.4    256    3359
Processing:    64  246  62.9    247     525
Waiting:        0    8  48.8      0     342
Total:        283  570 304.2    512    3566


# 所有服务请求的百分比占用时间,这里50%的请求用时512ms,一般看90%的部分
Percentage of the requests served within a certain time (ms)
  50%    512
  66%    541
  75%    545
  80%    547
  90%    556
  95%   1463
  98%   1524
  99%   1555
 100%   3566 (longest request)
1.5W并发压力测试
[root@server openresty]# ab -c 15000 -n 100000 127.0.0.1/lua
This is ApacheBench,http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        openresty/1.13.6.2
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /lua
Document Length:        28 bytes

Concurrency Level:      15000
Time taken for tests:   6.128 seconds
Complete requests:      100000
Failed requests:        201164
   (Connect: 0,Length: 102820,Exceptions: 98344)
Write errors:           0
Total transferred:      291456 bytes
HTML transferred:       46368 bytes
Requests per second:    16317.62 [#/sec] (mean)
Time per request:       919.252 [ms] (mean)
Time per request:       0.061 [ms] (mean,across all concurrent requests)
Transfer rate:          46.44 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  471 296.5    409    3498
Processing:    74  380 100.9    383     878
Waiting:        0    7  57.5      0     573
Total:        494  851 303.4    808    4077

Percentage of the requests served within a certain time (ms)
  50%    808
  66%    818
  75%    832
  80%    856
  90%    888
  95%   1750
  98%   1812
  99%   1832
 100%   4077 (longest request)
2W并发压力测试
[root@server openresty]# ab -c 20000 -n 100000 127.0.0.1/lua
This is ApacheBench,http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        openresty/1.13.6.2
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /lua
Document Length:        28 bytes

Concurrency Level:      20000
Time taken for tests:   6.101 seconds
Complete requests:      100000
Failed requests:        194710
   (Connect: 0,Length: 97430,Exceptions: 97280)
Write errors:           0
Total transferred:      478720 bytes
HTML transferred:       76160 bytes
Requests per second:    16389.97 [#/sec] (mean)
Time per request:       1220.258 [ms] (mean)
Time per request:       0.061 [ms] (mean,across all concurrent requests)
Transfer rate:          76.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  625 432.2    507    3665
Processing:   107  474 149.2    441    1024
Waiting:        0   15  94.3      0     714
Total:        521 1099 443.9    984    4362

Percentage of the requests served within a certain time (ms)
  50%    984
  66%   1005
  75%   1010
  80%   1019
  90%   1949
  95%   1997
  98%   2131
  99%   2421
 100%   4362 (longest request)

通过lua实现灰度发布

nginx.conf

[root@server conf]# cat nginx.conf
user  root;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream up1{
	server 127.0.0.1:8081;
    }
    upstream up2{
	server 127.0.0.1:8082;
    }
    upstream all{
	ip_hash;
        serever 127.0.0.1:8081;
        serever 127.0.0.1:8082;
    }
    server {
        listen       80;
        server_name  localhost;

    		# 请求交给lua脚本处理
				location / {
	    		lua_code_cache off;
        	content_by_lua_file /usr/local/nginx/lua/proxy.lua;
				}

				# location @ 用于nginx内部跳转
				location @up1 {
	    		proxy_pass http://up1;
				}


				location @up2 {
	 		   proxy_pass http://up2;
				}

				location @all {
	   			 proxy_pass http://all;
				}
   }
}

proxy.lua

ngx.header.content_type="text/html;charset=utf8"
redis = require('resty.redis')
redis = redis.new()
redis:set_timeout(1000)
 
ok,err =  redis:connect('127.0.0.1',6379)
 
if not ok then
    ngx.say('connect to redis failed ! reason: ' .. err)
end
 
-- 从redis中检查是否存在即将更新的upstream主机
check_up1 = redis:get('update1') --(up1)
check_up2 = redis:get('update2') --(up2)
redis:close()
-- 注意返回的数据类型来判断
if check_up1 == "1" then
    ngx.exec("@up2")
elseif check_up2 == "1" then
    ngx.exec("@up1")
else
    ngx.exec("@all")
end

-- 原理就是利用redis中设置指定key,比如要更新主机1,则redis中添加key=update1,value=1,当浏览器请求进入nginx的content阶段后执行lua脚本,
-- 脚本中检查redis中是否存在要更新的主机,如果发现某个主机要更新则通过Nginx API for Lua中的ngx.exec接口内部跳转到另一台主机。
-- 如果两个都不更新,则根据nginx自己的方式(默认轮询)分发请求。
-- nginx里使用了ip_hash保持会话,主要是为了用户的请求在后端记录的日志中保持完整。

优点

高并发

根据以上的测试来看,一台1核700兆的linux虚拟机即可跑出2W的并发,足以说明OpenResty处理高并发的能力,由于ab工具的限制,只能测试上限2W的并发,因此,这里也只做到了2W的测试。

热更新

Lua属于脚本语言,编译之后即可运行;Nginx具备优雅重启的功能;因此,线上业务如果出现问题需要及时修复的,更新修改Lua脚本之后,重启Nginx即可完成更新发布;如果没有配置Lua缓存功能的话,只要更新Lua脚本即可更新修复线上问题,不重启Nginx也可以。

缺点

不适合处理复杂的业务逻辑

由于功能性的东西主要使用Lua进行开发,受Lua语言特性的影响,不太适合做业务比较复杂的功能。

互联网上资料少

互联网上可以找的资料比较少;不过,本身Lua的学习过程不是特别的复杂,所以,这基本不会成为你学习它的障碍

适用场景

高仿问下应用及官网主页

如商城,咨询类的应用首页,会存在大量的请求,由于涉及到的内容比较多;所以可是私用预载入的形式,将主页的数据放置在redis中;使用OpenResty+redis实现首页,官网主页的高并发加载.

商城类的秒杀功能

秒杀功能会存在短时间的请求洪峰,如果处理不当可能会造成down机的风险,可以结合OpenResty+redis实现秒杀的功能.

ip限流

互联网系统可能存在非法用户恶意暴力请求,导致正常的用户无法使用,可以通过OpenResty+redis实现ip的白名单机制,去拦截非法的用户ip

APP灰度升级发布

可以根据系统的数据及条件实现APP的灰度升级测试

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件一、Nginx 简介1. 什么是Nginx  Nginx(“engine x”)是一个_nginx代理
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图。架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。A想要组C的房子,但是A并不认识C所以租不到,但是B认识C,A找B帮忙租到了C的房子。客户端代理服务器服务器。_docker nginx 配置
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时,通常情况下应该显示一个友好的错误页面,而不是仅仅显示一个简单的错误提示。在Nginx中,可以通过配置来实现404错误自动跳转到首页的功能。如果您的网站使用动态内容生成页面(如PHP或其他服务器端语言),则应相应地修改配置以适应您的网站架构。这样,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。为了使配置生效,需要重新加载Nginx配置。首先,需要打开Nginx的配置文件。现在,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。_nginx 404 重定向
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+mysql+wordpress 实战_docker wordpress mariadb
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以在任务管理器中查看到nginx的进程。重新启动下 直接访问8090端口 ok 访问成功。1 :查看80端口占用情况,pid的值为3960。3:在运行中输入regedit打开注册表编辑器。2: 通过以下命令查看3960所对应的服务名称。4:找到Start,右键修改将其制改为4。_nginx80端口无法访问
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx 被设计为能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动的架构,可以有效地处理高流量的 Web 请求。负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能和可用性。反向代理:Nginx 可以充当反向代理,将客户端请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性和可扩展性。静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript、图像等)的服务,减轻应用服务器的负担。
文章浏览阅读976次。nginx作为常用的web代理服务器,某些场景下对于性能要求还是蛮高的,所以本片文章会基于操作系统调度以及网络通信两个角度来讨论一下Nginx性能的优化思路。我们的大学教程大部分讲述七层模型,实际上现代网络协议使用的都是四层模型,如下图,应用层报文经过四层的首部封装到对端。对端链路层拆开首部查看mac地址是自己在网上,拆开ip首部查看目的地址是不是自己,然后到达传输层应用层完成报文接收。文章是基于原有个人知识基础上,对旧知识进行巩固,以及新知识实践学习。
文章浏览阅读5.4k次,点赞9次,收藏15次。最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。_nginx 允许跨域
文章浏览阅读2.5k次。项目配置了多个域名,如下,php 代码中有获取的值。当访问a.demo.com时,其获取的值是符合预期的。但是当访问b.demo.com时,其获取的值还是a.demo.com,导致代码中的判断出现错误。_nginxservername多个域名
文章浏览阅读1k次,点赞2次,收藏5次。采用YAML manifest的方式来安装ingress-nginx,用registry.lank8s.cn镜像库来替换 registry.k8s.io的库。_ingress-nginx安装
文章浏览阅读1.6k次,点赞2次,收藏2次。在windows平台编译nginx_windows 编译nginx
文章浏览阅读5.8k次,点赞2次,收藏18次。nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应。使用epoll and kqueue作为开发模型。_nginx
文章浏览阅读2k次。Linux启动(systemctl start nginx)nginx服务时出现:Failed to start nginx.service: Unit not found._为什么nginx的systemctl start nginx.service不能使用
文章浏览阅读1.3k次。重启之后,打开浏览器,输入http://localhost:8900/myBaidu,这时候就会自动的跳转到百度的页面。按照我们不同的需求修改nginx文件夹中的nginx-1.16.1conf里面的nginx.conf文件。启动nginx:打开nginx的文件夹,然后双击nginx.exe文件,启动nginx。打开之后假设我们需要跳转到百度则在配置文件nginx.conf中的下面加上。1、打开任务管理器关闭nginx的进程。端口在配置文件的(下图)进行查看nginx端口。_nginx 代理百度
文章浏览阅读5.7k次,点赞5次,收藏3次。nginx重定向问题解决(rewrite or internal redirection cycle)_rewrite or internal redirection cycle while internally redirecting to "/inde
文章浏览阅读1.3k次。请注意,上述命令假设 Nginx 已经在系统的 PATH 环境变量中配置。如果没有,请提供正确的 Nginx 安装路径,或者在命令中使用完整的路径来替换。将该命令与所有 Nginx 进程的 PID 一起使用,以终止所有正在运行的 Nginx 进程。此命令将启动一个新的 Nginx 进程来重新加载配置文件并重新启动服务器。使用以下命令来终止所有 Nginx 进程(使用上面的 PID 替换。的进程以及它们的 PID。打开命令提示符(CMD)。此命令将列出所有名为。选项来强制终止进程。_windows 怎么关闭nginx
文章浏览阅读2.7k次,点赞2次,收藏7次。包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。_ubuntu安装nginx
文章浏览阅读915次。轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。_nginx 短链代理
文章浏览阅读1.1k次,点赞35次,收藏24次。流媒体方案之Nginx——实现物联网视频监控项目Nginx是什么Nginx在流媒体方案中的位置软硬件准备移植编译Nginx运行Ngnix测试流媒体方案浏览器播放_nginx-rtmp-module
文章浏览阅读1.9k次。nginx 配置 wss 协议转发 ws 服务器_nginx 配置wss