色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么用OpenResty搭建高性能服務端

馬哥Linux運維 ? 來源:博客園 ? 作者:smileyqp ? 2021-06-16 09:31 ? 次閱讀

Socket編程

Linux Socket編程領域為了處理大量連接請求場景,需要使用非阻塞I/O和復用,select、poll、epoll是Linux API提供的I/O復用方式,自從Linux2.6中加入了epoll之后,高性能服務器領域得到廣泛的應用,Nignx就是使用epoll來實現I/O復用支持高并發。

對于“高性能”服務端而言,我們所關注的并不是語言的性能,而是緩存和語言支持異步非阻塞。

緩存

針對緩存要明白通信速度的快慢順序

內存》SSD機械磁盤

本機》網絡

進程內 》 進程間

緩存系統的目標是希望在進程內的命中率是最高的,那么此時緩存系統整體的效率也是最高的。

異步非阻塞

希望訪問數據庫、訪問網絡,訪問一些比較慢的IO設備時,不要在等待上耗費大量時間。而是使用事件驅動的方式,當系統完成某項任務后再來通知我們。這樣就可以將服務器CPU的空閑資源,用來服務客戶端連接。

OpenResty

OpenResty是基于Ngnix和Lua的高性能web平臺,內部集成精良的LUa庫、第三方模塊、依賴項。用于方便搭建能夠處理高并發、擴展性極高的動態web應用、web服務、動態網關。可以使用Lua腳本調用Ngnix支持的C以及Lua模塊,快速構建10K~1000K單機并發連接的高性能web應用系統。OpenResty的目標是讓web服務直接運行在Nginx服務內部,利用Ngnix的非阻塞IO模型,對HTTP客戶端請求和后端DB進行一致的高性能響應。

OpenResty的出現可以說是顛覆了高性能服務端的開發模式。OpenResty實際上是Nginx+LuaJIT的完美組合。

65bc9f9a-cc67-11eb-9e57-12bb97331649.png

OpenResty工作方式

由于Nginx采用的是master-worker模型,也就是一個master主進程管理多個worker進程,基本的事件處理都是放在worker中,master僅負責一些全劇初始化,以及對worker的管理。在OpenResty中,每個worker使用一個LuaVM,每個請求被分配到worker時,將在這個LuaVM中創建一個coroutine協程。協程之間數據隔離,每個協程具有獨立的全局變量_G。

Lua中的協程和多線程下的線程類似,都有自己的堆棧、局部變量、指令指針。。。,但是和其他協程程序共享全局變量等信息。線程和協程主要不同在于:多處理器的情況下,概念上來說多線程是同時運行多個線程,而協程是通過代碼來完成協程的切換,任何時刻只有一個協程程序在運行。并且這個在運行的協程只有明確被要求掛起時才會被掛起。

根據實際測試,OpenResty性能接近于Nginx 性能之王c module,甚至超過。

OpenResty 架構

負載均衡

LVS+HAProxy將流量轉發給核心Nginx1和Nginx2,即實現了流量的負載均衡。

單機閉環

所有想要的數據都能從本服務器直接獲取,大多數時候無需通過網絡或去其他服務器獲取。

分布式閉環

單機閉環會遇到2個主要問題

1.數據不一致

例如沒有主從架構導致不同服務器數據不一致

2.遇到存儲瓶頸

磁盤或內存遇到天花板

解決數據不一致比較好的辦法是采用主從或分布式集中存儲,而遇到存儲瓶頸就需要進行按業務鍵進行分片,將數據分散到多臺服務器。

接入網關

接入網關又叫接入層,即接收流量的入口,在入口處做如下事情:

65fa836e-cc67-11eb-9e57-12bb97331649.png

接入網關

OpenResty環境搭建

http://openresty.org

http://openresty.org/cn/download.html

安裝前準備,必須安裝perl、libpcre、libssl庫。

# 從系統路徑中查看必備庫是否已經安裝

$ sudo ldconfig -v

# 安裝必備庫

$ sudo apt install libpcre3-dev libssl-dev perl make build-essential curl libreadline-dev libncurses5-dev

