Nginx Unit 與 LEMUR 新架構

從 LAMP、LEMP 到 LEMUR

從 20 世紀 90 年×××始,LAMP 架構成爲了部署 Web 應用程序最有名和最值得信賴的方法。LAMP 是 Linux,Apache,MySQL和 PHP 的首字母縮寫。直至今日,Apache 通過不斷迭代,依舊做爲一個成熟、穩定、強大的 Web 架構被廣爲使用。php

然而隨着用於開發和交付現代 Web 應用程序的架構不斷地追求輕便和簡化。NGINX 橫空出世,因爲其簡單性,高性能和可擴展性而成爲大多數熱門網站的首選網絡服務器。這致使了 LEMP 堆棧 的普遍使用,NGINX(Engine-X)取代了 Apache。html

時至今日,Web 開發的語言、框架愈加多樣化,以致於 LAMP、LNMP 中的關鍵一項 PHP 逐漸沒法知足市場的需求,GO、Python、Ruby、NodeJS、JAVA 等愈來愈多的語言被用於 Web 開發與生產實踐。雖然你依舊能夠單純的使用 Nginx 做爲反向代理的工具處理 Python、NodeJS、JAVA 等 Web 程序,可是對應的部署難度和維護複雜性隨着時間的推動變得愈來愈高。運維人員但願可以有一個統一的平臺,高效、簡單地處理各類各樣的 Web 程序。python

那麼這個時候,一個全新的 Web 架構來到了咱們眼前,那就是 LEMUR,即 Linux,NGINX,MariaDB,Unit 和 Redis。mysql

LEMUR 架構的安裝

本次安裝以 Debian 9.4 爲例nginx

基本庫安裝git

apt update && apt upgrade -y
apt install curl vim nano wget git sudo unzip apt-transport-https screen lsb-release ca-certificates dialog software-properties-common gnupg2 apparmor dirmngr -y
Redis

Redis

關係型數據庫是數據存儲的基石。可是,許多輕量級應用程序使用的重量級複雜數據存儲工具都不實用,或者速度不夠快。2009年,Redis 實驗室推出了開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。今天,Redis 多是最流行的鍵值對存儲數據庫,數百萬個 Web 應用程序使用它。其輕巧簡單的設計使其成爲 LEMUR 架構的關鍵和非關係型數據庫的首選。golang

不少人都說系統源打包的 redis 很老,誰能想到 stretch-backports 的版本直接是 4.0+ 新版呢。redis

apt install redis-server -t stretch-backports

MariaDB

在 Oracle 於 2010 年收購 Sun Microsystems 後,MySQL 的原始做者之一立刻建立了 MariaDB。其開放式設計和協做開發確保世界上最流行的數據庫保持開源並可供任何項目的工程師使用。此外,它與 MySQL 向後兼容。全部這些特徵使 MariaDB 成爲 LEMUR 架構中的關係數據庫的首選。sql

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64] http://mariadb.nethub.com.hk/repo/10.2/debian stretch main'
sudo apt update && sudo apt install mariadb-server -y

Nginx & Unit

最初於 1997 年發佈的 PHP 已成爲 Web 應用程序最流行的語言之一。PHP 進入門檻很是低,而且易於新手網站開發人員,但現代應用程序變得愈來愈複雜 - 它們以多種語言開發,而且一般在同一時間以多種不一樣語言版本交付。數據庫

爲了應對這些新挑戰,Nginx Unit 橫空出世,專爲現代應用設計。Unit 同時支持多種語言和語言版本,包括多個 PHP 版本,並做爲 LEMUR 架構中應用服務器的核心角色。

Nginx 和 Unit 的部署能夠有很是多的玩法,先介紹如何經過預編譯包來安裝,後面會補充介紹更高級的玩法。

curl -C - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

cat >> /etc/apt/sources.list.d/nginx.list << EOF
deb https://packages.nginx.org/unit/debian/ $(lsb_release -sc) unit
deb https://nginx.org/packages/mainline/debian/ $(lsb_release -sc) nginx
EOF

這邊寫了安裝 unit-php unit-python 和 unit-go,實際上 Unit 能夠作到支持 Python、PHP、Go、Perl、Ruby、JavaScript/Node.js (coming soon)、Java (coming soon),我這邊也將第一時間跟進。

apt update && apt install nginx unit-php unit-python2.7 unit-python3.5 unit-go1.7 unit-perl unit-ruby golang -y
apt install python-dev python3-dev libphp-embed php7.0-{bz2,bcmath,common,curl,dba,dev,gd,json,mcrypt,mbstring,mysql,intl,opcache,redis,sqlite3,xml,xmlrpc,zip} -t stretch-backports -y

Unit——LEMUR 架構的核心

2018 年 4 月 12 日,在首次公開發布大約六個月後,NGINX Unit 正式發佈了 1.0 版本。

Nginx Unit 使用 REST API 進行動態配置;沒有靜態配置文件。全部配置更改直接在內存中發生。配置更改無需從新加載配置或重啓服務便可生效。

毫無疑問,Unit 是整個 LEMUR 架構的核心組件,也是 Nginx 將來主推的 Web 動態應用部署新形式,它具備如下特徵:

  • 使用 JSON API 進行動態配置管理
  • 同時支持多語言、多版本 Web 開發語言

即將支持的特性有:

  • 動態語言的進程管理功能
  • TLS 支持
  • TCP, HTTP, HTTPS, HTTP/2 路由和代理

案例介紹

