nginx+lua單機(jī)上萬(wàn)并發(fā)的實(shí)現(xiàn)
nginx是我們最常用的服務(wù)器,常用于做內(nèi)容分發(fā)和反向代理,lua是一種類C的腳本語(yǔ)言,廣泛應(yīng)用于游戲行業(yè),十年前頁(yè)游流行的時(shí)候,我曾經(jīng)買(mǎi)過(guò)傳奇類游戲的源碼,游戲中的服務(wù)端就是用lua實(shí)現(xiàn)的。我們常用來(lái)配合nginx、envoy和redis做一些簡(jiǎn)單實(shí)用的功能,比如:超賣(mài)和少賣(mài)、排行榜等,減少請(qǐng)求到達(dá)后端java的頻率
下面開(kāi)始構(gòu)建nginx+lua的鏡像,自己構(gòu)建的原因是怕別人提供的鏡像里有病毒,docker非官方鏡像中有很多病毒,這一點(diǎn)大家需要注意
本文采用openresty版本的nginx,具體openresty、nginx和lua的說(shuō)明大家可以百度一下
構(gòu)建鏡像之前需要先準(zhǔn)備好nginx-module-vts模塊和openresty-1.15.8.3的壓縮包,這兩個(gè)壓縮包百度一下就能找到,我也不知道公眾號(hào)文章能不能插外鏈,其中nginx-module-vts這個(gè)模塊的作用是統(tǒng)計(jì)nginx的訪問(wèn)數(shù)據(jù),如果自己用prometheus+grafana監(jiān)控nginx,就需要安裝這個(gè)模塊,我們索性一起編譯進(jìn)來(lái)
在服務(wù)器上創(chuàng)建目錄
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 # 更新數(shù)據(jù)源 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 # 復(fù)制工具包 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,注釋掉,在啟動(dòng)容器時(shí)掛載到容器中 # 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模塊后設(shè)置nginx流量統(tǒng)計(jì),本文主要講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腳本是否開(kāi)啟緩存,在調(diào)試階段設(shè)為off(修改lua文件后不用重啟nginx),在正式環(huán)境一定要注釋掉這一行,以提高性能 lua_code_cache off; # 這個(gè)location是真正調(diào)用lua腳本的設(shè)置 location /lua/test { # 指定返回的類型是json default_type 'application/json'; # 指定訪問(wèn)/lua/test時(shí)由test.lua來(lái)返回內(nèi)容,這個(gè)路徑需要注意是容器中的路徑,千萬(wàn)不要和宿主機(jī)搞混淆了 content_by_lua_file '/usr/local/lua/test.lua'; } # 也是流量統(tǒng)計(jì),可以注釋掉 location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; } } }
docker-compose.yml
version: '3.1' services: nginx: build: build # 左邊build指的是當(dāng)前容器需要構(gòu)建鏡像,右邊build表示構(gòu)建鏡像的文件在build這個(gè)目錄下 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目錄下創(chuàng)建test.lua文件
ngx.say('{"code": 1, "msg": "hello world!"}')
啟動(dòng)容器后,訪問(wèn)IP:80/lua/test就可以看到輸出了{(lán)"code": 1, "msg": "hello world!"},說(shuō)明lua腳本已經(jīng)生效
至此nginx+lua已經(jīng)搭建完畢,在以后的文章中會(huì)再介紹一些常用的lua腳本,如:JWT驗(yàn)證、操作Redis、消息隊(duì)列等,可以實(shí)現(xiàn)很多功能,只要你能想到都可以實(shí)現(xiàn)
到此這篇關(guān)于nginx+lua單機(jī)上萬(wàn)并發(fā)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx lua單機(jī)并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Nginx反向代理實(shí)現(xiàn)會(huì)話(session)保持的兩種方式
這篇文章主要介紹了詳解Nginx反向代理實(shí)現(xiàn)會(huì)話(session)保持的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08nginx請(qǐng)求時(shí)找路徑問(wèn)題解決
當(dāng)你安裝了nginx的時(shí)候,為nginx配置了如下的location,想要去訪問(wèn)路徑下面的內(nèi)容,可是總是出現(xiàn)404,找不到文件,這是什么原因呢,今天我們就來(lái)解決這個(gè)問(wèn)題,感興趣的朋友一起看看吧2023-10-10nginx利用ctx實(shí)現(xiàn)數(shù)據(jù)共享、修改上下文功能
這篇文章主要給大家介紹了關(guān)于nginx利用ctx實(shí)現(xiàn)數(shù)據(jù)共享、修改上下文功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01詳解nginx實(shí)現(xiàn)https網(wǎng)站設(shè)置
這篇文章主要介紹了詳解nginx實(shí)現(xiàn)https網(wǎng)站設(shè)置,詳細(xì)的介紹了HTTPS簡(jiǎn)介和證書(shū)生成等,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06nginx 如何實(shí)現(xiàn)if嵌套的方法示例
這篇文章主要介紹了nginx 如何實(shí)現(xiàn)if嵌套的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11詳解用ELK來(lái)分析Nginx服務(wù)器日志的方法
這篇文章主要介紹了用ELK來(lái)分析Nginx服務(wù)器日志的方法,ELK是三個(gè)開(kāi)源軟件的縮寫(xiě),分別表示Elasticsearch,Logstash,Kibana,需要的朋友可以參考下2016-03-03