nginx+lua单机上万并发的实现


Posted in Servers onMay 31, 2021

nginx是我们最常用的服务器,常用于做内容分发和反向代理,lua是一种类C的脚本语言,广泛应用于游戏行业,十年前页游流行的时候,我曾经买过传奇类游戏的源码,游戏中的服务端就是用lua实现的。我们常用来配合nginx、envoy和redis做一些简单实用的功能,比如:超卖和少卖、排行榜等,减少请求到达后端java的频率

下面开始构建nginx+lua的镜像,自己构建的原因是怕别人提供的镜像里有病毒,docker非官方镜像中有很多病毒,这一点大家需要注意

本文采用openresty版本的nginx,具体openresty、nginx和lua的说明大家可以百度一下

构建镜像之前需要先准备好nginx-module-vts模块和openresty-1.15.8.3的压缩包,这两个压缩包百度一下就能找到,我也不知道公众号文章能不能插外链,其中nginx-module-vts这个模块的作用是统计nginx的访问数据,如果自己用prometheus+grafana监控nginx,就需要安装这个模块,我们索性一起编译进来

在服务器上创建目录

cd /usr/local/docker
mkdir -p nginx-lua/build
cd nginx-lua

搭建好之后的完整目录如下:

root@today2:/usr/local/docker/nginx-lua# tree
.
├── build
│   ├── Dockerfile
│   ├── nginx-module-vts.zip
│   └── openresty-1.15.8.3.tar.gz
├── docker-compose.yml
├── lua
│   ├── test.lua
├── nginx.conf
├── wwwroot
│   ├── index.html

Dockerfile

Dockerfile文件放到build目录下,把下载好的nginx-module-vts.zip和openresty-1.15.8.3.tar.gz也放到build目录下

FROM ubuntu:xenial

# 更新数据源
WORKDIR /etc/apt
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> sources.list
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> sources.list
RUN apt-get update

# 安装依赖
RUN apt-get install unzip make gcc libpcre3-dev libssl-dev perl build-essential curl zlib1g-dev --assume-yes

# 复制工具包
ADD openresty-1.15.8.3.tar.gz /usr/local/src
ADD nginx-module-vts.zip /usr/local/src

# nginx-module-vts
WORKDIR /usr/local/src
RUN unzip nginx-module-vts.zip

WORKDIR /usr/local/src/openresty-1.15.8.3
RUN rm -rf ./Makefile
RUN ./configure --add-module=/usr/local/src/nginx-module-vts
RUN make && make install

# 配置 Nginx,注释掉,在启动容器时挂载到容器中
# ADD nginx.conf /usr/local/openresty/nginx/conf/

WORKDIR /
EXPOSE 80
CMD ["/usr/local/openresty/nginx/sbin/nginx", "-c", "/usr/local/openresty/nginx/conf/nginx.conf", "-g", "daemon off;"]

nginx.conf

user root;
worker_processes  auto;

worker_rlimit_nofile 65535;

events {
 worker_connections  102400;
 use epoll;
}

http {
 server_tokens off;
 include mime.types;
 default_type application/octet-stream;

 #access_log /var/log/nginx/access.log;
 access_log off;
 error_log /var/log/nginx/error.log;

 keepalive_timeout  65;
 client_max_body_size 10m;
 
 gzip on;
 gzip_disable "msie6";
 gzip_min_length 1000;
 gzip_proxied expired no-cache no-store private auth;
 gzip_types text/plain application/xml application/javascript text/css application/x-javascript;

 # 下面3行是安装了nginx-module-vts模块后设置nginx流量统计,本文主要讲lua,所以下面3行可以注释掉
 vhost_traffic_status_zone;
 vhost_traffic_status_filter_by_host on;
 vhost_traffic_status_filter_by_set_key $uri uri::$server_name;

 server {
  listen 80;
  root /usr/share/nginx/html;

  # lua脚本是否开启缓存,在调试阶段设为off(修改lua文件后不用重启nginx),在正式环境一定要注释掉这一行,以提高性能
  lua_code_cache off;

  # 这个location是真正调用lua脚本的设置
  location /lua/test {
   # 指定返回的类型是json
   default_type 'application/json';
   # 指定访问/lua/test时由test.lua来返回内容,这个路径需要注意是容器中的路径,千万不要和宿主机搞混淆了
   content_by_lua_file '/usr/local/lua/test.lua';
  }

  # 也是流量统计,可以注释掉
  location /status {
   vhost_traffic_status_display;
   vhost_traffic_status_display_format html;
  }

 }
}

docker-compose.yml

version: '3.1'
services:
  nginx:
    build: build # 左边build指的是当前容器需要构建镜像,右边build表示构建镜像的文件在build这个目录下
    restart: always
    container_name: nginx
    network_mode: host # 不一定非要指定host模式,这里只是为了方便
    volumes:
      - ./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
      - ./log:/var/log/nginx/
      - ./wwwroot:/usr/share/nginx/html
      - ./lua:/usr/local/lua

test.lua

在./lua目录下创建test.lua文件

ngx.say('{"code": 1, "msg": "hello world!"}')

启动容器后,访问IP:80/lua/test就可以看到输出了{"code": 1, "msg": "hello world!"},说明lua脚本已经生效

至此nginx+lua已经搭建完毕,在以后的文章中会再介绍一些常用的lua脚本,如:JWT验证、操作Redis、消息队列等,可以实现很多功能,只要你能想到都可以实现

到此这篇关于nginx+lua单机上万并发的实现的文章就介绍到这了,更多相关nginx lua单机并发内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx反向代理多个服务器的实现方法
Mar 31 Servers
nginx location中多个if里面proxy_pass的方法
Mar 31 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
Apache Linkis 中间件架构及快速安装步骤
Mar 16 Servers
CentOS7和8下安装Maven3.8.4
Apr 07 Servers
Linux服务器离线安装 nginx的详细步骤
Jun 16 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
解决Git推送错误non-fast-forward的方法
Jun 25 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
Nginx文件已经存在全局反向代理问题排查记录
Jul 15 Servers
Shell中的单中括号和双中括号的用法详解
Dec 24 Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
Nginx配置Https安全认证的实现
May 26 #Servers
nginx部署多前端项目的几种方法
Nginx如何配置Http、Https、WS、WSS的方法步骤
May 11 #Servers
windows下快速安装nginx并配置开机自启动的方法
uwsgi+nginx代理Django无法访问静态资源的解决
May 10 #Servers
You might like
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python入门篇之字符串
2014/10/17 Python
python sort、sorted高级排序技巧
2014/11/21 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python实现批量修改文件名
2020/03/23 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
家长给小学生的评语
2014/01/30 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
实践单位评语
2014/04/26 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
企业消防安全责任书
2014/07/23 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
房地产项目合作意向书
2015/05/08 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python