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

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单机并发内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx+Lua+Redis构建高并发Web应用

    本文介绍如何用Nginx+Lua+Redis来构建高并发Web应用,Curl请求Nginx,Nginx通过Lua查询Redis,返回json数据. 一.安装1.安装lua-redis-parser 复制代码 代码如下: #git clone https://github.com/agentzh/lua-redis-parser.git #export LUA_INCLUDE_DIR=/usr/include/lua5.1 #make CC=gcc #make install CC=gcc 2.安

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

    nginx是我们最常用的服务器,常用于做内容分发和反向代理,lua是一种类C的脚本语言,广泛应用于游戏行业,十年前页游流行的时候,我曾经买过传奇类游戏的源码,游戏中的服务端就是用lua实现的.我们常用来配合nginx.envoy和redis做一些简单实用的功能,比如:超卖和少卖.排行榜等,减少请求到达后端java的频率 下面开始构建nginx+lua的镜像,自己构建的原因是怕别人提供的镜像里有病毒,docker非官方镜像中有很多病毒,这一点大家需要注意 本文采用openresty版本的nginx

  • 在Debian11上安装Openresty服务(Nginx+Lua)的详细教程

    目录 Debian 更新系统 添加 openresty 仓库 查看安装的版本: 参考链接 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.Web 服务和动态网关. OpenResty 官方 APT 包仓库提供了 deb 包 (适用于 Ubuntu 和 Debian),可以很方便的安装,一起来看下具体的安装步骤吧. Debian 更新系统

  • Nginx+lua 实现调用.so文件

    最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表,根据一定的算法计算出具体的商场,并将商场ID和beason设备列表作为参数,调用.so文件中的计算方法,得出位置数据(坐标:x.y.z),返回给手机端. 因为服务对QPS要求比较高,并且都是纯查询操作,于是决定使用Nginx+lua+Redis的架构(该架构在公司内部已成主流,比较成熟).下面我将对lua调用.so文件的方式,做一下介绍. lua调用.so文件,主要有两种方式: 1.Lua直接调用动态链

  • 安装Nginx+Lua开发环境

    首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用.借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序.而且OpenResty提供了大量组件如Mysql.Redis.Memcached等等,使在Nginx上开发Web应用更方便更简单.目前在京东如实时价格.秒杀.动态服务.单品页.列表页等都在使用Nginx+Lua架构,其他公司如淘宝.去哪儿网等. 安装环境

  • 解决nginx+lua搭建文件上传下载服务问题

    导语 项目需要做一个文件上传下载服务,利用 nginx+lua 做一个代理服务,上传入口统一,分发到不同的机器存储,下载链接和物理存储隔离,支持添加 agent 的方式扩容,这里主要讲一下思路和搭建配置过程,大神勿喷. 主要逻辑 上传 前端请求 nginx 服务, nginx 调用 upload 脚本,脚本通过查找配置,找到对应的逻辑存储路径和物理存储机器的 agent 的 ip 和端口,通过 tcp 发包到对应 agent ,部署在对应机器的 agent 接受数据,并写到本地文件. 下载 ht

  • linux系统安装Nginx Lua环境

    亦可参考官方安装指南: lua-nginx-module Installation 这是我总结的安装,供参考: 需要最新版的Nginx,LuaJIT,ngx_devel_kit,lua-nginx-module等安装文件: Nginx LuaJIT Lua或者LuaJIT都是可以的,但是出于性能的考虑,推荐安装LuaJIT ngx_devel_kit lua-nginx-module 参考命令下载: $ curl -O http://nginx.org/download/nginx-1.10.1

  • 利用nginx+lua+redis实现反向代理方法教程

    前言 最近因为工作需要,要进行IVR的重构, 我们现在系统接了三家IVR服务商, N个业务, 由于IVR这玩意一般只能外网回调, 而开发环境又不允许外网随便访问, 着实烦人. 所有我们打算重构一把, 封装多家IVR, 对业务透明, 同时回调可以针对多家IVR服务商的不同callid直接转发到当时请求的同学的 开发域名去. 而不同的IVR服务商的callid参数是不同的,有的是在url里面(call_id), 有的则是直接post的json数据(callid), 所以太扯了. 直接用lua处理下,

  • nginx lua集成kafka的实现方法

    第一步:进入opresty目录 [root@node03 openresty]# cd /export/servers/openresty/ [root@node03 openresty]# ll total 356 drwxr-xr-x 2 root root 4096 Jul 26 11:33 bin drwxrwxr-x 44 1000 1000 4096 Jul 26 11:31 build drwxrwxr-x 43 1000 1000 4096 Nov 13 2017 bundle

  • docker Nginx PHP-FPM单机多站点布署的方法

    网上尝试过各种方法,处理单机中单NGINX容器,单PHP-FPM容器布署多站点,均无法成功. 经过反思总结,目前共实施两种方法成功: 单Nginx,多PHP-FPM 单Nginx,单PHP-FPM 单Nginx,多PHP-FPM docker-compose.yml version: '2' services: nginx-1.15.1: image: nginx:laster ports: - "80:80" volumes: - ./htdocs:/usr/local/nginx/

随机推荐