Nginx Unit 初試

Nignx在今年九月推出了新產品Unit, 並且在十月中旬釋出了0.2 Beta版, Unit的角色, 可以是代替Nginx去處理Server Side Script或應用程式, 目前Nginx Unit官網公佈支援PHP, Python, Go, Node.js與Java(目前測試版僅支援PHP, Python與Go), 也就是基礎的Web Server靜態檔案處理交由Nginx, 動態的應用程式交由Nginx Unit, 構築成強而有力但相對容易設定的服務!

Nginx Unit 初試
Nginx Unit官網: https://unit.nginx.org/

當然, Nginx Unit本身直接做為Web Server是沒有問題的, 但是現階段功能太少, 現階段實際應用大致如上述, 搭配Nginx, Unit做為Beckend Server, Unit提供PHP/Python對接功能, 而Go則提供相對應的函式庫, 詳請可參考Unit的教學影片:


Unit的最大優點是利用RESTful API/JSON對Control process即時變動設定, 新增或刪除某個服務, 不過目前若是對php.ini修改或增加了PHP模組, 那仍然需要關與重啟閉Listener與Application
以下是簡單的Uunit服務設定:
{
"listeners": {
"*:80": {
"application": "phpinfo"
}
},

"applications": {
"phpinfo": {
"type": "php",
"workers": 3,
"root": "/opt/unit/html",
"index": "index.php"
}
}
}


設定JSON解說:
listeners加入一個監聽在所有網路介面的Port 80(*:80), 應用程式標籤名為phpinfo
applications加入一個應用程式名為phpinfo, 型態是php(當然Python就是其他參數), worker process數量為3個, 網站的根目錄(root即是document directory)為/opt/unit/html路徑, 首頁為index.php

這裡就實際來安裝Nginx Unit與PHP 7.0來測試, 使用的作業系統是Debian Linux 9.2.1, 使用VMware安裝虛擬機, 配置給1 CPU與4GB RAM, 8GB HDD空間, 並且計畫另一台虛擬機採用Nginx與PHP-FPM


預先準備


在一個乾淨的系統需要編譯Unit, 需要build-essential套件
apt-get install build-essential php-dev libphp-embed psmisc curl git

也順便安裝了PHP 7.0開發套件與必要的工具


安裝Unit


下載Unit 0.2 Beta
wget http://unit.nginx.org/download/unit-0.2.tar.gz


解壓縮
tar zxvf unit-0.2.tar.gz


進入Unit原始碼目錄
cd unit-0.1


Unit組態設定, 將Unit安裝到/opt/unit目錄下
./configure --prefix=/opt/unit


加入PHP
./configure php


編譯與安裝
make all; make install

移動到目錄/opt/unit就會看到unit的伺服器程式執行檔

啟動Unit


前往Unit的安裝目錄
cd /opt/unit/sbin


啟動Unit, Control process監聽在127.0.0.1 Port 8080, 當然你也可自己指定Port
./unitd --control 127.0.0.1:8080


取得目前設定
curl 127.0.0.1:8080

會得到空的設定

將前面的JSON寫到/opt/unit/demo/start.json, 0.2 Beta版在重啟Unit時已可保持上次的設定
curl -X PUT -d@/opt/unit/demo/start.json 127.0.0.1:8080

再跑一次curl 127.0.0.1:8080, 就會看到設定已經寫入了, 用瀏覽器打開此台虛擬機網站, 即可看到網站內容, 我在index.php放簡單的phpinfo即可
nano /opt/unit/html/index.php

貼入程式碼並且存檔
<?php phpinfo(); ?>


為了與Nginx/PHP-FPM的效能比較, 從GitHub找來一個PHP測試程式, 但需要php-mbstring模組
apt-get install php-mbstring


檢視已安裝模組, 可以看到mbstring
php -m


如果reload網站, 發現phpinfo並未出現mbstring模組, 來重啟phpinfo這個應用程式
移除listeners的*:80
curl -X DELETE '127.0.0.1:8080/listeners/*:80'

移除applications的phpinfo應用程式
curl -X DELETE '127.0.0.1:8080/applications/phpinfo'

重新讀入JSON
curl -X PUT -d@/opt/unit/demo/start.json 127.0.0.1:8080

Unit日後版本會解決這個問題, 目前就先手動處理


安裝測試PHP程式


我直接在網站跟目錄下取得測試PHP程式
cd /opt/unit/html


下載rusoft所提供的php-simple-benchmark-script
git clone https://github.com/rusoft/php-simple-benchmark-script.git