下面咱們用一個典型的 PHP 應用 wordpress 爲例介紹 Unit 以及 LEMUR 的應用:

數據庫配置

建立一個數據庫以及對應用戶:

mysql_secure_installation
mysql -u root -p
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 
mysql> CREATE USER wp_user@localhost IDENTIFIED BY 'secure_password';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO user@localhost;
mysql> FLUSH PRIVILEGES;
mysql> exit

應用下載與配置

mkdir -p /var/www && cd /var/www && wget http://wordpress.org/latest.tar.gz && tar xzvf latest.tar.gz && rm latest.tar.gz && cd wordpress && cp wp-config-sample.php wp-config.php
  • 簡單的安全加固,記錄下返回的結果,以後要用到:
curl -s https://api.wordpress.org/secret-key/1.1/salt/
  • 編輯配置:
nano wp-config.php

找到以下部分並修改爲對應數據庫信息:

/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wp_user@localhost');

/** MySQL database password */
define('DB_PASSWORD', 'secure_password');

找到以下內容並修改成以前安全加固產生的內容:

define('AUTH_KEY',         'value generated by salt');
define('SECURE_AUTH_KEY',  'value generated by salt');
define('LOGGED_IN_KEY',    'value generated by salt');
define('NONCE_KEY',        'value generated by salt');
define('AUTH_SALT',        'value generated by salt');
define('SECURE_AUTH_SALT', 'value generated by salt');
define('LOGGED_IN_SALT',   'value generated by salt');
define('NONCE_SALT',       'value generated by salt');

編輯完成後按 ctrl + x 保存退出,再按 y 而後按回車確認便可:

  • 修改文件及目錄權限:
sudo chown -R www-data:www-data /var/www/wordpress
sudo find /var/www/wordpress -type d -exec chmod g+s {} \;
sudo chmod g+w /var/www/wordpress/wp-content
sudo chmod -R g+w /var/www/wordpress/wp-content/themes
sudo chmod -R g+w /var/www/wordpress/wp-content/plugins
  • Unit 配置

  • 修改 Unit 配置文件:
nano /var/www/wordpress/wordpress.config

指定 wordpress.config 是 這個 Unit 應用的配置文件,咱們寫入以下內容:

{
   "listeners": {
       "127.0.0.1:8090": {
           "application": "script_index_php"
       },
       "127.0.0.1:8091": {
           "application": "direct_php"
       }
   },

   "applications": {
       "script_index_php": {
           "type": "php",
           "processes": {
               "max": 20,
               "spare": 5
           },
           "user": "www-data",
           "group": "www-data",
           "root": "/var/www/wordpress",
           "script": "index.php"
       },
       "direct_php": {
           "type": "php",
           "processes": {
               "max": 5,
               "spare": 0
           },
           "user": "www-data",
           "group": "www-data",
           "root": "/var/www/wordpress",
           "index": "index.php"
       }
   }
}
  • 提交配置文件:

這邊只是介紹了最基本的 API 用法,實際上基於 Unit API 能夠完成不少工做,具體參考 Unit 官方文檔請添加連接描述

curl -X PUT -d @/var/www/wordpress.config --unix-socket /run/control.unit.sock http://localhost/config
  • Unit 操做:
service unit [start|status|stop|restart|reload|force-reload|saveconfig|loadconfig]

對應的操做分別爲:開始、狀態、關閉、重啓、重載全部配置、強制載入全部配置、保存應用配置、載入應用配置。

Nginx 整合 Unit:

以上面的 Wordpress 應用爲例,給出一個 Nginx 配置:

upstream index_php_upstream {
   server 127.0.0.1:8090;
}
upstream direct_php_upstream {
   server 127.0.0.1:8091;
}
server {
   listen      80;
   server_name localhost;
   root        /var/www/wordpress/;
   location / {
       try_files $uri @index_php;
   }
   location @index_php {
       proxy_pass       http://index_php_upstream;
       proxy_set_header Host $host;
   }
   location /wp-admin {
       index index.php;
   }
   location ~* \.php$ {
       try_files        $uri =404;
       proxy_pass       http://direct_php_upstream;
       proxy_set_header Host $host;
   }
}

編輯完成之後開啓 Nginx 便可訪問:

nginx -t && nginx -s reload

我的見解

Nginx 做爲一段時間內流行的 Web Server,被廣爲使用,此次推出新的 Web 架構設想,以及 Unit 這一自我革命性質的產品,瞄準的就是將來可能十年的 Web 部署方案,實際體驗下來,仍是有不少問題的,首先就是兼容性問題,嘗試了多款 Web 程序,Unit 對於單入口程序的兼容還算不錯,可是對於複雜的多入口程序目前存在或多或少的兼容性問題;性能方面,對於 PHP 的性能相比 PHP-FPM 並無很大提升,反而因爲沒有 Cache 支持,實際使用時表現遠不如傳統部署方案。

在 Unit 推崇的自動化部署方面,Unit 推行的 Api 配置方式爲 GUI 動態部署創造了基礎,多版本、多語言兼容更是爲其將來創造了無限可能。然而,Nginx + Unit 的組合與傳統的 靜態+反代 模式並無本質的區別,在自動化應用部署領域,Unit 落後於 Docker Kubernetes 不是一點點。固然總的來講,我對 Unit 的前景仍是充滿信心的,也會不斷關注其開發進程。

轉載
感謝做者:DCC的小窩
原文連接:https://dcc.cat/lemur.html

相關文章
相關標籤/搜索