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單機並發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 在Debian11上安裝Openresty服務(Nginx+Lua)的詳細教程
- Nginx使用Lua模塊實現WAF的原理解析
- nginx七層負載均衡配置詳解
- nginx 集成lua操作mysql的過程解析
- Nginx配置Https安全認證的實現