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配置SSL证书出错解决方案
Mar 31 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
nginx限制并发连接请求数的方法
Apr 01 Servers
apache基于端口创建虚拟主机的示例
Apr 22 Servers
nginx中proxy_pass各种用法详解
Nov 07 Servers
Nginx源码编译安装过程记录
Nov 17 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
详解Nginx的超时keeplive_timeout配置步骤
May 25 Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 Servers
Nginx开源可视化配置工具NginxConfig使用教程
Jun 21 Servers
git stash(储藏)的用法总结
Jun 25 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 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
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python用input输入列表的实例代码
2020/02/07 Python
python实现简单颜色识别程序
2020/02/19 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
const和static readonly区别
2013/05/20 面试题
终端业务员岗位职责
2013/11/27 职场文书
测绘工程系学生的自我评价
2013/11/30 职场文书
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
教师评优事迹材料
2014/01/10 职场文书
个人党性分析材料
2014/12/19 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js