0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么用OpenResty搭建高性能服务端

马哥Linux运维 来源:博客园 作者:smileyqp 2021-06-16 09:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Socket编程

Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select、poll、epoll是Linux API提供的I/O复用方式,自从Linux2.6中加入了epoll之后,高性能服务器领域得到广泛的应用,Nignx就是使用epoll来实现I/O复用支持高并发。

对于“高性能”服务端而言,我们所关注的并不是语言的性能,而是缓存和语言支持异步非阻塞。

缓存

针对缓存要明白通信速度的快慢顺序

内存》SSD机械磁盘

本机》网络

进程内 》 进程间

缓存系统的目标是希望在进程内的命中率是最高的,那么此时缓存系统整体的效率也是最高的。

异步非阻塞

希望访问数据库、访问网络,访问一些比较慢的IO设备时,不要在等待上耗费大量时间。而是使用事件驱动的方式,当系统完成某项任务后再来通知我们。这样就可以将服务器CPU的空闲资源,用来服务客户端连接。

OpenResty

OpenResty是基于Ngnix和Lua的高性能web平台,内部集成精良的LUa库、第三方模块、依赖项。用于方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。可以使用Lua脚本调用Ngnix支持的C以及Lua模块,快速构建10K~1000K单机并发连接的高性能web应用系统。OpenResty的目标是让web服务直接运行在Nginx服务内部,利用Ngnix的非阻塞IO模型,对HTTP客户端请求和后端DB进行一致的高性能响应。

OpenResty的出现可以说是颠覆了高性能服务端的开发模式。OpenResty实际上是Nginx+LuaJIT的完美组合。

65bc9f9a-cc67-11eb-9e57-12bb97331649.png

OpenResty工作方式

由于Nginx采用的是master-worker模型,也就是一个master主进程管理多个worker进程,基本的事件处理都是放在worker中,master仅负责一些全剧初始化,以及对worker的管理。在OpenResty中,每个worker使用一个LuaVM,每个请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程。协程之间数据隔离,每个协程具有独立的全局变量_G。

Lua中的协程和多线程下的线程类似,都有自己的堆栈、局部变量、指令指针。。。,但是和其他协程程序共享全局变量等信息。线程和协程主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。

根据实际测试,OpenResty性能接近于Nginx 性能之王c module,甚至超过。

OpenResty 架构

负载均衡

LVS+HAProxy将流量转发给核心Nginx1和Nginx2,即实现了流量的负载均衡。

单机闭环

所有想要的数据都能从本服务器直接获取,大多数时候无需通过网络或去其他服务器获取。

分布式闭环

单机闭环会遇到2个主要问题

1.数据不一致

例如没有主从架构导致不同服务器数据不一致

2.遇到存储瓶颈

磁盘或内存遇到天花板

解决数据不一致比较好的办法是采用主从或分布式集中存储,而遇到存储瓶颈就需要进行按业务键进行分片,将数据分散到多台服务器。

接入网关

接入网关又叫接入层,即接收流量的入口,在入口处做如下事情:

65fa836e-cc67-11eb-9e57-12bb97331649.png

接入网关

OpenResty环境搭建

http://openresty.org

http://openresty.org/cn/download.html

安装前准备,必须安装perl、libpcre、libssl库。

# 从系统路径中查看必备库是否已经安装

$ sudo ldconfig -v

# 安装必备库

$ sudo apt install libpcre3-dev libssl-dev perl make build-essential curl libreadline-dev libncurses5-dev

下载并解压OpenResty后进入其目录

$ wget https://openresty.org/download/ngx_openresty-1.13.6.1.tar.gz

$ tar -zxvf ngx_openresty-1.13.6.1.tar.gz

$ mv openresty-1.13.6.1 openresty

$ cd openresty

$ 。/configure

默认会被安装到/usr/local/openresty目录下

# 编译并安装

$ sudo make && make install

$ cd /usr/local/openresty

启动Nginx

$ sudo /usr/local/openresty/nginx/sbin/nginx

$ ps -ef | grep nginx

$ service nginx status

Nginx启动若出现

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] still could not bind()

说明80端口并占用,查看80端口被占用的端口并重启。原因在于nginx先监听了ipv4的80端口之后又监听了ipv6的80端口,于是就重复占用了。

$ sudo netstat -ntlp | grep 80

$ sudo killall -9 nginx

重新编辑Nginx配置文件

$ sudo vim /etc/nginx/conf/nginx.conf

listen 80;

listen [::]:80 ipv6only=on default_server;

使用curl工具或在浏览器访问默认80端口

$ curl 127.0.0.1

浏览器输入http://127.0.0.1/

将Nginx工具配置到当前用户的系统环境变量中

$ sudo vim ~/.bashrc

export PATH=$PATH:/usr/local/openresty/nginx/sbin

$ source ~。/bashrc

$ cd ~

$ nginx -s reload

nginx: [alert] kill(12267, 1) failed (1: Operation not permitted)

开发文档

