经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Lua » 查看文章
nginx+lua单机上万并发的实现
来源:jb51  时间:2021/5/31 10:59:05  对本文有异议

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,就需要安装这个模块,我们索性一起编译进来

在服务器上创建目录

  1. cd /usr/local/docker
  2. mkdir -p nginx-lua/build
  3. cd nginx-lua

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

  1. root@today2:/usr/local/docker/nginx-lua# tree
  2. .
  3. ├── build
  4. ├── Dockerfile
  5. ├── nginx-module-vts.zip
  6. └── openresty-1.15.8.3.tar.gz
  7. ├── docker-compose.yml
  8. ├── lua
  9. ├── test.lua
  10. ├── nginx.conf
  11. ├── wwwroot
  12. ├── index.html

Dockerfile

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

  1. FROM ubuntu:xenial
  2.  
  3. # 更新数据源
  4. WORKDIR /etc/apt
  5. RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > sources.list
  6. RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> sources.list
  7. RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> sources.list
  8. RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> sources.list
  9. RUN apt-get update
  10.  
  11. # 安装依赖
  12. RUN apt-get install unzip make gcc libpcre3-dev libssl-dev perl build-essential curl zlib1g-dev --assume-yes
  13.  
  14. # 复制工具包
  15. ADD openresty-1.15.8.3.tar.gz /usr/local/src
  16. ADD nginx-module-vts.zip /usr/local/src
  17.  
  18. # nginx-module-vts
  19. WORKDIR /usr/local/src
  20. RUN unzip nginx-module-vts.zip
  21.  
  22. WORKDIR /usr/local/src/openresty-1.15.8.3
  23. RUN rm -rf ./Makefile
  24. RUN ./configure --add-module=/usr/local/src/nginx-module-vts
  25. RUN make && make install
  26.  
  27. # 配置 Nginx,注释掉,在启动容器时挂载到容器中
  28. # ADD nginx.conf /usr/local/openresty/nginx/conf/
  29.  
  30. WORKDIR /
  31. EXPOSE 80
  32. CMD ["/usr/local/openresty/nginx/sbin/nginx", "-c", "/usr/local/openresty/nginx/conf/nginx.conf", "-g", "daemon off;"]
  33.  

nginx.conf

  1. user root;
  2. worker_processes auto;
  3.  
  4. worker_rlimit_nofile 65535;
  5.  
  6. events {
  7. worker_connections 102400;
  8. use epoll;
  9. }
  10.  
  11. http {
  12. server_tokens off;
  13. include mime.types;
  14. default_type application/octet-stream;
  15.  
  16. #access_log /var/log/nginx/access.log;
  17. access_log off;
  18. error_log /var/log/nginx/error.log;
  19.  
  20. keepalive_timeout 65;
  21. client_max_body_size 10m;
  22. gzip on;
  23. gzip_disable "msie6";
  24. gzip_min_length 1000;
  25. gzip_proxied expired no-cache no-store private auth;
  26. gzip_types text/plain application/xml application/javascript text/css application/x-javascript;
  27.  
  28. # 下面3行是安装了nginx-module-vts模块后设置nginx流量统计,本文主要讲lua,所以下面3行可以注释掉
  29. vhost_traffic_status_zone;
  30. vhost_traffic_status_filter_by_host on;
  31. vhost_traffic_status_filter_by_set_key $uri uri::$server_name;
  32.  
  33. server {
  34. listen 80;
  35. root /usr/share/nginx/html;
  36.  
  37. # lua脚本是否开启缓存,在调试阶段设为off(修改lua文件后不用重启nginx),在正式环境一定要注释掉这一行,以提高性能
  38. lua_code_cache off;
  39.  
  40. # 这个location是真正调用lua脚本的设置
  41. location /lua/test {
  42. # 指定返回的类型是json
  43. default_type 'application/json';
  44. # 指定访问/lua/test时由test.lua来返回内容,这个路径需要注意是容器中的路径,千万不要和宿主机搞混淆了
  45. content_by_lua_file '/usr/local/lua/test.lua';
  46. }
  47.  
  48. # 也是流量统计,可以注释掉
  49. location /status {
  50. vhost_traffic_status_display;
  51. vhost_traffic_status_display_format html;
  52. }
  53.  
  54. }
  55. }

docker-compose.yml

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

test.lua

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号