Home

Windows 下的 Apache + FastCGI 部署 ROR 应用

系统需求

  • Apache
  • Ruby
  • Rails

安装 Ruby 建议使用 Ruby 1.8.6 One-Click Installer,而不要使用 Ruby 1.8.6 Binary ,因为后者不包含 FCGI 模块,即使使用 gem install fcgi 安装也必须编译才能使用。
如果没有 FCG 模块,则 Apache 启动 FastCGI 进程可能会报以下错误:

1The pipe has been ended.  : mod_fcgid: get overlap result error

安装 Rails : gem install rails

安装 Apache Http Server

获得 mod_fcgid,该模块依赖 Visual C++ 2008 Redistributable Package;解压 mod_fcgid.so 到 Apache 目录的 modules 子目录下。
fcgid 进程默认只有一个 _FCGI_SHUTDOWNEVENT 环境变量,而 Windows DNS 解析必须有一些特定的环境变量,否则会导致无法解析 DNS,应用报以下错误:

getaddrinfo: no address associated with hostname.

下面的配置描述了如何解决该问题。

我们这里作一些假设:

  • ROR 应用目录:D:/WebRoot/redmine/

配置 Apache,添加以下脚本:

1LoadModule fcgid_module et/mod/mod_fcgid.so
2DefaultInitEnv RAILS_ENV production

设置以下环境变量以保证 DNS 解析正确
如果不设置,则会报:

getaddrinfo: no address associated with hostname.

 1DefaultInitEnv PATH "C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
 2DefaultInitEnv SystemRoot "C:/Windows"
 3DefaultInitEnv SystemDrive "C:"
 4DefaultInitEnv TEMP "C:/WINDOWS/TEMP"
 5DefaultInitEnv TMP "C:/WINDOWS/TEMP"
 6DefaultInitEnv windir "C:/WINDOWS"
 7
 8Alias "/redmine" "D:/WebRoot/redmine/public/"
 9
10<Directory "D:/WebRoot/redmine/public/">
11  Options Indexes ExecCGI FollowSymLinks
12  AllowOverride all
13  Order Deny,Allow
14  Allow from All
15</Directory>
16
17<Location /redmine/>
18    AddHandler fcgid-script .fcgi
19    FCGIWrapper "C:/ruby/bin/ruby.exe D:/WebRoot/redmine/public/dispatch.fcgi" .fcgi
20    RewriteEngine on
21    RewriteBase /redmine
22    RewriteRule ^$ index.html [QSA]
23    RewriteRule ^([^.]+)$ $1.html [QSA]
24    RewriteCond %{REQUEST_FILENAME} !-f
25    RewriteRule ^(.*)$ dispatch.fcgi?$1 [QSA,L]
26</Location>
View Comments

好用的 Abyss Web Server

今天在家中研究如何实现脱离 IIS 部署 ASP.Net,方法有很多种:

  • mod_aspdotnet
    这个东西可以直接与 Apache 集成,不过 Apache Foundation 已经不再维护该模块,因此放弃。
  • UltiDev Cassini
    还没用过,明天补上。
  • Abyss Web Server
    很好很强大,跨平台的 Web Server,支持 ASP、ASP.Net、ROR、PHP,提供了网页配置接口,用起来也非常的方便。
    它使用 FastCGI 来统一各种技术。
    我在 Win2003 下用它成功的运行了 Gemini(ASP.Net) 和 Redmine(ASP.Net)。

我选择了 Abyss Web Server 来试验我的想法,它非常轻巧,安装包仅仅 700 多K,并且它还有一个免费的 X1 版本。并且可以根据你的需求设置为手动启动、开机启动或安装为 Windows 服务。

关于如何在 Abyss Web Server 下部署 ROR,请看这里

不过我这里用它部署 Remine 的时候,发生了一点小问题,没办法通过 URL https://localhost/ 访问 Redmine 的主页;要修订这个问题,我们需要在原有的 URL Rewriting 规则之上增加一条规则:

Virtual Path Regular Expression : ^/$
Redirect to : /dispatch.fcgi
Next Action : Next action

可以考虑将 Apache 和 Abyss Web Server 结合起来做一个反向代理,这样就可以集中一个端口提供服务,同时也可以作为集群的基础。

Apache 下的 FastCGI 配起来可是会让人吐血的;当然,也可以考虑 lighttpd,不过 lighttpd 的 Windows 版本实在是感觉不爽,以后 Mono XSP + ROR + PHP 诸如此类的混合网站,再考虑在 Linux 下的 lighttpd 吧。

终于,可以和 IIS 这个肥猪说拜拜了。(IIS 幽幽的说:你会回来的~)

View Comments

Zealic's Linux FAQ

前言:

该 FAQ 记录 Zealic 学习使用 Linux 的经验,包括 Ubuntu 发行版但不限于 Ubuntu 发行版,理论上兼容所有 debian 系的发行版,但不排除个别例外情况。

欢迎转载,但你所看到版本不一定是最新的。

文中假设的操作用户名为 zealic,主机名为 host

  1. 如何判断 Linux 的发行版? cat /etc/issue
    /etc/issue 的用途是作为在显示登陆提示符之前的提示信息,大多数情况下,都是显示为系统的发行版。
    此外还可以通过 /etc/issue.net 文件来判断。

  2. 如何恢复使用 Ctrl+Z 挂起的进程? 启用 cat 进程 cat
    按 Ctrl+Z 挂起进程,输出如下:
    [1]+Stopped cat
    fg 1
    这里 [1] 代表挂起的进程 ID,使用 jobs 命令可以列出所有挂起的进程。
    使用 bg 命令可获得上一个被挂起的进程。
    上面使用的 fg 命令则是恢复被挂起的进程。
    注 : 这里的挂起,是指程序在后台运行。

  3. 如何修改登陆系统时的消息? 修改 /etc/motd 文件,motd 的全义是 : Message Of ToDay,该文件的作用是,每次用户登陆时,该文件的内容会显示到终端。
    不过上述方法仅能更改当时的登陆消息,当重新启动系统后,又会被替换为 一部分动态生成的内容 + /etc/motd.tail 的内容。
    所以想要持久性的修改,最好修改 /etc/motd.tail 。
    实际上 modtd 是由 /etc/bootmisc.sh 生成的。
    更多信息请使用以下命令参考:
    man motd
    man motd.tail

  4. 如何修改网卡和 DNS 设置? 网卡配置文件:/etc/network/interfaces
    DNS 配置文件:/etc/resolv.conf

  5. 如何统计目录或文件的大小? 使用 du 命令。

  6. 查看当前系统挂载的分区? 使用 df 命令。

  7. 无法启用 vim 的语法高亮? 某些 Linux 发行版安装的 vim 可能不是 vim,而是直接链接到 vi。
    使用 vim –version,查看是否 vim 及具体版本。
    如果的确是 vim 的话,使用 “syntax on” 依旧无法启用语法高亮并报以下错误:
    E319: Sorry, the command is not available in this version: syntax on
    则有可能是没有完整的安装 vim (比如我目前使用的 Ubuntu-8.04 CLI)。
    解决方法,重新安装 vim:
    sudo apt-get install vim

  8. lsof -i tcp 命令无效? 使用 sudo 前缀命令即可。

  9. 如何激活或锁定用户? 激活 root 用户:
    sudo passwd root
    锁定 root 用户:
    sudo passwd root

  10. 如何修改命令提示符?
    修改 PS1 环境变量。如果要永久性的修改,则可以直接修改 ~/.bashrc 文件对 PS1 赋值的脚本,如果 .bashrc 没有对 PS1 赋值,则可以修改 /etc/profile。

  11. 如何配置本地编码支持? 使用以下命令:
    sudo locale-gen zh_CN.GBK
    上述命令生成 zh_CN.GBK 本地化支持,要完全启用该支持,需要在 /etc/environment (需要重启) 或 ~/.profile (需要重登陆) 或在 SHELL (直接生效)中定义以下变量:
    LANGUAGE="zh_CN:zh"
    LANG="zh_CN.GBK"
    LC_ALL="zh_CN.GBK"
    支持的编码有 UTF-8,GB2312,GBK,GB18030,可以在 /usr/lib/locale 中找到生成的字符集文件;在/var/lib/locales/supported.d/local 文件中可以看到目前已安装的字符集。
    这里我推荐使用 GBK 或 GB18030 编码。
    如果是桌面环境,可能需要重新配置 locale:
    sudo dpkg-reconfigure locales

  12. 查看用户所属的用户组? 使用 groups 命令即可查看当前登陆用户所属的用户组,如要查看指定用户的所属的用户组,在命令后加上用户名即可。
    使用 id 可达到相同的效果,并且信息更加详细。

  13. 显示文件或目录的详细信息? 使用 stat 命令即可。

  14. 执行简单数学运算 使用 let 命令即可,这是 bash 内建的命令。

  15. 执行计划任务 使用 crontab 命令,或直接放置脚本到以下目录:

    • /etc/cron.daily/
    • /etc/cron.hourly/
    • /etc/cron.monthly/
    • /etc/cron.weekly/