https://www.nginx.com/resources/wiki/modules/lua/

ubuntu 安装 vcode 或 sublime text 编辑器

content_by_lua

$ vim /usr/local/openresty/nginx/conf/nginx.conf

location /test {

default_type text/html;

content_by_lua ‘ngx.say(“hello openresty”)’;

}

# 重启Nginx

$ /usr/local/openresty/nginx/sbin/nginx -s reload

# 浏览器访问 127.0.0.1/test

content_by_lua_file

$ vim nginx.conf

location /test {

content_by_lua_file ‘html/test.lua’;

}

$ vim 。。/html/test.lua

ngx.say(“hello lua”)

$ sudo /usr/local/nginx/sbin/nginx -s reload

$ curl 127.0.0.1/test

hello lua

为避免每次修改都需要重启Nginx,可在Nginx的server选项中配置lua_code_cache选项。

$ vim nginx.conf

server{

lua_code_cache off;

location /test{

content_by_lua_file ‘html/test.lua’;

}

}

$ sudo /usr/local/openresty/nginx/sbin/nginx -s reload

nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:48

注意lua_code_cache off;是会引擎Nginx的性能的,在生产环境中是需要将其开启的。

小节

在OpenResty中开发是分为两步的,第一步是修改Nginx配置,第二步是使用Lua开发自己的脚本。

OpenResty入门

参考资料

OpenResty最佳实践

Nginx Lua

创建工作目录

OpenResty安装之后就有配置文件及相关目录,为了工作目录和安装目录互不干扰,另外创建OpenResty工作目录,并另写配置。

$ mkdir -p ~/openresty/test/logs ~/openresty/test/conf

$ vim ~/openresty/test/conf/nginx.conf

# 设置Nginx worker工作进程数量,即CPU核数。

worker_processes 1;

# 设置错误日志文件路径

error_log logs/error.log;

# 配置Nginx服务器与用户的网络连接

events{

# 设置每个工作进程的最大连接数

worker_connections 10224;

}

http{

# 虚拟机主机块定义

server{

# 监听端口

listen 8001;

# 配置请求的路由

location /{

default_type text/html;

content_by_lua_block{

ngx.say(“hello world”);

}

}

}

}

$ nginx -p ~/openresty/test

$ curl 127.0.0.1:8001

hello world

$ vim nginx.conf

location /test{

content_by_lua_file “lua/test.lua”;

}

$ cd 。。 && mkdir lua && cd lua

$ vim test.lua

local args = ngx.req.get_uri_args()

local salt = args.salt

if not salt then

ngx.exit(ngx.HTTP_BAD_REQUEST)

end

local md5str = ngx.md5(ngx.time()。.salt)

ngx.say(md5str)

$ sudo /usr/local/openresty/nginx/sbin/nginx -s reload

$ curl -i 127.0.0.1/test?salt=lua

HTTP/1.1 200 OK

Server: openresty/1.13.6.2

Date: Sun, 27 Jan 2019 1017 GMT

Content-Type: application/octet-stream

Transfer-Encoding: chunked

Connection: keep-alive

b55b77f75e46b96b11778ca7edfe8d55

若代码中出现错误则需要直接查看Nginx的错误日志进行查看

$ vim nginx/logs/error.log

2019/01/27 1715 [error] 15764#0: *6 failed to load external Lua file “/usr/local/openresty/nginx/test.lua”: cannot open /usr/local/openresty/nginx/test.lua: No such file or.。。

Windows系统下查看Nginx进程

λ tasklist /fi “imagename eq nginx.exe”

映像名称 PID 会话名 会话# 内存使用

========================= ======== ================ =========== ============

nginx.exe 9072 Console 1 7,840 K

nginx.exe 7692 Console 1 12,304 K

nginx.exe 8120 Console 1 7,840 K

nginx.exe 4552 Console 1 12,188 K

nginx.exe 9588 Console 1 7,828 K

nginx.exe 6256 Console 1 12,216 K

nginx.exe 7308 Console 1 7,828 K

nginx.exe 10192 Console 1 12,212 K

λ taskkill /im nginx.exe /f

成功: 已终止进程 “nginx.exe”,其 PID 为 9072。

ngx lua API

参考资料

NGINX API for Lua

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11817

    浏览量

    219535
  • 服务器
    +关注

    关注

    14

    文章

    10357

    浏览量

    91751
  • API
    API
    +关注

    关注

    2

    文章

    2475

    浏览量

    67011
  • SSD
    SSD
    +关注

    关注

    21

    文章

    3150

    浏览量

    122605

