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,UnitRedis。

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

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-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 官方文档(https://unit.nginx.org/configuration/

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

扫码添加小助手微信,备注"公开课,来源简书",进入分享群

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,206评论 5 124
  • Awesome PHP 一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、W...
    guanguans阅读 5,753评论 0 47
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,956评论 1 66
  • 讲这个话题前先说一个现象。 下雨的时候雨中的人分为两种,有些人打伞,有些人不打伞。不打伞的人也分为两种,有一种有伞...
    米小读书阅读 657评论 0 2