210
15
中间件最简单的定义是,位于两个系统之间的组件。对客户端
/
服务器应用来说,中间
件就是客户端和服务器之间那条斜线,即负责在二者之间通信的组件。
处理和集成
API
时使用这种方案有诸多好处。首先,中间件能在很大程度上促进分布式
系统的开发,因为它能调和不同的部分(即这里所说的不同的
API
)。中间件做到这一
点的方式是把各个服务的细节隐藏起来,转而提供一系列通用的而且针对特定领域的端
点。
架构中的不同服务和应用都直接与中间件通信,中间件负责根据所请求的方法和资源把
流量分发给不同的
API
此时,如果某个
API
变了,我们无需修改使用那个
API
的所有应用和服务,只需改动中
间件,修改逻辑,处理新的调用和方法。各个应用可以继续调用之前使用的方法。
使用中间件的另一个好处是,可以在整个架构中的一个点监控应用是如何使用不同
API
的。我们可以清楚地了解各个组件的流量,因为所有调用和请求都流经中间件。这意味着,
我们不用为各个服务开发和维护不同的分析方案。
REST
式应用中,中间件还能起到
REST
连接器的作用,负责把非
REST
式组件连接
起来,比如说陈旧的服务,甚至是集成到架构中的外部服务,例如
WebSockets
或流服务。
配置
Nginx
反向代理
在本节,我们将在
OpenShift
中安装
Nginx
,让它为我们的
API
服务。
你可以使用第
10
章安装的客户端工具创建
OpenShift
应用。我们把这个应用命名为
nginx
,而且使用一个“自助式”套筒(
cartridge
)——
diy-0.1
$
rhc app create nginx diy-0.1
然后,查看这个新建应用的信息:
$
rhc app show -a nginx
OpenShift
中打开这个应用的页面,右边有个“
Remote Access
”区域。复制那里的
ssh
命令,打开一个安全
shell
会话,连接你的应用。这个命令形如:
$
ssh
<random-strings>
@nginx-
<your-namespace>
.rhcloud.com
OpenShift
提供了很多环境变量,你可以使用它们配置自己的应用,让应用正确地运
行。
OpenShift
网站对这些环境变量做了详细介绍(
http://uri.ac/IeQY
)。
优雅地弹性伸缩
211
接下来可以安装
Nginx
了。进入
tmp
目录,下载
Nginx
源码:
$
cd $OPENSHIFT_TMP_DIR
$
wget http://nginx.org/download/nginx-1.7.8.tar.gz
$
tar zxf nginx-1.7.8.tar.gz
$
cd nginx-1.7.8
从源码安装可能需要一些库。如果执行下述命令:
$
./configure --prefix=$OPENSHIFT_DATA_DIR
会得到下述错误:
checking for PCRE library ... not found
checking for PCRE library in /usr/local/ ... not found
checking for PCRE library in /usr/include/pcre/ ... not found
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found
./configure: error: the HTTP rewrite module requires the PCRE
library.
You can either disable the module by using
--without-http_rewrite_module option, or install the PCRE library
into the system, or build the PCRE library statically from the
source with Nginx by using --with-pcre=<path> option.
我们不能在这个系统中安装
PCRE
库,因此要直接从源码编译:
$
cd $OPENSHIFT_TMP_DIR
$
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/
pcre/pcre-8.36.tar.bz2
$
tar jxf pcre-8.36.tar.bz2
现在,可以根据需求修改
makefile
。例如,启用
Nginx
支持的几个标准的和可选的
HTTP
模块。完整的模块列表参见
Nginx
的文档(
http://nginx.org/en/docs/
)。我们暂时
使用默认配置,直接执行
configure
命令:
$ cd nginx-1.7.8
$ ./configure --prefix=$OPENSHIFT_DATA_DIR
--with-pcre=$OPENSHIFT_TMP_DIR/pcre-8.36
如果运行顺利,会看到下述输出:
Configuration summary
+ using PCRE library: /tmp//pcre-8.36
+ OpenSSL library is not used
+ md5: using system crypto library
+ sha1: using system crypto library
+ using system zlib library
nginx path prefix: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime/"
nginx binary file: "/var/lib/stickshift/
212
15
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//sbin/nginx"
nginx configuration prefix: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//conf"
nginx configuration file: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//
conf/nginx.conf"
nginx pid file: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//
logs/nginx.pid"
nginx error log file: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//
logs/error.log"
nginx http access log file: "/var/lib/stickshift/
c45cdc9a27944dc5b1cd7cb9e5c9f8c7/nginx/runtime//
logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
这些信息是配置
Nginx
所必须的。现在可以编译和安装了:
$
make install
安装完成后,进入
Nginx
的安装目录,即
$OPENSHIFT_DATA_DIR
目前,
OpenShift
会为你的应用分配一个内网
IP
地址和端口,分别通过
$OPENSHIFT_
DIY_IP
$OPENSHIFT_DIY_PORT
环境变量查看。这两个值可能会变,因此在
nginx.
conf
文件中要使用
env
指令直接获取环境变量。注意,只能在配置的主区中使用
env
用环境变量,在
http
server
location
中则不行。
下面编辑
Nginx
的配置文件:
$
nano $OPENSHIFT_DATA_DIR/conf/nginx.conf
listen
的值改为:
http {
...
server {
listen $OPENSHIFT_IP:$OPENSHIFT_PORT;
server_name localhost;
...
}
...
}
然后复制修改后的配置文件:
优雅地弹性伸缩
213
$
mv $OPENSHIFT_DATA_DIR/conf/nginx.conf \
$OPENSHIFT_DATA_DIR/conf/nginx.conf.template
我们只是在
Nginx
的配置中绑定了动态的内网
IP
地址和端口。接下来,我们要在调用
start
操作钩子时修改
$OPENSHIFT
_
<cartridge-name>
_
IP
$OPENSHIFT
_
<cartridge-
name>
_
PORT
的值。
为了能自动启动应用,我们要编辑本地的
.openshift/action_hooks/start
文件,在里面添
${OPENSHIFT_RUNTIME_DIR}/nginx/sbin/nginx
。退出
ssh
会话,然后在你的设备中
执行下述命令:
$
cd nginx
$
nano .openshift/action_hooks/start
#!/bin/bash
# The logic to start up your application should be put in this
# script. The application will work only if it binds to
# $OPENSHIFT_DIY_IP:8080
# nohup $OPENSHIFT_REPO_DIR/diy/testrubyserver.rb
# $OPENSHIFT_DIY_IP $OPENSHIFT_REPO_DIR/diy |
# & /usr/bin/logshifter -tag diy &
#
sed -e "s/`echo '$OPENSHIFT_IP:$OPENSHIFT_PORT'`/`
echo $OPENSHIFT_DIY_IP:$OPENSHIFT_DIY_PORT`/"
$OPENSHIFT_DATA_DIR/conf/nginx.conf.template >
$OPENSHIFT_DATA_DIR/conf/nginx.conf
nohup $OPENSHIFT_DATA_DIR/sbin/nginx >
$OPENSHIFT_DIY_LOG_DIR/server.log 2>&1 &
最后,执行下述命令:
$
git add .
$
git commit -a -m "start nginx when starting up the app"
$
git push
现在,在浏览器中打开
http://nginix-.rhcloud.com
,你会看到
Nginx
的欢迎页面(见图
15-1
)。
214
15
15-1
Nginx 的欢迎页面
如果执行
start
脚本有问题,可以使用
rhc tail -a nginx
命令排错。
此外,每次修改配置之后可能要执行下述命令,让
Nginx
强制重新加载配置:
$
$OPENSHIFT_DATA_DIR/sbin/nginx -s reload
接下来,我们要把
Nginx
配置成反向代理。我们要让
Nginx
做以下事情:
把请求传给代理服务器。
分布不同服务发来的内容。
配置不同服务发来的响应。
具体而言,我们要配置
Nginx
,让它代理
Wikipin API
的调用,并且分布它的响应。
根据
Nginx
的文档:
代理请求时
Nginx
把请求发给指定的代理服务器,然后把得到的响应发给客户
端。使用相应的协议,可以代理发给
HTTP
服务器(另一个
Nginx
服务器,或者
其他服务器)的请求或非
HTTP
服务器(运行特定框架开发的应用,例如
PHP
Python
)的请求。
Nginx
支持的协议有:
FastCGI
uwsgi
SCGI
memcached
为了把请求发给
HTTP
代理服务器,要在
location
块中使用
proxy_pass
指令(
http://
uri.ac/uRL7
):
location /some/path/ {
proxy_pass http://www.example.com/link/;
}

Get RESTful Rails Development (中文版) now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.