原文标题:OpenResty搭建高性能服务端

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索TRF1213:高性能转差分RF放大器的卓越之选

    探索TRF1213:高性能转差分RF放大器的卓越之选 在当今的射频(RF)和中频(IF)应用领域,对于高性能放大器的需求日益增长。德州仪器(TI)推出的TRF1213单转差分RF
    的头像 发表于 01-26 09:35 313次阅读

    零基础入门:libfota2实现第三方服务器FOTA升级服务

     即使你是FOTA新手,也能通过本教程掌握远程固件升级的核心实现。我们以libfota2为客户核心,结合自建第三方服务器,提供一份零基础可上手的完整FOTA服务搭建指南。从
    的头像 发表于 01-19 18:35 205次阅读
    零基础入门:<b class='flag-5'>用</b>libfota2实现第三方<b class='flag-5'>服务</b>器FOTA升级<b class='flag-5'>服务</b>

    FOTA升级全流程教学:基于libfota2与第三方服务搭建

    远程固件升级不再是大厂专属,借助libfota2,你也可以为自己的设备搭建私有FOTA系统。本文将“手把手”带你完成从服务端搭建、固件包发布到设备升级响应的完整流程。所有环节均基于第
    的头像 发表于 01-19 18:35 500次阅读
    FOTA升级全流程教学:基于libfota2与第三方<b class='flag-5'>服务</b>器<b class='flag-5'>搭建</b>

    OPC UA 服务端用户认证的底层逻辑:哈希与加盐应用详解

    摘要在基于UnifiedAutomationSDK开发OPCUA服务端时,用户认证(UserAuthentication)是安全体系的第一道防线。除了传输层的加密通道外,服务端如何安全地存储和验证
    的头像 发表于 01-15 17:29 280次阅读
    OPC UA <b class='flag-5'>服务端</b>用户认证的底层逻辑:哈希与加盐应用详解

    20个常用服务端口及对应服务信息

    (1) 端口号:21 服务名称:FTP 服务描述:文件传输协议,用于在客户服务器之间传输文件。 (2) 端口号:22 服务名称::SS
    发表于 12-03 06:07

    推荐高性能存储psram芯片

    智能穿戴、物联网设备和侧AI应用快速发展,PSRAM伪静态随机存储器,正成为越来越多嵌入式系统的优选方案,如何选择一个高性能、小尺寸与低功耗的psram芯片是一个值得思考的问题。由EMI自主研发
    的头像 发表于 11-18 17:24 682次阅读

    飞凌嵌入式ElfBoard-常用的网络服务搭建之SSH服务搭建

    器;2)SSH默认端口是22号端口,安全协议版本SSHv2,出了SSHv2版本之外还有SSHv1版本(有漏洞,不安全);3)SSH服务端主要包含两个服务功能SSH远程连接和SFTP服务;4)Linux
    发表于 10-24 08:48

    飞凌嵌入式ElfBoard-常用的网络服务搭建之TFTP服务搭建

    ,还需要在主机安装TFTP服务端,可以在 Linux系统下实现,也可以在Windows系统下实现,下面在Linux(ubuntu)系统下安装TFTP服务端进行测试。 1.安装服务器、客户
    发表于 10-21 11:29

    致远电子EM-1000高性能嵌入式工控机,轻松实现Modbus客户到IEC61850服务端的协议转换。

    工控机电机驱动
    ZLG致远电子
    发布于 :2025年09月27日 16:33:49

    【上海晶珩睿莓1开发板试用体验】5、网络性能测试

    定的结果、JSON 输出(便于脚本化)以及更好的单次测试控制。 主要用途: 测量点对点带宽(客户服务端) 测试不同协议(TCP/UDP)的吞吐量与丢包情况 验证链路质量、MTU/窗口大小对性能
    发表于 08-19 10:25

    多台IR615如何通过vpn进行远程管理?

    现有多台IR615路由器,希望将其配置为vpn客户,连接云服务器的vpn服务端 工程师远程连接云服务器对IR615进行管理 在IR615中可以选用哪种vpn协议?如何进行配置?
    发表于 08-06 07:21

    恒讯科技分析:云储存服务搭建教程

    搭建云存储服务器是一个相对复杂但极具实用性的项目,以下是一个简化的搭建教程,帮助你快速入门。 一、明确需求 在搭建云存储服务器之前,首先需要
    的头像 发表于 07-07 11:07 1466次阅读

    使用树莓派构建 Slurm 高性能计算集群:分步指南!

    的实践经验,并了解了它们是如何协同工作的。设置SLURM组件确实是其中的主要部分,经过一番研究,我终于成功搭建了自己的高性能计算集群。由于设置这台机器非常简单,因
    的头像 发表于 06-17 16:27 1957次阅读
    使用树莓派构建 Slurm <b class='flag-5'>高性能</b>计算集群:分步指南!

    labview opc ua 读取客户数据

    请教各位大神,在电脑上,自带OPC读取OPCUA服务端数据是OK的,但是自己写程序读取就读不到,报错了,请教一下,节点路径怎么写,非常感谢
    发表于 06-02 12:01

    不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯

    智能网关IGT-DSER支持POST/GET/PUT等多种方法,可同时作为HTTP协议的客户服务端。作为客户通讯时将JSON文件提交给HTTP的服务端, 如果
    的头像 发表于 05-13 14:40 1400次阅读
    不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