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的搭建,可以參考官方提供的網址進行搭建。 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/就可以看到頁面了

 補充內容,建議大家還是不要用我上面的安裝過程,我是做到后面才發現問題的,官網上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

這樣頁面就加載出來了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM