无节操非程序猿

莫催稿,催稿也不交

部署 CodeTyphon 服务器程序到容器

先前的文章讲述了使用 CodeTyphon 来开发一个 HTTP 服务器的方法,同时也指出了一些不足之外,毕竟服务器端程序需要可靠的容器来管理,而不是独立运行。本篇即讲述如何将程序部署到 Apache 和 Nginx 容器中。


『切换服务器类型』

还是沿用上一章内开发的独立HTTP服务器程序,我们将其修改为FastCGI程序,CodeTyphon已经考虑到了开发者可能在多种程序类型之间切换,因此有了以下切换方法:

图1 切换至FastCGI程序

可以看到,这样的切换是非常简单的,修改引用,并且注释掉不必要的代码即可。随后编译程序,将得到的 hello_server 加上后缀,成为 hello_server.fcgi,此时我们就拥有了一个 FastCGI 程序。同样的,你也可以通过将引用改为 fpcgi,从而使程序变成 CGI 程序。FastCGI 可以被 Apache 和 Nginx 支持,而 CGI 只能被 Apache 支持。

『部署到Apache』

要部署到 Apache 是非常简单的,只需要几个步骤,我们直接使用 Ubuntu 源内的 Apache 来进行操作,首先下载安装 Apache 和相关的库:

$ sudo apt-get install apache2 libapache2-mod-fastcgi

稍等片刻就完成了,如果不出意外的话,此时系统内已经运行了Apache服务器。可以用以下命令来检查进程是否存在:

$ ps -ef | grep apache2

看到进程后,即可证明 Apache 已成功安装,与此同时,FastCGI 模块也已成功安装。在 Ubuntu 下,Apache 的配置文件位于 /etc/apache2,需要先 cd 到该目录。 先改一下端口号,避免与本机安装的其他服务冲突,这里改为 9090,执行以下命令修改即可:

$ sudo vim ports.conf

注意此处必须使用 root 用户的身份,不然将无权修改。在 vim 内将 Listen 后面的数字改为 9090 并保存,关于 vim 的用法此处不提,请各位开发者自行查阅资料。

修改端口号后,顺便修改 VirtualHost 的端口号,使这两者保持一致:

$ sudo vim sites-enabled/000-default.conf

将原本冒号后的数字改为 9090 并保存。

随后就要修改 apache.conf,在其中增加程序目录,并配置成允许执行 FastCGI 程序:

$ sudo vim apache2.conf

在最后增加以下代码:

ScriptAlias /f/ /var/www/fcgi/
<Directory /var/www/fcgi>
    AllowOverride None
    Options Indexes FollowSymLinks ExecCGI MultiViews SymLinksIfOwnerMatch
    Require all granted
    AddHandler fastcgi-script .fcgi .cgi
</Directory>

此处需要注意的是路径,配置的路径是 /var/www/fcgi,因此编译好的 FastCGI 程序必须放到这个目录内,并且按 AddHandler 所描述的,文件的后缀必须是 .fcgi或 .cgi。

到了这一步,接下去就是发布相关文件了,所谓的发布,就是将 FastCGI 程序拷贝到 /var/www/fcgi 内,做以下操作:

$ sudo cp hello_server.fcgi /var/www/fcgi/
$ sudo cp hello.html /var/www/fcgi/

注意不要忘了 hello.html 文件,它在 FastCGI 程序内被用到。现在我们已经完成了配置,重新启动 Apache 服务器就可以看到效果了:

$ sudo service apache2 restart

打开浏览器后输入 URL:

http://localhost:9090/f/hello_server.fcgi

图2 部署到Apache的执行效果

它可以像独立 HTTP 服务器一样,允许带 Action 和参数进行请求:

http://localhost:9090/f/hello_server.fcgi/hello/act1?name=user

图3 部署到Apache的执行效果


『部署到Nginx』

