在電商項目中所有的訪問都是通過首頁訪問進去的,那么首頁門戶的訪問頻率會是非常高的,用我們專業術語來說就是並發量高,這時問題就來了,並發量高我們在做程序時就要保證首頁的抗壓能力強,而且還要保證抗壓的同時數據的加載速度還要保證也能高。這時就要說下OpenResty並發站點架構的思想了。
一、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搭建
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
即可。
systemctl start openresty
然后直接在瀏覽器上打出http://ip/就可以看到頁面了
補充內容,建議大家還是不要用我上面的安裝過程,我是做到后面才發現問題的,官網上CentOS 方法是默認你所有插件配置都配置好了,因為后面我有用到ngx_cache_purge-2.3導致走了很多坑,建議大家用我下面的配置方法搭建OpenResty
1、下載源碼包
wget https://openresty.org/download/openresty-1.17.8.1.tar.gz wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
2、解壓
tar -xzvf openresty-1.17.8.1.tar.gz tar -xzvf ngx_cache_purge-2.3.tar.gz tar -xzvf v0.3.0.tar.gz
3、將ngx_cache_purge和nginx_upstream_check_module移動至openresty-1.17.8.1/bundle下
cp -r ngx_cache_purge-2.3 openresty-1.17.8.1/bundle/ cp -r nginx_upstream_check_module-0.3.0 openresty-1.17.8.1/bundle/
4、進入openresty
cd openresty-1.17.8.1
5、編譯安裝
./configure --prefix=/usr/local/openresty --with-luajit --with-http_ssl_module --user=root --group=root --with-http_realip_module --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/
出現如下所示,表示成功了
出現如下表示OK: Configuration summary + using system PCRE library + using system OpenSSL library + using system zlib library nginx path prefix: "/usr/local/openresty/nginx" nginx binary file: "/usr/local/openresty/nginx/sbin/nginx" nginx modules path: "/usr/local/openresty/nginx/modules" nginx configuration prefix: "/usr/local/openresty/nginx/conf" nginx configuration file: "/usr/local/openresty/nginx/conf/nginx.conf" nginx pid file: "/usr/local/openresty/nginx/logs/nginx.pid" nginx error log file: "/usr/local/openresty/nginx/logs/error.log" nginx http access log file: "/usr/local/openresty/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp" cd ../.. Type the following commands to build and install: make make install
接着再執行如下:
make && make install
不報錯並再/usr/local/目錄下發現openrestry,就表示安裝成功。
6、啟動
cd /usr/local/openresty/nginx
./sbin/nginx
界面效果,如圖所示:
三、靜態頁面的發布
上面講了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
這樣頁面就加載出來了