来自:简书,作者: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搭建高性能服务端相关推荐

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

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

  2. OpenResty搭建高性能服务端

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

  3. 25服务端_手把手教你使用 OpenResty 搭建高性能服务端!

    点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 来源:https://www.jianshu.com/p/09c17230e1a ...

  4. 【小卒ubuntu使用第六篇】ubuntu下如何搭建远程控制服务(包括命令行方式的ssh局域网搭建、和图形化界面的teamviewer和anydesk工具的安装使用)

    最近由于实验室技术需要,组建网络服务,刚开始只是局限于局域网下,所以只采用ssh就足够了,连接同一个局域网,分布式控制机器合作,比较简单,但是后来主机天天携带不方便,就需要穿网的服务,经过自己的摸索和 ...

  5. 如何在 MacOS 环境下搭建 SVN 服务端环境

    文章目录 在服务端创建资源仓库 资源仓库访问权限配置 给资源仓库添加用户 配置用户组及用户的权限 启动 SVN 服务器 停止 SVN 服务器 SVN 是一个使用十分广泛的开放源代码的版本控制系统.在 ...

  6. Debian 搭建 WireGuard 服务端

    CONTENTS 1. 准备工作 2. 安装 WireGuard 3. 配置服务端 4. 客户端配置 5. 服务端再配置 6. References 本文以 Debian 10 为例,介绍如何搭建 W ...

  7. 非零基础自学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 ...

  8. ubuntu下git搭建服务器(gitosis)

    ubuntu下git搭建服务器(gitosis) - 简书 var _hmt = _hmt || []; (function() { var hm = document.createElement(& ...

  9. HTML+JS+websocket 实现联机“游戏王”对战(十)- 搭建游戏服务端

    目录: 游戏王联机卡牌对战 1 - 前言 游戏王联机卡牌对战 2 - 联机模式 游戏王联机卡牌对战 3 - 界面布局 游戏王联机卡牌对战 4 - 卡组系统 游戏王联机卡牌对战 5 - 卡片选中系统 游 ...

最新文章

  1. jira 配置自签SSL证书windowsAD域
  2. Ways to 优化JAVA程序设计和编码,提高JAVA性能
  3. Androidの多线程之更新ui(AsyncTask)
  4. 图像基本群运算--滤波
  5. java必会的英语单词
  6. 【CAM应用】谈CAM软件在实际生产中的应用举例
  7. python中的sys模块和os_python中os和sys模块的区别与常用方法总结
  8. Reflect Refract (以水渲染为例)
  9. Halcon教程七:简单的回形针识别案例
  10. 旅游系统(SSM框架 结构+效果图)
  11. 多通道振弦传感器VTN416采集仪应用工程项目安全监测实用性强
  12. RAP2 详细部署、操作指南
  13. node学习之Events和EventEmitter
  14. 解决精灵标注助手暂不支持导入pascal文件
  15. 边云协同的优点_探析云边协同的九大应用场景
  16. 1.7-秩和相关关系
  17. 在职研究生计算机专业好考么,湖南在职研究生计算机专业好考不
  18. NPDP产品经理小知识:黄金圈法则
  19. vscode c#代码格式化
  20. 深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念

热门文章

  1. 手撕深度学习框架,原理很简单
  2. 2017前端技术大盘点 1
  3. 关于virtual pc安装Redhat
  4. MySQL · 源码分析 · MySQL 半同步复制数据一致性分析
  5. CentOS6.5部署KVM及实现在线迁移
  6. java 数据结构之堆排序
  7. HTML5语义元素的使用
  8. Andriod UI设计之度量单位说明(DIP,DP,PX,SP)
  9. (oracle)八、表
  10. HelloDjango 第 02 篇:空空如也的博客应用