OpenResty高併發

童話述說我的結局發表於2021-06-26

在電商專案中所有的訪問都是通過首頁訪問進去的,那麼首頁門戶的訪問頻率會是非常高的,用我們專業術語來說就是併發量高,這時問題就來了,併發量高我們在做程式時就要保證首頁的抗壓能力強,而且還要保證抗壓的同時資料的載入速度還要保證也能高。這時就要說下OpenResty併發站點架構的思想了。

一、OpenResty簡介

OpenResty 是一個基於 Nginx 與 Lua 的高效能 Web 平臺,其內部整合了大量精良的 Lua 庫、第三方模組以及大多數的依賴項。用於方便地搭建能夠處理超高併發、擴充套件性極高的動態 Web 應用、Web 服務和動態閘道器。
OpenResty® 通過匯聚各種設計精良的 Nginx 模組(主要由 OpenResty 團隊自主開發),從而將Nginx 有效地變成一個強大的通用 Web 應用平臺。這樣,Web 開發人員和系統工程師可以使用 Lua 指令碼語言調動 Nginx 支援的各種 C 以及 Lua 模組,快速構造出足以勝任 10K 乃至 1000K 以上單機併發連線的高效能 Web 應用系統。
OpenResty® 的目標是讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至於對遠端後端諸如 MySQL、PostgreSQL、Memcached 以及Redis 等都進行一致的高效能響應。這個是官網對OpenResty的說明。下面附上兩個官方網址:

二、OpenResty解決的問題

上面官方的術語說的很官方,可能看完了也不知道這玩意有啥好的,那就用大白話這樣說吧!OpenResty解決的是高併發的痛點。現在服務的後臺大部分是java寫的,但是用java寫出穩定的高併發服務是很複雜的一件事,首先是伺服器的選擇,web伺服器有幾個選型,tomcat,apache,weblogic,還有商用webphere. 1、tomcat官方宣稱的併發量是1000,厲害點的做點引數調優,也不過3000併發,如果要開發一個併發百萬的服務,1000000/3000,需要1000臺伺服器,想想都不可能。 2、apache的併發比tomcat更不堪,200-300 3、weblogic的併發稍好,平均能達到3000左右,但是也沒有達到好一個數量級;但是nginx就不一樣了,處理幾萬的請求很輕鬆,記憶體佔用也不高,在幾年前我朋友他們公司把它用作負載均衡,沒想過當做一個web伺服器,OpenResty的出現解決了享受nginx高併發優勢的攔路虎,因為nginx是使用非同步事件模型,跟傳統的程式設計思想不一樣,而lua是用c解釋執行的指令碼語言(執行效率很高),可以用傳統的同步程式設計思想上,在nginx請求接進來後處理稍複雜的邏輯。

對於高併發的系統來說,都是基於記憶體的,或者說是基於快取的,這時有的人可能會想用mysql支撐高併發,mysql的併發量在4000-8000,超過這個量mysql效能就會急劇下降。一次記憶體讀取的時間是幾十納秒,一次快取讀取是幾毫秒,一納秒等於1秒的1000000000分之一,一毫秒等於1秒的1000分之一,請求過來之後直接走記憶體讀取,在需要和資料庫互動的時候把資料寫入記憶體,然後再批量入庫,快速響應。

web流量也符合二八原則,百分之八十的流量集中在百分之二十的頁面,比如電商的首頁,產品詳情頁,使用openResty支撐產品詳情頁的高併發訪問,在處理訂購單,購物車等環節用其他的高併發框架處理,比如java的NIO網路框架netty。

三、OpenResty搭建

關於OpenResty的搭建,可以參考官方提供的網址進行搭建。http://openresty.org/cn/installation.html,還有一個是官方提供了原始碼安裝的方式:http://openresty.org/cn/linux-packages.html;我是用centos8在我雲上安裝的,教程可以看如下連結http://openresty.org/cn/linux-packages.html

CentOS

