Ubuntu下OpenResty搭建高性能服务端
来自:简书,作者:JunChow520
链接:https://www.jianshu.com/p/09c17230e1ae
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的完美组合。
由于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.遇到存储瓶颈 磁盘或内存遇到天花板
解决数据不一致比较好的办法是采用主从或分布式集中存储,而遇到存储瓶颈就需要进行按业务键进行分片,将数据分散到多台服务器。
接入网关
接入网关又叫接入层,即接收流量的入口,在入口处做如下事情:
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.conflisten 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的性能的,在生产环境中是需要将其开启的。
Ubuntu下OpenResty搭建高性能服务端相关推荐
- Ubuntu下OpenResty 搭建高性能服务端
Socke 介绍 Linux Socket 编程领域为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用,select.poll.epoll 是 Linux API 提供的 I/O 复用方式,自从 ...
- OpenResty搭建高性能服务端
Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...
- 25服务端_手把手教你使用 OpenResty 搭建高性能服务端!
点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 来源:https://www.jianshu.com/p/09c17230e1a ...
- 【小卒ubuntu使用第六篇】ubuntu下如何搭建远程控制服务(包括命令行方式的ssh局域网搭建、和图形化界面的teamviewer和anydesk工具的安装使用)
最近由于实验室技术需要,组建网络服务,刚开始只是局限于局域网下,所以只采用ssh就足够了,连接同一个局域网,分布式控制机器合作,比较简单,但是后来主机天天携带不方便,就需要穿网的服务,经过自己的摸索和 ...
- 如何在 MacOS 环境下搭建 SVN 服务端环境
文章目录 在服务端创建资源仓库 资源仓库访问权限配置 给资源仓库添加用户 配置用户组及用户的权限 启动 SVN 服务器 停止 SVN 服务器 SVN 是一个使用十分广泛的开放源代码的版本控制系统.在 ...
- Debian 搭建 WireGuard 服务端
CONTENTS 1. 准备工作 2. 安装 WireGuard 3. 配置服务端 4. 客户端配置 5. 服务端再配置 6. References 本文以 Debian 10 为例,介绍如何搭建 W ...
- 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器
非零基础自学Golang 文章目录 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器 第18章 H ...
- ubuntu下git搭建服务器(gitosis)
ubuntu下git搭建服务器(gitosis) - 简书 var _hmt = _hmt || []; (function() { var hm = document.createElement(& ...
- HTML+JS+websocket 实现联机“游戏王”对战(十)- 搭建游戏服务端
目录: 游戏王联机卡牌对战 1 - 前言 游戏王联机卡牌对战 2 - 联机模式 游戏王联机卡牌对战 3 - 界面布局 游戏王联机卡牌对战 4 - 卡组系统 游戏王联机卡牌对战 5 - 卡片选中系统 游 ...
最新文章
- jira 配置自签SSL证书windowsAD域
- Ways to 优化JAVA程序设计和编码,提高JAVA性能
- Androidの多线程之更新ui(AsyncTask)
- 图像基本群运算--滤波
- java必会的英语单词
- 【CAM应用】谈CAM软件在实际生产中的应用举例
- python中的sys模块和os_python中os和sys模块的区别与常用方法总结
- Reflect Refract (以水渲染为例)
- Halcon教程七:简单的回形针识别案例
- 旅游系统(SSM框架 结构+效果图)
- 多通道振弦传感器VTN416采集仪应用工程项目安全监测实用性强
- RAP2 详细部署、操作指南
- node学习之Events和EventEmitter
- 解决精灵标注助手暂不支持导入pascal文件
- 边云协同的优点_探析云边协同的九大应用场景
- 1.7-秩和相关关系
- 在职研究生计算机专业好考么,湖南在职研究生计算机专业好考不
- NPDP产品经理小知识:黄金圈法则
- vscode c#代码格式化
- 深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念