下載并解壓OpenResty后進入其目錄

$ wget https://openresty.org/download/ngx_openresty-1.13.6.1.tar.gz

$ tar -zxvf ngx_openresty-1.13.6.1.tar.gz

$ mv openresty-1.13.6.1 openresty

$ cd openresty

$ 。/configure

默認會被安裝到/usr/local/openresty目錄下

# 編譯并安裝

$ sudo make && make install

$ cd /usr/local/openresty

啟動Nginx

$ sudo /usr/local/openresty/nginx/sbin/nginx

$ ps -ef | grep nginx

$ service nginx status

Nginx啟動若出現

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] still could not bind()

說明80端口并占用,查看80端口被占用的端口并重啟。原因在于nginx先監聽了ipv4的80端口之后又監聽了ipv6的80端口,于是就重復占用了。

$ sudo netstat -ntlp | grep 80

$ sudo killall -9 nginx

重新編輯Nginx配置文件

$ sudo vim /etc/nginx/conf/nginx.conf

listen 80;

listen [::]:80 ipv6only=on default_server;

使用curl工具或在瀏覽器訪問默認80端口

$ curl 127.0.0.1

瀏覽器輸入http://127.0.0.1/

將Nginx工具配置到當前用戶的系統環境變量中

$ sudo vim ~/.bashrc

export PATH=$PATH:/usr/local/openresty/nginx/sbin

$ source ~。/bashrc

$ cd ~

$ nginx -s reload

nginx: [alert] kill(12267, 1) failed (1: Operation not permitted)

開發文檔

https://www.nginx.com/resources/wiki/modules/lua/

ubuntu 安裝 vcode 或 sublime text 編輯器

content_by_lua

$ vim /usr/local/openresty/nginx/conf/nginx.conf

location /test {

default_type text/html;

content_by_lua ‘ngx.say(“hello openresty”)’;

}

# 重啟Nginx

$ /usr/local/openresty/nginx/sbin/nginx -s reload

# 瀏覽器訪問 127.0.0.1/test

content_by_lua_file

$ vim nginx.conf

location /test {

content_by_lua_file ‘html/test.lua’;

}

$ vim 。。/html/test.lua

ngx.say(“hello lua”)

$ sudo /usr/local/nginx/sbin/nginx -s reload

$ curl 127.0.0.1/test

hello lua

為避免每次修改都需要重啟Nginx,可在Nginx的server選項中配置lua_code_cache選項。

$ vim nginx.conf

server{

lua_code_cache off;

location /test{

content_by_lua_file ‘html/test.lua’;

}

}

$ sudo /usr/local/openresty/nginx/sbin/nginx -s reload

nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:48

注意lua_code_cache off;是會引擎Nginx的性能的,在生產環境中是需要將其開啟的。

小節

在OpenResty中開發是分為兩步的,第一步是修改Nginx配置,第二步是使用Lua開發自己的腳本。

OpenResty入門

參考資料

OpenResty最佳實踐

Nginx Lua

創建工作目錄

OpenResty安裝之后就有配置文件及相關目錄,為了工作目錄和安裝目錄互不干擾,另外創建OpenResty工作目錄,并另寫配置。

$ mkdir -p ~/openresty/test/logs ~/openresty/test/conf

$ vim ~/openresty/test/conf/nginx.conf

# 設置Nginx worker工作進程數量,即CPU核數。

worker_processes 1;

# 設置錯誤日志文件路徑

error_log logs/error.log;

# 配置Nginx服務器與用戶的網絡連接

events{

# 設置每個工作進程的最大連接數

worker_connections 10224;

}

http{

# 虛擬機主機塊定義

server{

# 監聽端口

listen 8001;

# 配置請求的路由

location /{

default_type text/html;

content_by_lua_block{

ngx.say(“hello world”);

}

}

}

}

$ nginx -p ~/openresty/test

$ curl 127.0.0.1:8001

hello world

$ vim nginx.conf

location /test{

content_by_lua_file “lua/test.lua”;

}

$ cd 。。 && mkdir lua && cd lua

$ vim test.lua

local args = ngx.req.get_uri_args()

local salt = args.salt