以上目录的脚本是通过 /etc/crontab 来执行的。
也可使用 crontab -u root -e 命令来编辑指定用户的计划任务脚本,编辑的脚本放在以下目录中:
/var/spool/cron/crontabs/

  1. <<待续>>
View Comments

小记安装配置 Ubuntu 8.04

基本的安装很简单,省略不提。

1. 配置网络

  • 修改网络配置 : /etc/network/interfaces
1iface eth0 inet static
2address 192.168.1.10
3netmask 255.255.255.0
4gateway 192.168.1.1
  • 使设置生效: /etc/init.d/networking restart

2. 配置 APT

先说说源列表这个东西的概念

1deb http://ubuntu.cn99.com/ubuntu/ hardy main restricted universe multiverse
  1. 包类型 : deb (deb 或 deb-src,分别代表二进制包和源代码包)
  2. 来源地址
  3. 发行版本 : hardy (hardy 为 ubuntu 8.04 的开发代号,也可以直接使用版本号)
  4. 库 : main | multiverse | restricted | universe

参考:http://wiki.ubuntu.org.cn/index.php?title=UbuntuHelp:Repositories/CommandLine/zh

配置源列表:

1sudo cp /etc/apt/sources.list /ect/apt/sources.list.bak
2sudo vim /etc/apt/sources.list

