尝试在 CentOS7 上运行 Nginx Unit
你好。
我是Mandai,负责Wild 开发团队。
前阵子介绍了大家最喜欢的Nginx新家族“Nginx Unit”。
我对如何使用 Nginx Unit 做了一些研究。
目录
Nginx 单元是什么?
Nginx Unit 与 Nginx 一样,是充当 Web 应用服务器角色的中间件。
以下是 Nginx Unit 的特点:
- 配置文件可动态修改(无需重启)
- 单个 Nginx 可以运行多种编程语言的服务
据说有一点。
这次我想实际安装一下,感受一下。
安装方法
对于CentOS,可以通过yum安装,所以非常简单。
只是官方文档中的步骤操作
首先,注册 Nginx Unit 存储库。
sudo vi /etc/yum.repos.d/unit.repo # 粘贴以下内容 [unit] name=unit repo baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/ gpgcheck =0启用=1
目前前期准备工作已经完成。
接下来,运行 yum 命令。
yum 安装单元 已加载插件:fastestmirror、langpacks 从缓存的主机文件加载镜像速度 * 基础:ftp.riken.jp * epel:mirror.dmmlabs.jp * 附加:ftp.riken.jp * nux-dextop:li.nux *。 remi-safe:mirror.bebout.net * 更新:ftp.riken.jp 解决依赖关系 --> 执行事务确认。 ---> 安装包unit.x86_64 0:0.1-1.el7.ngx --> 处理依赖项:libphp5-5.4.so()(64位)的包:unit-0.1-1。 > 执行交易确认。 ---> 安装软件包 php-embedded.x86_64 0:5.4.16-42.el7 --> 处理依赖项:php-common(x86-64) = 5.4.16-42.el7 软件包:php-embedded-5.4。 16-42.el7.x86_64 --> 执行交易确认。 ---> 安装软件包 php-common.x86_64 0:5.4.16-42.el7 --> 处理依赖项:libzip.so.2()(64bit) 的软件包:php-common- 5.4.16-42.el7 .x86_64 --> 执行交易确认。 ---> 已安装软件包 libzip.x86_64 0:0.10.1-8.el7 --> 已完成依赖关系解析。 依赖关系已解决 ~ 已省略 ~ 感谢您安装 NGINX Unit,您可能需要加载演示配置并检查几个应用程序: # serviceunitd start # serviceunitd Restoreconfig /usr/share/doc/unit/examples/example .config #curl http://localhost:8300/ #curl http://localhost:8400/ 在线文档位于 http://unit.nginx.org/ ------------- ---- ---------------------------------------------------------- ---- --- 验证:php-embedded-5.4.16-42.el7.x86_64 1/4 验证:libzip-0.10.1-8.el7.x86_64 2/4 验证:php-common- 5.4.16-42.el7 .x86_64 3/4 验证:unit-0.1-1.el7.ngx.x86_64 4/4 安装:unit.x86_64 0:0.1-1.el7.ngx 安装的依赖项:libzip.x86_64 0:0.10.1-8。 el7 php-common.x86_64 0:5.4.16-42.el7 php-embedded.x86_64 0:5.4.16-42.el7 完成!
PHP(和版本 5!)出现在依赖项检查中是一个谜(可能是因为它还提供了执行环境,它是从基础存储库中拉取的)。
如果你已经安装了PHP,或者你想在PHP7环境中使用它,源码安装似乎更好。
源码安装的情况下,需要根据执行环境准备并编译库。
特别是在使用 PHP7 时,使用 yum 安装似乎很困难,所以此处的步骤进行安装
暂时启动服务
在上一个 yum 安装屏幕的末尾,有一个启动服务的命令,所以让我们先尝试运行它。
虽然需要CentOS7,但是是使用service命令编写的,所以我就给大家展示一下我最近学到的systemctl命令!
# 首先启动服务 sudo systemctl startunitd # 恢复配置文件 $ serviceunitdrestoreconfig /usr/share/doc/unit/examples/example.config 从 /usr/share/doc/unit/examples/example.config 恢复配置.. {“成功”:“重新配置完成。”
对于第二个命令,我不知道如何将其重写为systemctl命令,所以我简单地使用了service命令。
顺便说一句,如果您将第一个命令作为服务命令运行,它将如下所示:
sudo serviceunitdstart 重定向到/bin/systemctlstartunitd.service
它运行正常,但它一直告诉我它是用systemctl命令执行的。
但是,当我附加restoreconfig执行时,根本没有这样的注释,所以我想知道service命令是否是正确的方法?我有这样的感觉。
如果你已经做到了这一点,它已经正常启动了,所以你可以使用curl命令检查操作...但这里是关键点:对于Nginx,上述命令以相反的顺序执行.
Nginx在更新配置文件时总是需要重新启动,因此在运行过程中难免会出现难以更改设置的情况。
可能很容易被忽视,但这正是您可以一睹 Nginx Unit 优势的时刻。
现在让我们再次尝试访问 Web 服务器。
$ 卷曲 http://localhost:8300/phpinfo() [email protected]。 ] 。
$curl http://localhost:8400/ 2017-10-17 02:11:15 AM ENV 变量:LANG ja_JP.utf8 PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr /bin UNITD_OPTIONS --log /var/log/unitd.log --pid /run/unitd.pid
端口 8300 似乎作为普通 Web 服务器运行,并且 phpinfo() 正在执行。
我目前不确定端口 8400,但看起来它正在显示执行环境设置。
这个端口的奥秘稍后会解释。
看起来安装成功了,接下来我们检查一下设置。
检查 Nginx 单元设置
目前,唯一出现的 Nginx Unit 配置文件是 /usr/share/doc/unit/examples/example.config,所以让我们看一下它。
less /usr/share/doc/unit/examples/example.config { "applications": { "example_php": { "type": "php", "user": "nobody", "workers": 2, "root ": "/usr/share/doc/unit/examples/php-app", "index": "index.php" }, "example_python": { "type": "python", "user": "nobody" , "workers": 2, "path": "/usr/share/doc/unit/examples/python-app", "module": "wsgi" }, "example_go": { "type": "go", “用户”:“无人”,“可执行文件”:“/tmp/go-app”}},“监听器”:{“*:8300”:{“应用程序”:“example_php”},“*:8400”: { "application": "example_python" }, "*:8500": { "application": "example_go" } } }
当我打开该文件时,它是一个 JSON 文件。
如果是JSON文件,配置结构就很容易理解。
前面出现的“http://localhost:8400”的真实身份似乎是python程序的备用URL。
如果您阅读文档,您将能够通过套接字通信检查设置。
是这样的。
卷曲 --unix-socket /path/to/socket http://localhost/
然而,为了做到这一点,我们需要知道套接字文件的位置,所以我想从进程端跟踪这个区域。
首先,使用 ps 命令识别 Nginx Unit 进程。
ps auxwwwf | grep [u]nit root 5821 0.0 0.0 18256 636 ? Ss 00:21 0:00 单位:主 [/usr/sbin/unitd --log /var/log/unitd.log --pid /run/unitd .pid] 无人 5824 0.0 0.0 18256 680 ? S 00:21 0:00 \_ 单位:控制器无人 5825 0.0 0.0 18256 680 ? S 00:21 0:00 \_ 单位:路由器
Nginx Unit 似乎运行在三个进程中:守护进程、控制器和路由器。
根据设置的不同,它可能会增加或减少,但目前是这样设置的。
接下来,使用 lsof 命令检查进程 5821 保存的文件。
lsof -p 5821 命令PID 用户FD 类型设备大小/关闭节点名称unitd 5821 root cwd DIR 253,0 4096 2/unitd 5821 root rtd DIR 253,0 4096 2/unitd 5821 root txt REG 253,0 397232 806046 /usr/ SBIN/UNITD UNITD 5821 ROOT MEM REG 253,0 37352 805753 /USR/LIB64/LIBNSSS_SSSS.SOSO.SO.2 UNITD 5821 root Mem Reg 253,0 62184 78784787847/usr/usr/lib64/libnsss_files-files-files-2.17.so lim uite uits uits unitd 582117.so uitsd 58211 rity d8211。 , 0 2118128 787829 /usr/lib64/libc-2.17.so unitd 5821 根内存 REG 253,0 143944 787855 /usr/lib64/libpthread-2.17.so unitd 5821 根内存 REG 253,0 19776 787835 /lib dl - 2.17.sounitd 5821根内存REG 253,0 44448 787859 /usr/lib64/librt-2.17.sounitd 5821根内存REG 253,0 1141928 787837 /usr/lib64/libm-2.17.sounitd 5821根内存REG 253 , 0 155464 806682 /usr/lib64/ld-2.17.sounitd 5821 root 0u CHR 1,3 0t0 1028 /dev/nullunitd 5821root 1u CHR 1,3 0t0 1028 /dev/nullunitd 5821root 2w REG 253,0 258231 136119 /var/log/unitd.log unitd 5821 root 3u a_inode 0,9 0 5832 [eventpoll]unitd 5821 root 4u a_inode 0,9 0 5832 [signalfd]unitd 5821 root 5u a_inode 0,9 0 5832 [eventfd]unitd 5821 root 6u unix 0xffff8800783ba400 0t0 48362 /var/run/control.unit.sock # <- 这个unitd 5821 root 7w REG 253,0 258231 136119 /var/log/unitd.log unitd 5821 root 8u unix 0xffff880023ebb400 0t0 49423 插座单元 5821 root 9u unix 0xffff880023ebb800 0t0 49424 套接字unitd 5821 root 12u unix 0xffff8800b1954800 0t0 49428 套接字unitd 5821 root 13u unix 0xffff880023eb9c00 0t0 49430 套接字
显然“/var/run/control.unit.sock”是套接字文件,因此检查设置的命令如下。
curl --unix-socket /var/run/control.unit.sock http://localhost/ { "applications": { "example_php": { "type": "php", "user": "nobody", "工人”:2,“根”:“/usr/share/doc/unit/examples/php-app”,“索引”:“index.php”},“example_python”:{“类型”:“python”, “用户”:“无人”,“工人”:2,“路径”:“/usr/share/doc/unit/examples/python-app”,“模块”:“wsgi”},“example_go”:{“类型": "go", "用户": "无人", "可执行文件": "/tmp/go-app" } }, "听众": { "*:8300": { "应用程序": "example_php" } , "*:8400": { "application": "example_python" }, "*:8500": { "application": "example_go" } } }
我觉得用curl命令检查Web服务器设置是很新的,但返回的内容与“/usr/share/doc/unit/examples/example.config”相同。
这意味着测试配置文件已经成功加载。
接下来,我想更改设置。
更改 Nginx 单元设置
查看
官方文档引用文档,
# 示例:创建完整配置curl -X PUT -d @/path/to/start.json \ --unix-socket ./control.unit.sock http://localhost/ # 示例:创建应用程序对象curl - X PUT -d @/path/to/wiki.json \ --unix-socket ./control.unit.sock http://localhost/applications/wiki
当应用第一个JSON文件时,我很容易理解它,但第二种设置方法很难。
您只能将 JSON 应用于某个部分,但您可以使用 URL 指定要应用哪个部分...! !
我还想尝试读取我自己创建的 JSON 文件的测试。
我只是准备了一个如下所示的 JSON 文件。
{
"type": "php",
"user": "nobody",
"workers": 4,
"root": "/var/www/html",
"index": "index.php"
}
这是一个简单的设置,使文档根目录位于“/var/www/html”下,但是它会起作用吗?
将此文件保存为“/home/hogehoge/test-php.json”。
让我们使用curl 命令将其发送到Nginx 单元!
直接将其添加到应用程序下。
curl -X PUT -d @/home/hogehoge/test-php.json --unix-socket /var/run/control.unit.sock http://localhost/applications/test { "success": "重新配置完成。 ” }
看来注册成功了。
另请检查当前设置。
curl --unix-socket /var/run/control.unit.sock http://localhost/ { "applications": { "example_php": { "type": "php", "user": "nobody", "工人”:2,“根”:“/usr/share/doc/unit/examples/php-app”,“索引”:“index.php”},“example_python”:{“类型”:“python”, “用户”:“无人”,“工人”:2,“路径”:“/usr/share/doc/unit/examples/python-app”,“模块”:“wsgi”},“example_go”:{“类型": "go", "用户": "无人", "可执行文件": "/tmp/go-app" }, "测试": { "类型": "php", "用户": "无人", “workers”:4,“root”:“/var/www/html”,“index”:“index.php”} },“listeners”:{“*:8300”:{“application”:“example_php” }, "*:8400": { "application": "example_python" }, "*:8500": { "application": "example_go" } } }
看起来已经添加成功了。
现在,我想检查一下curl命令是否正常工作...顺便说一下,如果Listener没有注册,则不会被路由,所以我还会添加一个用于路由的JSON文件。
{
“应用”:“测试”
}
像以前一样使用curl 注册上述JSON。
curl -X PUT -d @/home/hogehoge/test-php-listener.json --unix-socket /var/run/control.unit.sock http://localhost/listeners/*:8301 { “成功”: “重新配置完成。”
最后一个 URL 通常是不可能的,但严格来说它不是一个 URL,所以不必太担心。
如果返回成功,请检查整个配置。
curl --unix-socket /var/run/control.unit.sock http://localhost/ { "applications": { "example_php": { "type": "php", "user": "nobody", "工人”:2,“根”:“/usr/share/doc/unit/examples/php-app”,“索引”:“index.php”},“example_python”:{“类型”:“python”, “用户”:“无人”,“工人”:2,“路径”:“/usr/share/doc/unit/examples/python-app”,“模块”:“wsgi”},“example_go”:{“类型": "go", "用户": "无人", "可执行文件": "/tmp/go-app" }, "测试": { "类型": "php", "用户": "无人", “workers”:4,“root”:“/var/www/html”,“index”:“index.php”} },“listeners”:{“*:8300”:{“application”:“example_php” }, "*:8400": { "application": "example_python" }, "*:8500": { "application": "example_go" }, "*:8301": { "application": "test" } } }
看来设置已正确反映。
使用curl命令或浏览器检查
(该文档根目录下有使用fuelPHP开发的内容,但没有问题)。
删除 Nginx 单元设置
对于更改,curl HTTP方法是使用PUT发送的,因此对于删除,当然使用DELETE方法。
即使您不看官方文档,似乎您也会掌握它的窍门,但让我们检查一下以确保确定。
使用curl进行删除的curl命令如下。
curl -X DELETE --unix-socket ./control.unit.sock \ 'http://localhost/listeners/*:8400'
我想删除之前添加的侦听器设置。
curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/listeners/*:8301 { "success": "重新配置完成。"
是的,看来您已成功删除它。
这部分非常简单。
顺便说一句,由于输入和输出都是 JSON,因此保存设置也非常容易。
# 将curl结果写入文件curl --unix-socket /var/run/control.unit.sock http://localhost/> /path/to/unitd.conf.json # 检查是否可以写入 cat /路径/to/unitd.conf.json { "applications": { "example_php": { "type": "php", "user": "nobody", "workers": 2, "root": "/usr/共享 /doc/unit/examples/php-app", "index": "index.php" }, "example_python": { "type": "python", "user": "nobody", "workers": 2 , “path”: “/usr/share/doc/unit/examples/python-app”, “module”: “wsgi” }, “example_go”: { “type”: “go”, “user”: “nobody " , "可执行文件": "/tmp/go-app" }, "test": { "type": "php", "user": "nobody", "workers": 4, "root": "/var /www/html", "index": "index.php" } }, "listeners": { "*:8300": { "application": "example_php" }, "*:8400": { "application": " example_python" }, "*:8500": { "application": "example_go" } } } # 重新启动Nginx Unit systemctl restart unitd # 检查设置时,里面没有任何内容curl --unix-socket /var/ run/control.unit.sock http://localhost/ { "listeners": {}, "applications": {} } # 将 JSON 数据输出插入到前面的文件中 curl -X PUT -d @/root/unitd. conf.json --unix-socket /var/run/control.unit.sock http://localhost { "success": "重新配置完成。" } # 检查设置是否已反映curl --unix-socket /var / run/control.unit.sock http://localhost/ { "applications": { "example_php": { "type": "php", "user": "nobody", "workers": 2, "root" : "/usr/share/doc/unit/examples/php-app", "index": "index.php" }, "example_python": { "type": "python", "user": "nobody", "工人”:2,“路径”:“/usr/share/doc/unit/examples/python-app”,“模块”:“wsgi”},“example_go”:{“类型”:“go”,“用户": "nobody", "executable": "/tmp/go-app" }, "test": { "type": "php", "user": "nobody", "workers": 4, "root " : "/var/www/html", "index": "index.php" } }, "listeners": { "*:8300": { "application": "example_php" }, "*:8400": { “应用程序”:“example_python”},“*:8500”:{“应用程序”:“example_go”} } }
成功了!
概括
您如何看待这个有前途的新人 Nginx Unit?
官方文档还描述了与 Nginx 执行反向代理并通过套接字通信向 Nginx 单元发送请求的组合,并且很容易重写设置以单独使用,并且这些设置不会在启动时反映出来,但是,我认为它很好地补充了 Nginx 的不灵活性。
版本是0.1。
当然是测试版。
我很期待看到它未来会如何完善。
就是这样。