OpenResty高並發

在電商項目中所有的訪問都是通過首頁訪問進去的,那麼首頁門戶的訪問頻率會是非常高的,用我們專業術語來說就是並發量高,這時問題就來了,並發量高我們在做程式時就要保證首頁的抗壓能力強,而且還要保證抗壓的同時數據的載入速度還要保證也能高。這時就要說下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的搭建,可以參考官方提供的網址進行搭建。//openresty.org/cn/installation.html,還有一個是官方提供了源碼安裝的方式://openresty.org/cn/linux-packages.html;我是用centos8在我雲上安裝的,教程可以看如下鏈接//openresty.org/cn/linux-packages.html

CentOS

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

# add the yum repo:
wget //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

然後直接在瀏覽器上打出//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

這樣頁面就載入出來了