Nginx Unit 与 LEMUR 新架构

从 LAMP、LEMP 到 LEMUR

从 20 世纪 90 年代开始,LAMP 架构成为了部署 Web 应用程序最有名和最值得信赖的方法。LAMP 是 Linux,Apache,MySQL和 PHP 的首字母缩写。直至今日,Apache 经过不断迭代,依旧作为一个成熟、稳定、强大的 Web 架构被广为使用。

然而随着用于开发和交付现代 Web 应用程序的架构不断地追求轻便和简化。NGINX 横空出世,由于其简单性,高性能和可扩展性而成为大多数热门网站的首选网络服务器。这导致了 LEMP 堆栈 的广泛使用,NGINX(Engine-X)取代了 Apache。

时至今日,Web 开发的语言、框架越发多样化,以至于 LAMP、LNMP 中的关键一项 PHP 逐渐无法满足市场的需求,GO、Python、Ruby、NodeJS、JAVA 等越来越多的语言被用于 Web 开发与生产实践。虽然你依旧可以单纯的使用 Nginx 作为反向代理的工具处理 Python、NodeJS、JAVA 等 Web 程序,但是对应的部署难度和维护复杂性随着时间的推进变得越来越高。运维人员希望能够有一个统一的平台,高效、简单地处理各种各样的 Web 程序。

那么这个时候,一个全新的 Web 架构来到了我们眼前,那就是 LEMUR,即 Linux,NGINX,MariaDB,Unit 和 Redis

LEMUR 架构的安装

本次安装以 Debian 9.4 为例

基本库安装

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

关系型数据库是数据存储的基石。但是,许多轻量级应用程序使用的重量级复杂数据存储工具都不实用,或者速度不够快。2009年,Redis 实验室推出了开源、支持网络、基于内存、可选持久性的键值对存储数据库。今天,Redis 可能是最流行的键值对存储数据库,数百万个 Web 应用程序使用它。其轻巧简单的设计使其成为 LEMUR 架构的关键和非关系型数据库的首选。

很多人都说系统源打包的 redis 很老,谁能想到 stretch-backports 的版本直接是 4.0+ 新版呢。

apt install redis-server -t stretch-backports

MariaDB

在 Oracle 于 2010 年收购 Sun Microsystems 后,MySQL 的原始作者之一马上创建了 MariaDB。其开放式设计和协作开发确保世界上最流行的数据库保持开源并可供任何项目的工程师使用。此外,它与 MySQL 向后兼容。所有这些特征使 MariaDB 成为 LEMUR 架构中的关系数据库的首选。
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-pythonunit-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 [email protected] IDENTIFIED BY 'secure_password';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO [email protected];
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', '[email protected]');

/** 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 的前景还是充满信心的,也会不断关注其开发进程。

Last modification:April 13th, 2018 at 11:41 am

Leave a Comment

5 comments

  1. 神代綺凜

    太强了(

  2. 夜空大魔王

    谢谢分享

  3. 大佬

    我来抢第三(╯‵□′)╯︵┴─┴

  4. METO

    抢第二(

  5. 小霖

    抢第一 )