nginx Unit 服务器
转自:
https://github.com/nginx/unit/pull/18/
感谢:
https://www.v2ex.com/t/389528
NGINX Unit
NGINX Unit 是一个动态的网络应用服务器,它的设计初衷就是可运行多种编程语言的。通过API可以轻巧,多面化的动态配置Unit。当工程师或操作者有需要时,可以轻松重构服务器已适配特殊的应用参数。
NGINX Unit 现在是beta版本。你现在虽然可以使用它,但建议仅用于测试环境,不建议用于生产环境。
本项目的源代码及分发均使用Apache 2.0 license。
核心功能
- 使用RESTful JSON API可完整的动态重配置服务器。
- 可同时运行多语言及多版本的应用。
- 动态语言的进程管理功能。 (敬请期待)
- TLS 支持 (敬请期待)
- TCP, HTTP, HTTPS, HTTP/2 路由和代理 (敬请期待)
Supported Application Languages
- Python
- PHP
- Go
- JavaScript/Node.js (敬请期待)
- Java (敬请期待)
- Ruby (敬请期待)
安装
系统需求
NGINX Unit 已被测试通过在以下系统上运行:
- Linux 2.6 或更高
- FreeBSD 9 或更高
- MacOS X
- Solaris 11
系统架构:
- i386
- amd64
- powerpc
- arm
NGINX Unit 支持不同的编程语言,你可以选择下面列出的版本:
- Python 2.6, 2.7, 3
- PHP 5, 7
- Go 1.6 or later
你可以在一个系统上运行不同版本的相同编程语言。
安装包
你可以在CentOS 7.0 和 Ubuntu 16.04 LTS。上直接安装 NGINX Next
CentOS 安装
- 在 /etc/yum.repos.d/unit.repo 目录下建立文件,并包含以下内容:
[unit]
name=unit repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
- 安装Nginx Unit:
# yum install unit
Ubuntu 安装
下载key key 用于签名NGINX, Inc. 的源和包。
添加秘钥到
apt
程序里。程序将会认证NGINX源的签名,这样将会消除警告。
# sudo apt-key add nginx_signing.key
- 将下面两行写入文件尾部。
/etc/apt/sources.list:
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
- 安装NGINX Unit:
# apt-get update
# apt-get install unit
源代码
本章将会完整的解释如何通过源代码安装NIGIX Unit。
获得源代码
你可以通过三种方法获得NGINX Unit的源代码: 从 NGINX, Inc.
的Mercurial源,Github,或从tarball获得源代码。
无论从那种方式获得源代码,你均可以在 unit 子目录中,找到我们的源代码。
Mercurial源
- 如果你没有安装Mercurial软件。你需要先下载并安装它。
示例:在 Ubuntu 系统下,运行下面的命令:
# apt-get install mercurial
- 下载NIGIX Unit的源代码:
# hg clone http://hg.nginx.org/unit
GitHub 源
如果你没有Git,请先移步Github帮助你安装Git
GitHub 帮助文档。下载NGINX Unit源:
# git clone https://github.com/nginx/unit
Tarball
NGINX Unit源代码请在以下链接获得
http://unit.nginx.org/download/
安装依赖软件
在配置和安装 NGINX Unit 之前,你必须现安装依赖文件和必要的工具。以及你希望运行的编程语言。如 Go,PHP,和 Python。
Ubuntu 依赖安装
- 安装 build tools。
# apt-get install build-essential
- 如果想支持Go语言应用,请安装
golang
包。
# apt-get install golang
- 如果想支持PHP语言应用,请安装
php-dev
和libphp-embed
包。
# apt-get install php-dev
# apt-get install libphp-embed
- 如果想支持Python语言应用,请安装
python-dev
包。
# apt-get install python-dev
CentOS 依赖
- 安装 build tools。
# yum install gcc make
- 如果想支持Go语言应用,请安装
golang
包。
# yum install golang
- 如果想支持PHP语言应用,请安装
php-devel
和libphp-embedded
包。
# yum install php-devel php-embedded
- 如果想支持Python语言应用,请安装
python-devel
包。
# yum install python-devel
配置源代码
使用NGINX Unit,你可以同时运行不同版本的编程语言。(Go,PHP,或者Python)。你需要配置一个separate(分区)。
NGINX Unit有不同的模块。下面的命令会给不同的模块创建分区。 Makefile
配置Go语言环境
NGINX Unit 会提供Go的依赖包,供你方便配置NGINX Unit内的Go使用环境。
- 使用下面的设置
GOPATH
的环境变量。
# export GOPATH=/home/user/go_apps
- 运行以下命令:
# ./configure go
configuring Go package
checking for Go ... found
+ go version go1.6.2 linux/amd64
+ Go package path: "/home/user/go_apps"
建立Go应用
定义Go的源文件,以适应NGINX Unit。
a. 在
import
区域,在尾行添加"unit"
。import {
"fmt"
"net/http"
"unit"
}
b. 在
main()
功能中, 注释http.ListenandServe
功能并添加unit.ListenAndServe
功能。func main() {
http.HandleFunc("/", handler)
//http.ListenAndServe(":8080", nil)
unit.ListenAndServe(":8080", nil)
建立 GO应用。
# go build
如果你直接运行Go应用,Go将会自动使用http.ListenandServe。如果使用NGINX Unit,启动Go程序,将会自动执行unit.ListenandServe。程序将会与Unit的路由进行交互。
配置PHP模块
配置PHP模块。( php.unit.so) 运行下面的命令进行自动配置PHP:
# ./configure php
如需要配置不同版本的PHP,请使用下面的命令:
# ./configure php --module=<prefix> --config=<script-name> --lib-path=<pathname>
当
--module
设置文件名的前缀。Unit被设置为特定的版本。( <prefix>.unit.so)。--config
钦定的文件名, php-config 特定版本的PHP。--lib-path
PHP的路径。
实例:下面这个命令将会生成一个模块 php70.unit.so 已适配PHP7.0
PHP 7.0:
# ./configure php --module=php70 \
--config=/usr/lib64/php7.0/php-config \
--lib-path=/usr/lib64/php7.0/lib64
configuring PHP module
checking for PHP ... found
+ PHP version: 7.0.22-0ubuntu0.16.04.1
+ PHP SAPI: [apache2handler embed cgi cli fpm]
checking for PHP embed SAPI ... found
+ PHP module: php70.unit.so
配置Python模块
配置特定的Python模块,已适配NGINX Unit。 (叫 python.unit.so) 。
在操作系统的根目录可以找到configure,使用下面的命令。
# ./configure python
如果需要配置其他的Python版本,请使用下面的命令。
# ./configure python --module=<prefix> --config=<script-name>
当
--module
会生成一个模块,设置文件名的前缀。Unit被设置为特定的版本, (就这么简单,将会生成一个
<prefix>.unit.so).--config
钦定的文件名 python-config 将会生成特定版本的模块。
示例:下面的命令将会生成一个名为 py33.unit.so 已适配
Python 3.3:
# ./configure php --module=py33 \
--config=python-config-3.3
configuring Python module
checking for Python ... found
checking for Python version ... 3.3
+ Python module: py33.unit.so
完成编译
当完成NGINX Unit的PHP, Python模块编译后, 运行下面的命令:
# make all
编译适用于Go语言的NGINX Unit:
- 确认
GOPATH
环境变量已被正确设置。
# go env GOPATH
# export GOPATH=<path>
- 完成编译:
# make go-install
从源代码安装
如果需要安装完整的全面模块和Go包,运行下面的命令:
# make install
配置
默认情况下,Control Socket内包含的的API来控制NGINX Unit
unit.control.sock.
应用
每个单独的应用,你都可以在NGINX Unit的配置文件中,使用JSON语法来定义一个
applications
。使用JSON语法来定义里面的内容,如使用的编程语言,需要的工作数,文件的本地路径,以及其他参数。
这个示例配置了一个PHP网站,名为 blogs 而这个网站的本地路径为。 /www/blogs/scripts。默认页面为 index.php。
{
...
"applications": {
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/blogs/scripts",
"index": "index.php"
}
}
}
监听器
当应用被通过HTTP访问时,你必须定义至少一个监听器 listeners
。监听器是一个IP地址和一个被定义的端口,当用户访问时,Unit的监听器会返回正确结果。IP地址可以是一个完整的IP地址(示例,
127.0.0.1:8300
)或(示例,*:8300
).
在这个示例中,端口 8300 的请求全部会被发送至 blogs
这个应用:
```
{
"listeners": {
"*:8300": {
"application": "blogs"
}
},
...
}
```
完整的JSON语法细节,请点击下面的链接。
JSON 详细的监听器配置和应用配置.
最小化配置
配置中至少需要包含一个监听器和一个应用配置:
{
"listeners": {
"*:8300": {
"application": "blogs"
}
},
"applications": {
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/blogs/scripts",
"index": "index.php"
}
}
}
创建配置文件
你可以创建一个配置文件,并且发送一个 PUT
请求。为了减少发生错误的可能,当使用 curl
命令式,请包含 -d
选项。
示例:创建一个完整的配置文件
通过下面的命令,可以创建一个初始的配置文件
start.json :
# curl -X PUT -d @/path/to/start.json \
--unix-socket ./control.unit.sock http://localhost/
示例:新建一个应用对象
通过 wiki.json 我们可以创建一个 wiki 应用。
# curl -X PUT -d @/path/to/wiki.json \
--unix-socket ./control.unit.sock http://localhost/applications/wiki
wiki.json 里包含了:
{
"type": "python",
"workers": 10,
"module": "wsgi",
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki"
}
显示配置的对象
要显示配置的对象,它被附加在curl
的URL内。
示例:显示完整的配置文件
如果你想显示完整的配置文件,你可以通过下面的指令来查看:
# curl --unix-socket ./control.unit.sock http://localhost/
{
"applications": {
"blogs": {
"type": "php",
"user": "nobody",
"group": "nobody",
"workers": 20,
"root": "/www/blogs/scripts",
"index": "index.php"
},
"wiki": {
"type": "python",
"user": "nobody",
"group": "nobody",
"workers": 10,
"path": "/www/wiki",
"module": "wsgi"
}
},
"listeners": {
"*:8300": {
"application": "blogs"
},
"*:8400": {
"application": "wiki"
}
}
}
示例:显示一个对象
显示 wiki 这个应用的配置,只需:
# curl --unix-socket ./control.unit.sock http://localhost/applications/wiki
{
"type": "python",
"workers": 10,
"module": "wsgi",
"user": "www",
"group": "www",
"path": "/www/wiki"
}
修改配置的对象:
要更改配置的对象,使用 curl
命令和-d
选项来实现特定的对象的JSON数据,然后发送一个PUT
请求。
示例:修改监听端口指向的应用
在端口 *:8400上修改 application
应用指向 wiki-dev:
# curl -X PUT -d '"wiki-dev"' --unix-socket ./control.unit.sock \
'http://localhost/listeners/*:8400/application'
{
"success": "Reconfiguration done."
}
示例:修改应用的本地路径
修改root
对象的 blogs 应用的本地路径至
/www/blogs-dev/scripts:
# curl -X PUT -d '"/www/blogs-dev/scripts"' \
--unix-socket ./control.unit.sock \
http://localhost/applications/blogs/root
{
"success": "Reconfiguration done."
}
删除对象
要删除配置的对象,你可以通过 curl
发送一个DELETE
请求到对象目录。
示例:删除监听器
删除对 *:8400 端口的监听:
# curl -X DELETE --unix-socket ./control.unit.sock \
'http://localhost/listeners/*:8400'
{
"success": "Reconfiguration done."
}
监听器和应用对象
监听器
对象 | 描述 |
---|---|
<IP地址>:<端口> |
IP地址和端口需在不同的Unit监听器上均需要配置应用的名字 ,IP地址可以是完整的 (127.0.0.1:8300 ) 或者(*:8300 ). |
application |
应用名。 |
示例:
"*:8300": {
"application": "blogs"
}
Go语言应用
对象 | 描述 |
---|---|
type |
应用的编程语言 (go )。 |
workers |
应用的工作数量。 |
executable |
完整的本地路径。 |
user (optional) |
运行进程的用户,如未定义,则默认(nobody)。 |
group (optional) |
用户所在的用户组 。如未定义,则默认。 |
示例:
"go_chat_app": {
"type": "go",
"executable": "/www/chat/bin/chat_app",
"user": "www-go",
"group": "www-go"
}
PHP语言应用
对象 | 描述 |
---|---|
type |
应用的编程语言 (php ). |
workers |
应用的工作数量。 |
root |
文件的本地路径。 |
index |
默认的index文件路径。 |
script (optional) |
访问Unit内任意的URL均会运行,填写路径将不要填写物理路径,请填写虚拟路径。 |
user (optional) |
运行进程的用户,如未定义,则默认(nobody)。 |
group (optional) |
用户所在的用户组 。如未定义,则默认。 |
示例:
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/blogs/scripts",
"index": "index.php",
"user": "www-blogs",
"group": "www-blogs"
},
Python语言应用
Object | Description |
---|---|
type |
应用的编程语言 (python )。 |
workers |
应用的工作数量。 |
path |
wsgi.py 的路径。 |
module |
必填。目前只支持 wsgi 。 |
user (optional) |
运行进程的用户,如未定义,则默认(nobody)。 |
group (optional) |
用户所在的用户组 。如未定义,则默认。 |
示例:
"shopping_cart": {
"type": "python",
"workers": 10,
"path": "/www/store/cart",
"module": "wsgi",
"user": "www",
"group": "www"
},
完整示例:
{
"listeners": {
"*:8300": {
"application": "blogs"
},
"*:8400": {
"application": "wiki"
},
"*:8401": {
"application": "shopping_cart"
},
"*:8500": {
"application": "go_chat_app"
}
},
"applications": {
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/blogs/scripts",
"user": "www-blogs",
"group": "www-blogs",
"index": "index.php"
},
"wiki": {
"type": "python",
"workers": 10,
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki"
},
"shopping_cart": {
"type": "python",
"workers": 10,
"module": "wsgi",
"user": "www",
"group": "www",
"path": "/www/store/cart"
},
"go_chat_app": {
"type": "go",
"user": "www-chat",
"group": "www-chat",
"executable": "/www/chat/bin/chat_app"
}
}
}
NGINX一起使用
和NGINX一起使用
配置NGINX来进行静态文件的处理和接受代理的请求。
NGINX服务器将直接处理静态文件的访问请求,动态文件的处理将会直接转发到NGINX Unit。
新建一个上传模块,在NGINX的配置中,将http的请求转发给Unit,示例:
upstream unit_backend {
server 127.0.0.1:8300;
}
新建或修改NGINX的配置文件 server
块和 location
块 。指定的静态文件的路径和上传模块。
示例 1
这个例子适用于基于PHP编程语言开发的程序。,全部的URL请求,如已.php结尾,均会被转发至Unit服务器,其他的全部文件将会直接被服务器返回文件:
server {
location / {
root /var/www/static-data;
}
location ~ \.php$ {
proxy_pass http://unit_backend;
proxy_set_header Host $host;
}
}
示例 2
All other requests will be proxied to Unit:
下面的应用,全部都静态文件需要被放置在/var/www/files
目录下,在前端调用时,请直接使用/static
。
server {
location /static {
root /var/www/files;
}
location / {
proxy_pass http://unit_backend;
proxy_set_header Host $host;
}
}
相关的NGINX 文档将会在http://nginx.org提供。
相关的支持和更多的功能将在https://www.nginx.com上提供。
安全和代理Unit API
默认情况下,Unit的API将会在Unix domain socket下。如果你希望API可以被远程访问,你需要使用NGINX配置代理。
NGINX 可以提供安全的、可信的和可控制的API
使用下面的示例配置来配置NGINX:
server {
# Configure SSL encryption
server 443 ssl;
ssl_certificate /path/to/ssl/cert.pem;
ssl_certificate_key /path/to/ssl/cert.key;
# Configure SSL client certificate validation
ssl_client_certificate /path/to/ca.pem;
ssl_verify_client on;
# Configure network ACLs
#allow 1.2.3.4; # Uncomment and change to the IP addresses and networks
# of the administrative systems.
deny all;
# Configure HTTP Basic authentication
auth_basic on;
auth_basic_user_file /path/to/htpasswd.txt;
location / {
proxy_pass http://unix:/path/to/control.unit.sock
}
}
贡献
NGINX Unit的发布和分发均使用Apache 2.0 license。
如果想贡献自己的力量,你可以选择通过邮件unit@nginx.org
或者在Github上提交PRhttps://github.com/nginx/unit。
如果在中文翻译方面需要改近请联系@tuzimoe。
疑难解答
Unit 日志一般在默认的位置,可以在/var/log/unit.log
中找到。
Log 文件的位置也可以通过运行 unitd --help
来快速定位。
详细的Debug日志可以通过输入命令来获得:
./configure --debug
输入完命令后,请务必重新编译和重装NGINX Unit。
请注意,debug日志的内容将会以快速的增长。
社区邮箱的列表将会在unit@nginx.org上找到。
订阅邮箱列表,可以通过发送任何内容至订阅
unit-subscribe@nginx.org
或直接点击此处订阅
没错就是我。
nginx Unit 服务器的更多相关文章
- svn + nginx unit + python3自动化发布web服务方法
本周将python web服务管理更换成nginx unit以后发现接口性能有了明显的提升,访问速度快了不少.不过有个很大的问题就是使用svn自动化发布以后,服务并没有刷新使用新的代码运行,而又不懂得 ...
- 关于nginx unit服务非正常关闭后,无法重新启动问题的处理
昨天在前领导技术大牛吕哥的帮忙下,python服务管理从nginx+supervisor+uwsgi+python3改为了轻便结构nginx + unit + python3,部署和配置起来顿时轻松起 ...
- Nginx unit 源码安装初体验
Nginx unit 源码安装初体验 上次介绍了从yum的安装方法(https://www.cnblogs.com/wang-li/p/9684040.html),这次将介绍源码安装,目前最新版为1. ...
- 在CentOS上搭建最^1024基本的Nginx反向服务器
昨天有过去的同事突然问我,他在CentOS7上试验搭建反向服务器死活不成功.现将最简单的搭建步骤分享下: 0. 环境介绍 本次搭建的集群包括以下服务器 192.168.1.107:nginx反向服务器 ...
- 20步打造最安全的NGINX WEB服务器
Nginx 是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Wind ...
- 搭建Nginx图片服务器
搭建Nginx图片服务器 Part-I 安装Nginx 安装PCRE 下载 ngx_cache_purge 并解压,用来清除缓存 下载Nginx并解压 cd nginx-1.7.7 编译,--pref ...
- 构建高效安全的Nginx Web服务器
一 为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早.Apache HTTP Server(简称Apache)是世界使用排 ...
- Mac使用nginx+rtmp服务器
一.安装Homebrow 已经安装了brow的可以直接跳过这一步.执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...
- Linux 安装及配置 Nginx + ftp 服务器
Nginx 安装及配置 一.Nginx 简介: Nginx("engine x") 是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web和 反向代理服务器, ...
随机推荐
- Android开发_Animation
新建项目: http://www.cnblogs.com/hongten/gallery/image/112163.html 项目结构: http://www.cnblogs.com/hongten/ ...
- cadence allegro pcb模块设计复用
cadence allegro pcb模块设计复用 转载▼ 标签: 复用 模块 原理图 元件 文件 杂谈 分类: PCB技术 在你遇到如上图所示的dsp阵列PCB时,如果你的layout软件支持模块复 ...
- 【Hadoop基础教程】3、Hadoop之伪分布式环境搭建(转)
伪分布式模式即单节点集群模式,所有的守护进程都运行在同一台机器上.这种模式下增加了代码调试功能,可以查看内存.HDFS文件系统的输入/输出,以及与其他守护进程交互.以hadoop用户远程登录K-Mas ...
- 使用wifi连接eclipse进行android程序调试
首先手机必须是root过的.能够使用百度一键root工具. 然后,在手机中打开这个终端(terminal)应用,输入例如以下命令: su setprop service ...
- 【Python学习】之yagmail库实现发送邮件
上代码: import yagmail sendmail = 'xxx@126.com' sendpswd = 'xxx' receivemail = 'xxx@qq.com' # 连接邮箱服务器 y ...
- Java 获取指定日期的方法汇总
import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; impo ...
- C语言进行站点开发之cgi
安装Apach 配置ApacheRuntime 以下的过程中一直点击next 配置CGI,放开配置:AddHandler cgi-script .cgi watermark/2/text/aHR ...
- j2EE的web.xml详解
https://blog.csdn.net/changqing5818/article/details/49928231 https://www.cnblogs.com/ClassNotFoundEx ...
- 【BZOJ3230】相似子串 后缀数组+二分+RMQ
[BZOJ3230]相似子串 Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出 ...
- Intersection(计算几何)
Intersection Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)To ...