你可以在你的 CentOS 系統中新增 openresty 倉庫,這樣就可以便於未來安裝或更新我們的軟體包(通過 yum check-update 命令)。 執行下面的命令就可以新增我們的倉庫(對於 CentOS 8 或以上版本,應將下面的 yum 都替換成 dnf):

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/

# update the yum index:
sudo yum check-update

然後就可以像下面這樣安裝軟體包,比如 openresty

sudo yum install -y openresty

如果你想安裝命令列工具 resty,那麼可以像下面這樣安裝 openresty-resty 包:

sudo yum install -y openresty-resty

命令列工具 opm 在 openresty-opm 包裡,而 restydoc 工具在 openresty-doc 包裡頭。

列出所有 openresty 倉庫裡頭的軟體包:

sudo yum --disablerepo="*" --enablerepo="openresty" list available

參考 OpenResty RPM 包頁面獲取這些包更多的細節。

對於 CentOS 8 及更新版本,我們只需要將上面的 yum 命令都替換成 dnf 即可。

上面是官方給出的安裝命令,安裝完後輸入下面命令啟動OpenResty
 
systemctl start openresty

然後直接在瀏覽器上打出http://ip/就可以看到頁面了

 

 三、靜態頁面的釋出

上面講了OpenResty的作用以及安裝,這個過程看過官網還是比較簡單的,接下來就說下作用。在電商平臺中很多都是圖片,這些圖片都是靜態資源。可以開啟購物平臺看下。

 

 

 可以發現就只查詢一個產品請求連結就達到了471個,如果把滾動條向下滾動請求會更多,可以通過控制檯發現這裡面大部分都是靜態資源,很少的動態請求。針對一個網店來說有這麼多的靜態資源如果都用tomcat去處理的話,tomcat的壓力是很大的。用一個例子說明下,前面說過OpenResty的抗壓能力非常好,他能非常輕鬆的達到10K到1000K,前面說過OpenResty裡面包含了Nginx,如果一個請求過來先經過Nginx,Nginx併發能力雖然很強,但是如果後端用Tomcat叢集承接的話,這時會導致服務很容易掛掉(上面說過Toncat的併發量)。

 

 

那麼這個問題出現了怎麼解決呢,解決思路其實也很簡單,那就是讓很多Nginx能處理的靜態請求直接讓Nginx自己直接處理,讓需要查詢資料庫的動態請求交給tomcat處理,這樣一來整體抗壓能力就提交很多了。這個思想其實就是動靜分離的處理思想。

 

 

下面就關於動靜分離的實踐做一個釋出,玩過nginx釋出vue專案的朋友對這一步來說是很簡單的,我把vue打包後的檔案通過工具上傳到我的linux中了,這一步比較簡單我就不說明了。目錄如下

 接下來要做的就是通過Nginx釋出程式碼。先進入到openresty目錄

cd /usr/local/openresty/

 

 然後進入到nginx目錄

 

 

 然後進入他的核心配置檔案conf裡面修改檔案nginx.conf檔案

 

 修改紅框內的兩個內容就可以了,上面那個是要訪問的網址,下面那個是打包專案的路徑

 

 

儲存檔案後重新載入一下用命令

 nginx -s reload

 

 報了個錯,這個錯是我環境變數沒有配置,輸入命令

vi /etc/profile

在檔案最後一行配置如下配置

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

然後再輸入下面命令就可以讓配置生效了

source /etc/profile

再用nginx -s reload執行一下就不會報錯了

 

 

 

現在訪問下自己配置的網址www.ljx.com,發現域名沒用

 

 這個也簡單,花錢買是不可能的,飯都吃不起的人怎麼可能浪費錢去買域名。修改本地檔案 C:\Windows\System32\drivers\etc\HOSTS 檔案就可以了,在HOSTS檔案最後一行加上ip  域名就行例如

192.168.32.32  www.ljx.com

這樣頁面就載入出來了

 

 

相關文章