接著在瀏覽器跑網站下的/php-simple-benchmark-script/bench.php即可
以下是Unit與PHP 7.0的結果
-------------------------------------------------------------------------------------------
| PHP BENCHMARK SCRIPT |
-------------------------------------------------------------------------------------------
Start: : 2017-10-24 15:31:55
Server: : Linux/4.9.0-4-amd64 x86_64
Platform: : Linux
CPU: :
model : Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz
cores : 1
MHz : 3699.858MHz
Memory : 256 Mb available
Benchmark version: : 1.0.24
PHP version: : 7.0.19-1
Max execution time: : 600 sec.
Crypt hash algo: : MD5
-------------------------------------------------------------------------------------------
TEST NAME : SECONDS | OP/SEC | OP/SEC/MHz | MEMORY
-------------------------------------------------------------------------------------------
01_math : 3.349 sec | 418.09 kOp/s | 113.00 Ops/MHz | 2 Mb
02_string_concat : 0.280 sec | 27.55 MOp/s | 7.45 kOps/MHz | 128.84 Mb
03_1_string_number_concat : 2.011 sec | 2.49 MOp/s | 671.91 Ops/MHz | 4 Mb
03_2_string_number_format : 1.696 sec | 2.95 MOp/s | 796.68 Ops/MHz | 4 Mb
04_string_simple_functions : 1.976 sec | 657.97 kOp/s | 177.84 Ops/MHz | 4 Mb
05_string_multibyte : 5.618 sec | 23.14 kOp/s | 6.25 Ops/MHz | 4 Mb
06_string_manipulation : 3.875 sec | 335.47 kOp/s | 90.67 Ops/MHz | 4 Mb
07_regex : 2.610 sec | 498.11 kOp/s | 134.63 Ops/MHz | 4 Mb
08_1_hashing : 2.472 sec | 525.83 kOp/s | 142.12 Ops/MHz | 4 Mb
08_2_crypt : 6.567 sec | 1.52 kOp/s | 0.41 Ops/MHz | 4 Mb
09_json_encode : 2.337 sec | 556.23 kOp/s | 150.34 Ops/MHz | 4 Mb
10_json_decode : 2.927 sec | 444.20 kOp/s | 120.06 Ops/MHz | 4 Mb
11_serialize : 1.524 sec | 853.27 kOp/s | 230.62 Ops/MHz | 4 Mb
12_unserialize : 2.327 sec | 558.57 kOp/s | 150.97 Ops/MHz | 4 Mb
13_array_fill : 2.542 sec | 19.67 MOp/s | 5.32 kOps/MHz | 12 Mb
14_array_range : 0.542 sec | 184.46 kOp/s | 49.86 Ops/MHz | 12 Mb
14_array_unset : 2.281 sec | 21.92 MOp/s | 5.92 kOps/MHz | 12 Mb
15_loops : 2.648 sec | 143.48 MOp/s | 38.78 kOps/MHz | 4 Mb
16_loop_ifelse : 1.849 sec | 48.67 MOp/s | 13.15 kOps/MHz | 4 Mb
17_loop_ternary : 4.282 sec | 21.02 MOp/s | 5.68 kOps/MHz | 4 Mb
18_1_loop_defined_access : 0.669 sec | 29.88 MOp/s | 8.08 kOps/MHz | 4 Mb
18_2_loop_undefined_access : 4.353 sec | 4.59 MOp/s | 1.24 kOps/MHz | 4 Mb
19_type_functions : 2.421 sec | 2.07 MOp/s | 558.28 Ops/MHz | 4 Mb
20_type_conversion : 1.819 sec | 2.75 MOp/s | 742.97 Ops/MHz | 4 Mb
21_0_loop_exception_none : 0.042 sec | 94.19 MOp/s | 25.46 kOps/MHz | 4 Mb
21_1_loop_exception_try : 0.040 sec | 98.98 MOp/s | 26.75 kOps/MHz | 4 Mb
21_2_loop_exception_catch : 3.537 sec | 1.13 MOp/s | 305.69 Ops/MHz | 4 Mb
22_loop_null_op : 1.581 sec | 31.62 MOp/s | 8.55 kOps/MHz | 4 Mb
23_loop_spaceship_op : 1.385 sec | 36.11 MOp/s | 9.76 kOps/MHz | 4 Mb
-------------------------------------------------------------------------------------------
Total time: : 69.562 sec.
Current memory usage: : 4 Mb.
Peak memory usage: : 125.25 Mb.