修改为:

 1deb [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy main restricted universe multiverse
 2deb [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-security main restricted universe multiverse
 3deb [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-updates main restricted universe multiverse
 4deb [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-proposed main restricted universe multiverse
 5deb [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-backports main restricted universe multiverse
 6deb-src [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy main restricted universe multiverse
 7deb-src [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-security main restricted universe multiverse
 8deb-src [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-updates main restricted universe multiverse
 9deb-src [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-proposed main restricted universe multiverse
10deb-src [http://ubuntu.cn99.com/ubuntu/](http://ubuntu.cn99.com/ubuntu/) hardy-backports main restricted universe multiverse
11
12deb [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy main restricted universe multiverse
13deb [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-security main restricted universe multiverse
14deb [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-updates main restricted universe multiverse
15deb [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-proposed main restricted universe multiverse
16deb [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-backports main restricted universe multiverse
17deb-src [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy main restricted universe multiverse
18deb-src [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-security main restricted universe multiverse
19deb-src [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-updates main restricted universe multiverse
20deb-src [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-proposed main restricted universe multiverse
21deb-src [http://archive.ubuntu.org.cn/ubuntu/](http://archive.ubuntu.org.cn/ubuntu/) hardy-backports main restricted universe multiverse
22
23deb [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy main restricted universe multiverse
24deb [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-security main restricted universe multiverse
25deb [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-updates main restricted universe multiverse
26deb [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-backports main restricted universe multiverse
27deb [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-proposed main restricted universe multiverse
28deb-src [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy main restricted universe multiverse
29deb-src [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-security main restricted universe multiverse
30deb-src [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-updates main restricted universe multiverse
31deb-src [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-backports main restricted universe multiverse
32deb-src [http://cn.archive.ubuntu.com/ubuntu](http://cn.archive.ubuntu.com/ubuntu) hardy-proposed main restricted universe multiverse

更新源列表 : sudo apt-get update

更多源列表信息参见:http://wiki.ubuntu.org.cn/index.php?title=Qref/Source&variant=zh-cn

3. 安装 SSH 服务

安装 openssh-server:

sudo apt-get install openssh-server

如果需要,配置 sshd:

sudo vim /etc/ssh/sshd_config

配置后需要重启 sudo /etc/init.d/ssh restart

之后使用 SecureCRT 或 putty 之类的 SSH Client 软件就可以连接该机器了。

View Comments

StringTemplate Perl 版

上回写了一篇 利用 GAWK 实现模板文件替换,实现了文本文件的替换,不过最近了解下 Perl,因此就此写了一个 Perl 版本的 StringTemplate.pl。
要真说起来,Perl 还是 AWK 的派生,功能为为强大,由于我这里只是将模板替换功能应用到替换一些简单的东西,要求并不是很高,用一个精简版的 Perl 足矣,这就是精简版的 MiniPerl.exe,可以由 Perl 的源代码编译使用。
这次实现的 StringTemplate.pl 相比之前用 GAWK 实现的功能要更强大一些:

  • 嵌套变量替换
  • 是否区分大小写替换

未来的版本考虑添加一个类似 Java 中的 -D 选项添加变量的功能。

看代码先:

 1#!/usr/bin/perl
 2#<code>
 3#<owner name="Zealic" email="[email protected]"/>
 4#<version>1.0</version>
 5#<timestamp>2008-3-30</timestamp>
 6#</code>
 7
 8# Initial
 9$len = scalar @ARGV;
10if ($len >= 2 and $len <= 3)
11{
12  if($len == 3)
13  {
14    if(index(@ARGV[0], "-") != 0) {showHelp(); exit(101);}
15    $ignoreCase = index(@ARGV[0], "i", 1) != -1;
16    $nesting = index(@ARGV[0], "n", 1) != -1;
17  }
18  $dictFile = @ARGV[$len - 2];
19  $templateFile = @ARGV[$len - 1];
20}
21else # Show help
22{
23  showHelp();
24  exit(102);
25}  
26
27# Open files
28open(FDICT, $dictFile) or die("Can't open file $dictFile.");
29open(FTPL,$templateFile) or die("Can't open file $templateFile.");
30
31# Parse dict
32{
33  @lines = <FDICT>;
34  foreach $line(@lines)
35  {
36      if($line =~ /w+=/)
37      {
38          $key = substr($line, 0, $+[0] - 1);
39          $value = substr($line, $+[0], length($line) - $+[0]);
40          chomp($value);
41          $dict{$key} = $value;
42      }
43  }
44}
45
46# Replace and output
47{
48  @contents = <FTPL>;
49  foreach $line(@contents)
50  {
51      while($line =~ /$(w+)/)
52      {
53          local $old = $line;
54          while (($key, $value) = each %dict)
55          {
56              if($ignoreCase)
57              {
58                  $line =~ s/$($key)/$value/gi;
59              }
60              else
61              {
62                  $line =~ s/$($key)/$value/g;
63              }
64          }
65          if($old eq $line) {last;}
66          unless($nesting) {last;}
67      }
68      print "$line";
69  }
70}
71
72sub showHelp()
73{
74  print(
75'StringTemplate 1.0
76Copyright 2008 Zealic, All rights reserved.
77Contact Me : e-mail:[email protected]
78
79Usage :
80StringTemplate.pl : [-[i][n]] <DictFile> <TemplateFile>
81
82Options :
83  i : IGNORECASE variable for case-insensitive matches.
84  n : Nest replacement.
85');
86}

根据这个东西,可以直接将 MiniPerl.exe 纳入版本控制中,成为自动构建的一部分,可以据此动态生成脚本、源文件,Manifest 文件;或通过 MSBuild Community Tasks 的 SVN/VSS/TFS Task,与我以前所写的 通过 TSVN 自动更新程序集版本信息 ,再加上 MSBuild,可以让版本信息生成/测试打包/安装文件生成等重复劳动更加轻松简单。
最后,你可以在这里下载本文所说的内容,包括 MiniPerl.exe、StringTemplate.pl、以及示例文件。

View Comments