要部署到 Nginx 就会稍微麻烦一点了,Nginx 自身不带 FastCGI,因此需要额外安装 FastCGI 管理器。值得庆幸的是,在 Ubuntu 的源内已为我们准备好了这样一个工具,不需要再额外找源码编译了,用以下命令完成 Nginx 和 FastCGI 管理器的安装:

$ sudo apt-get install nginx spawn-fcgi

安装完成后,即可以直接运行 FastCGI 程序:

$ spawn-fcgi -a 127.0.0.1 -p 9001 -f /var/www/fcgi/hello_server.fcgi

同样注意端口号问题,尽量选用较偏僻的端口号,以免和系统内其他应用冲突。使用 spawn-fcgi 命令要注意,-f 后面的参数表示具体 FastCGI 程序,使用绝对路径,因此没有必要像 Apache 那样,再配置 FastCGI 程序路径。然后就要配置 Nginx 了,对于 Nginx 而言,仅需要配置转发:

$ sudo vim sites-enabled/default

在其中配置转发即可,此处我们将所有的 .fcgi 请求全部转发,即不在乎 FastCGI 程序的名称,在 site-enabled/default 文件内加入以下内容,同时改一下 server 根节点下的 listen 端口号,这里改为 9000,注意不能和 FastCGI 程序端口号一致,否则会报端口已占用的异常:

location ~ \.fcgi$ {
    fastcgi_pass 127.0.0.1:9001;
    fastcgi_index index.fcgi;
    include fastcgi_params;
}

对于需要同时使用 PHP 的开发者,也可以同时配置 PHP 相关内容,如与当前流行的 Laravel 框架进行整合,可以同时写以下配置:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

完成配置后,重启 Nginx 服务即可生效:

$ sudo service nginx restart

在浏览器内输入 URL 访问 FastCGI 程序:

http://localhost:9000/hello.fcgi

图4 部署到Nginx的执行效果

部署在 Nginx 上的时候,无法像 Apache 内那样,使用 “/” 来访问 Actions,只能使用参数形式,并且在 WebModule 拥有 Actions 时,必须在 WebModule 的 OnRequest 内进行手动处理,这一点比较不方便,有兴趣的开发者可以尝试寻找其他的 FastCGI 管理器来实现,甚至是将 Nginx 请求转发至 Apache 处理,均是可以的,下面也会给出直接的解决方案。

另外,由于 spawn-fcgi 是一个独立进程,需要手动启动,建议将该条命令加入系统的自动启动脚本之中,以避免重启机器后,需要重新输入命令的麻烦。

在纯粹的 Nginx+SpawnFCGI 模式下,切换模块需要用以下 URL 访问,支持 WebModule 参数,但不能直接支持 Actions:

http://localhost:9000/hello.fcgi?module=world

为了方便起见,可以将 module 名称改为其他的,只需要 hello_server.lpr 内增加一句代码:

Application.ModuleVariable:= 'm';

此时上述 URL 即可被改为:

http://localhost:9000/hello.fcgi?m=world

写个复杂点的请求,来证实上述内容,可以看到处理结果:

图5 部署到Nginx的执行效果

如图5所示,Actions 并未被执行,这对于一个健壮的程序来说,是不能够被容忍的,我们需要自行修改代码,来让 FastCGI 程序可以处理到 Actions。

图6 修改WebModule

可以看到,在此我们设置了手动转发请求到 Actions,经过这个处理,部署到 Nginx时,也不会有无法处理 Actions 的问题了,当然 URL 可能稍麻烦些,如下所示:

http://localhost:9000/hello.fcgi?a=act1&name=user

现在即可得到完整的执行效果了,部署服务器也到此告一段落。其实只要是支持 FastCGI 的服务器,均可以实现此类程序的部署,只是方法不同,开发者可以自行研究,以找到最适合自己的部署方案。

图7 部署到Nginx的执行效果


发表评论:

Powered By Z-BlogPHP 1.5.1 Zero

Copyright Rarnu 2017. All Rights Reserved.