與其比較的另一虛擬機傳統Nginx/PHP-FPM結果
-------------------------------------------------------------------------------------------
| PHP BENCHMARK SCRIPT |
-------------------------------------------------------------------------------------------
Start: : 2017-10-24 16:13:55
Server: : Linux/4.9.0-4-amd64 x86_64
Platform: : Linux
CPU: :
model : Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz
cores : 1
MHz : 3700.117MHz
Memory : 256 Mb available
Benchmark version: : 1.0.24
PHP version: : 7.0.19-1
Max execution time: : 600 sec.
Crypt hash algo: : MD5
-------------------------------------------------------------------------------------------
TEST NAME : SECONDS | OP/SEC | OP/SEC/MHz | MEMORY
-------------------------------------------------------------------------------------------
01_math : 3.241 sec | 431.92 kOp/s | 116.73 Ops/MHz | 2 Mb
02_string_concat : 0.279 sec | 27.55 MOp/s | 7.45 kOps/MHz | 128.84 Mb
03_1_string_number_concat : 1.913 sec | 2.61 MOp/s | 706.44 Ops/MHz | 4 Mb
03_2_string_number_format : 1.636 sec | 3.06 MOp/s | 825.83 Ops/MHz | 4 Mb
04_string_simple_functions : 1.963 sec | 662.26 kOp/s | 178.98 Ops/MHz | 4 Mb
05_string_multibyte : 5.708 sec | 22.78 kOp/s | 6.16 Ops/MHz | 4 Mb
06_string_manipulation : 3.945 sec | 329.50 kOp/s | 89.05 Ops/MHz | 4 Mb
07_regex : 2.543 sec | 511.22 kOp/s | 138.16 Ops/MHz | 4 Mb
08_1_hashing : 2.439 sec | 532.97 kOp/s | 144.04 Ops/MHz | 4 Mb
08_2_crypt : 6.655 sec | 1.50 kOp/s | 0.41 Ops/MHz | 4 Mb
09_json_encode : 2.468 sec | 526.65 kOp/s | 142.33 Ops/MHz | 4 Mb
10_json_decode : 2.943 sec | 441.73 kOp/s | 119.38 Ops/MHz | 4 Mb
11_serialize : 1.490 sec | 872.60 kOp/s | 235.83 Ops/MHz | 4 Mb
12_unserialize : 2.351 sec | 552.88 kOp/s | 149.42 Ops/MHz | 4 Mb
13_array_fill : 2.495 sec | 20.04 MOp/s | 5.42 kOps/MHz | 12 Mb
14_array_range : 0.539 sec | 185.45 kOp/s | 50.12 Ops/MHz | 12 Mb
14_array_unset : 2.253 sec | 22.19 MOp/s | 6.00 kOps/MHz | 12 Mb
15_loops : 2.367 sec | 160.57 MOp/s | 43.40 kOps/MHz | 4 Mb
16_loop_ifelse : 1.843 sec | 48.82 MOp/s | 13.19 kOps/MHz | 4 Mb
17_loop_ternary : 4.749 sec | 18.95 MOp/s | 5.12 kOps/MHz | 4 Mb
18_1_loop_defined_access : 0.834 sec | 23.98 MOp/s | 6.48 kOps/MHz | 4 Mb
18_2_loop_undefined_access : 4.520 sec | 4.43 MOp/s | 1.20 kOps/MHz | 4 Mb
19_type_functions : 2.372 sec | 2.11 MOp/s | 569.73 Ops/MHz | 4 Mb
20_type_conversion : 1.832 sec | 2.73 MOp/s | 737.41 Ops/MHz | 4 Mb
21_0_loop_exception_none : 0.036 sec | 111.48 MOp/s | 30.13 kOps/MHz | 4 Mb
21_1_loop_exception_try : 0.040 sec | 99.12 MOp/s | 26.79 kOps/MHz | 4 Mb
21_2_loop_exception_catch : 2.874 sec | 1.39 MOp/s | 376.09 Ops/MHz | 4 Mb
22_loop_null_op : 1.585 sec | 31.55 MOp/s | 8.53 kOps/MHz | 4 Mb
23_loop_spaceship_op : 1.421 sec | 35.18 MOp/s | 9.51 kOps/MHz | 4 Mb
-------------------------------------------------------------------------------------------
Total time: : 69.337 sec.
Current memory usage: : 4 Mb.
Peak memory usage: : 125.26 Mb.


效能上幾乎是沒有差異, 不過Unit帶來的便利性, 與伺服器上能服務多種Server Side Script/應用程式來說, 可以把機器運用到極限, 整合你的各種PHP, Python或是Go的應用程式!

參考資源: https://qiita.com/kotauchisunsun/items/b7959b96db6937b26b49 (日文網頁)
2017-10-25 11:02 發佈
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?