if not salt then

ngx.exit(ngx.HTTP_BAD_REQUEST)

end

local md5str = ngx.md5(ngx.time()。.salt)

ngx.say(md5str)

$ sudo /usr/local/openresty/nginx/sbin/nginx -s reload

$ curl -i 127.0.0.1/test?salt=lua

HTTP/1.1 200 OK

Server: openresty/1.13.6.2

Date: Sun, 27 Jan 2019 1017 GMT

Content-Type: application/octet-stream

Transfer-Encoding: chunked

Connection: keep-alive

b55b77f75e46b96b11778ca7edfe8d55

若代碼中出現錯誤則需要直接查看Nginx的錯誤日志進行查看

$ vim nginx/logs/error.log

2019/01/27 1715 [error] 15764#0: *6 failed to load external Lua file “/usr/local/openresty/nginx/test.lua”: cannot open /usr/local/openresty/nginx/test.lua: No such file or.。。

Windows系統下查看Nginx進程

λ tasklist /fi “imagename eq nginx.exe”

映像名稱 PID 會話名 會話# 內存使用

========================= ======== ================ =========== ============

nginx.exe 9072 Console 1 7,840 K

nginx.exe 7692 Console 1 12,304 K

nginx.exe 8120 Console 1 7,840 K

nginx.exe 4552 Console 1 12,188 K

nginx.exe 9588 Console 1 7,828 K

nginx.exe 6256 Console 1 12,216 K

nginx.exe 7308 Console 1 7,828 K

nginx.exe 10192 Console 1 12,212 K

λ taskkill /im nginx.exe /f

成功: 已終止進程 “nginx.exe”,其 PID 為 9072。

ngx lua API

參考資料

NGINX API for Lua

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209332
  • 服務器
    +關注

    關注

    12

    文章

    9123

    瀏覽量

    85328
  • API
    API
    +關注

    關注

    2

    文章

    1499

    瀏覽量

    61964
  • SSD
    SSD
    +關注

    關注

    21

    文章

    2857

    瀏覽量

    117370

