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

相关文章
相关标签/搜索