点击蓝色“架构文摘”关注我哟

加个“星标”,每天上午 09:25,干货推送!

来源:https://www.jianshu.com/p/09c17230e1a

Socket编程

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

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

缓存

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

  • 内存>SSD>机械磁盘

  • 本机>网络

  • 进程内>进程间

缓存系统的目标是希望在进程内的命中率是最高的,那么此时缓存系统整体的效率也是最高的。异步非阻塞希望访问数据库、访问网络,访问一些比较慢的IO设备时,不要在等待上耗费大量时间。而是使用事件驱动的方式,当系统完成某项任务后再来通知我们。这样就可以将服务器CPU的空闲资源,用来服务客户端连接。

异步非阻塞

希望访问数据库、访问网络,访问一些比较慢的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

安装前准备,必须安装perllibpcrelibssl库。

# 从系统路径中查看必备库是否已经安装$ sudo ldconfig -v

# 安装必备库$ sudo apt install libpcre3-dev libssl-dev perl make build-essential curl libreadline-dev libncurses5-dev

1.下载并解压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

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

# 编译并安装$ sudo make && make install$ cd /usr/local/openresty

3.启动Nginx

$ sudo /usr/local/openresty/nginx/sbin/nginx$ ps -ef | grep nginx$ service nginx status

4.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 ~/.bashrcexport PATH=$PATH:/usr/local/openresty/nginx/sbin$ source ~./bashrc$ cd ~$ nginx -s reloadnginx: [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.conflocation /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.conflocation /test {  content_by_lua_file 'html/test.lua';}$ vim ../html/test.luangx.say("hello lua")$ sudo /usr/local/nginx/sbin/nginx -s reload$ curl 127.0.0.1/testhello lua
lua_code_cache选项

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

$ vim nginx.confserver{  lua_code_cache off;  location /test{    content_by_lua_file 'html/test.lua';  }}$ sudo /usr/local/openresty/nginx/sbin/nginx -s reloadnginx: [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安装之后就有配置文件及相关目录,为了工作目录和安装目录互不干扰,另外创建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:8001hello world
$ vim nginx.conflocation /test{  content_by_lua_file "lua/test.lua";}$ cd .. && mkdir lua && cd lua$ vim test.lualocal args = ngx.req.get_uri_args()local salt = args.saltif not salt then  ngx.exit(ngx.HTTP_BAD_REQUEST)endlocal 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=luaHTTP/1.1 200 OKServer: openresty/1.13.6.2Date: Sun, 27 Jan 2019 10:07:17 GMTContent-Type: application/octet-streamTransfer-Encoding: chunkedConnection: keep-alive

b55b77f75e46b96b11778ca7edfe8d55

查看Nginx的错误日志

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

$ vim nginx/logs/error.log2019/01/27 17:37:15 [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 Knginx.exe                     7692 Console                    1     12,304 Knginx.exe                     8120 Console                    1      7,840 Knginx.exe                     4552 Console                    1     12,188 Knginx.exe                     9588 Console                    1      7,828 Knginx.exe                     6256 Console                    1     12,216 Knginx.exe                     7308 Console                    1      7,828 Knginx.exe                    10192 Console                    1     12,212 K

λ taskkill /im nginx.exe /f成功: 已终止进程 "nginx.exe",其 PID 为 9072。

end

推荐阅读:

  • JAVA 线上故障排查指南!

  • 总结三种 MySQL 大表优化方案

  • 面试官:RocketMQ 消息会丢失吗?如何解决消息丢失!!

  • 100000 行级别数据的 Excel 导入优化之路

  • 用图讲解 ElasticSearch 搜索原理,你就明白了!

如有收获,点个在看,诚挚感谢

25服务端_手把手教你使用 OpenResty 搭建高性能服务端!相关推荐

  1. OpenResty搭建高性能服务端

    Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...

  2. Ubuntu下OpenResty 搭建高性能服务端

    Socke 介绍 Linux Socket 编程领域为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用,select.poll.epoll 是 Linux API 提供的 I/O 复用方式,自从 ...

  3. Ubuntu下OpenResty搭建高性能服务端

    来自:简书,作者:JunChow520 链接:https://www.jianshu.com/p/09c17230e1ae Socket编程 Linux Socket编程领域为了处理大量连接请求场景, ...

  4. python做一个问答系统_手把手教你用Python搭建一个AI智能问答系统

    导读:智能问答系统是自然语言处理的一个重要分支.今天我们将利用分词处理以及搜索引擎搭建一个智能问答系统. 本文经授权转自公众号CSDN(ID:CSDNnews) 作者:李秋键 具体的效果如下所示: 下 ...

  5. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

  6. 手把手教你使用 VuePress 搭建个人博客

    手把手教你使用 VuePress 搭建个人博客 有阅读障碍的同学,可以跳过第一至四节,下载我写好的工具包: git clone https://github.com/zhangyunchencc/vu ...

  7. 手把手教你用owncloud搭建属于自己的云盘

    https://www.jianshu.com/p/6e0be77b688e 手把手教你用owncloud搭建属于自己的云盘 owncloud是一个开源的云盘解决方案,我们可以用owncloud快速地 ...

  8. 手把手教你用vuepress搭建自己的网站(2)

    虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...

  9. 方言听不懂,手把手教你用 Milvus 搭建方言翻译器!

    坐在上海的公交车上,我有时会遇到这样的烦恼:稍一分神,没能听见普通话报站,支棱起耳朵,却听不懂沪语报站.为了解决这个问题,我决定--学习沪语?No, 作为一名数据工程师,我索性搭建了一个方言翻译器,帮 ...

最新文章

  1. 论5级流水32bit risc cpu设计
  2. Open***2.4.3 基于用户名密码验证方式(实战)
  3. C++ >>和<<读写文本文件
  4. MySQL 8.0 技术详解
  5. WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manua
  6. 分享几个病毒分析检测网址
  7. 【codevs3110】一把鼻涕一把泪的堆排序
  8. 用python进行GUI开发的选择
  9. python pyqt5教程pdf_PyQt5中文手册
  10. 在Android Studio 中使用Assets资源文件
  11. 【181214】VC++动画翻页效果的电话簿程序源代码
  12. 再抱一抱DataStore
  13. 软件架构——系统分析员、系统架构师、项目经理的区别
  14. PUM-main makefile报错 #2
  15. Larval Excel导入
  16. 蓝宇数码冲刺深交所:年营收2.72亿 郭振荣控制45%股权
  17. c3p0plugin mysql,四十八、5.12 多数据源支持
  18. 视频监控系统由哪几部分组成?(视频监控入门基础-附思维导图)
  19. 3D模型欣赏:强肌肉男的壮汉3d角色 肉跟血管的纹理材质超级写实
  20. 【springboot】实现阿里云视频点播上传视频

热门文章

  1. LeetCode 111. Minimum Depth of Binary Tree (二叉树最小的深度)
  2. Linux系统网络性能实例分析
  3. ImageMagick---import(截图)
  4. zabbix监控TCP连接状态
  5. RHEL7 运行级别简介及切换操作
  6. 教你在Zabbix环境下快速升级nginx版本!
  7. 如果估算IT的测试Pattern数
  8. 力扣题目——103. 二叉树的锯齿形层序遍历
  9. 学html需要什么软件,在上海学html需要学什么软件?
  10. Android模拟神器Genymotion eclipse插件安装问题出解决