原文標題:OpenResty搭建高性能服務端

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SSR與微服務架構的結合應用

    隨著互聯網技術的快速發展,前端技術棧不斷更新迭代,后端架構也經歷了從單體應用到微服務的變革。在這個過程中,服務端渲染(SSR)作為一種提升頁面加載速度和SEO性能的技術,與微服務架構的
    的頭像 發表于 11-18 11:34 ?317次閱讀

    高性能服務器有什么用處?

    高性能服務器是一種基于云計算技術的虛擬化服務器,具有高性能、靈活性、可靠性和安全性等特點。它廣泛應用于網絡托管服務、數據備份與恢復、大數據
    的頭像 發表于 11-04 10:22 ?180次閱讀

    GPU高性能服務器配置

    GPU高性能服務器作為提升計算速度和效率的關鍵設備,在各大應用場景中發揮著越來越重要的作用。在此,petacloud.ai小編為你介紹GPU高性能服務器的配置要點。
    的頭像 發表于 10-21 10:42 ?191次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-常見網絡服務搭建之TFTP服務搭建

    內核。使用TFTP協議傳輸文件,還需要在主機安裝TFTP服務端,可以在 Linux系統下實現,也可以在Windows系統下實現,下面在Linux(Ubuntu)系統下安裝TFTP服務端進行測試。安裝
    發表于 09-25 09:44

    求助,在IR615中可以選用哪種vpn協議?如何進行配置?

    現有多臺IR615路由器,希望將其配置為vpn客戶,連接云服務器的vpn服務端 工程師遠程連接云服務器對IR615進行管理 在IR615中可以選用哪種vpn協議?如何進行配置?
    發表于 07-25 07:53

    請問ESP32作為藍牙服務端如何修改MTU?

    我們的工程把esp32當作藍牙服務端讓電腦去連,由于一些老電腦上沒有藍牙,要用外置藍牙驅動,默認MTU只有23,但是說明上驅動是支持最大mtu的,所以有什么辦法可以通過服務端去修改mtu嗎
    發表于 06-27 07:47

    請問esp_local_ctrl中服務端如何主動發消息?

    請問,在wifi本地控制例程esp_local_ctrl中,設備作為服務端在客戶沒有請求的情況下,如何主動發送消息給客戶呢?
    發表于 06-06 06:11

    服務端測試包括什么類型

    服務端測試是確保軟件系統在服務器端正常運行和滿足性能要求的重要環節。本文將詳細介紹服務端測試的類型、方法和最佳實踐。 1. 服務端測試的定義
    的頭像 發表于 05-30 16:03 ?740次閱讀

    服務端測試是web測試嗎為什么

    客戶請求、執行業務邏輯、與數據庫交互等。服務端測試的目的是確保服務器端的軟件組件能夠按照預期工作,沒有錯誤,并且能夠滿足性能要求。 服務端
    的頭像 發表于 05-30 15:30 ?594次閱讀

    服務端測試和客戶測試區別在哪

    主要針對服務器端的軟件進行測試,包括服務器端的應用程序、數據庫、中間件等。服務端測試的目的是確保服務器端軟件的穩定性、性能、安全性和可靠性。
    的頭像 發表于 05-30 15:27 ?3013次閱讀

    服務端的測試主要是測什么內容

    服務端測試是軟件開發過程中的一個重要環節,主要目的是確保服務端程序的穩定性、性能、安全性和可靠性。 功能測試 功能測試是服務端測試的基礎,主要驗證
    的頭像 發表于 05-30 15:24 ?3996次閱讀

    PLC采用HTTP協議JSON文件對接MES等服務系統平臺

    文件的字段與PLC寄存器地址,配置URL即可。支持POST/GET/PUT等多種方法。智能網關IGT-DSER可同時作為HTTP協議的客戶服務端。作為客戶通訊時將JSON文件提交給HTTP
    發表于 03-25 14:25

    lwip stm407作為服務端 pc連接不上怎么解決?

    lwip stm407作為服務端 pc連接不上
    發表于 03-20 06:32

    ?PLC從HTTP服務端獲取JSON文件,解析數據到寄存器

    智能網關IGT-DSER集成了多種PLC協議,方便實現各種PLC與HTTP服務端之間通訊。通過網關的參數配置軟件綁定JSON文件的字段與PLC寄存器地址,配置URL,即可采用POST命令,將JSON
    發表于 01-24 09:47

    PLC通過智能網關,與OPCUA服務端通訊,實現標簽數據讀寫

    是采用西門子S7-200 SMART通過IGT-DSER智能網關跟OPCUA的服務端之間通訊,以下是相關操作步驟。首先通過參數設置軟(在附件中)選擇功能與驅動類型,如下圖左邊功能選第三項,右邊的驅動選擇
    發表于 01-02 16:41
    主站蜘蛛池模板: xxxxxx视频| 久久这里只有精品视频e| 忘忧草在线社区WWW日本-韩国| jaPanesmature儿母| 欧美日韩在线亚洲一| metart中国撒尿人体欣赏| 欧美日韩国产码在线| 成人人猿泰山| 性欧美13处14处破| 黑色丝袜在线观看| 在线A亚洲老鸭窝天堂AV高清| 久久国产欧美| 99国产福利| 天天靠天天擦天天摸| 国产在线播放91| 在线亚洲专区中文字幕| 欧美日韩888在线观看| 国产69TV精品久久久久99| 掀开奶罩边躁狠狠躁软学生| 精品国产在线观看福利| 97国产精品视频在线观看| 色欲AV亚洲情无码AV蜜桃| 国产综合在线观看| 90后美女乳沟| 午夜性爽视频男人的天堂在线| 精品伊人久久| 拔萝卜视频免费看高清| 亚洲AV噜噜88| 欧美片第1页 综合| 狠狠干.in| 纯肉无码AV在线看免费看| 亚洲视频欧美视频| 99香蕉视频| 学生无码AV一区二区三区| 内射人妻骚骚骚| 灰原哀被啪漫画禁漫| 成人精品视频| 在线伦理电影网| 校花在公车上被内射好舒服| 两个客户一起吃我的奶| 国产毛片AV久久久久精品|