一个愚蠢的原因导致的lighttpd的404错误

这几天学习Rails的部署,被Robbin大大的 在 Linux 平台上安装和配置 Ruby on Rails 详解 说的热血沸腾,摩拳擦掌准备用lighttpd + FastCGI试试部署。不得不说走前辈的路就是比较平坦。全部配置完后,启动lighttpd服务器,问题来了,访问静态页面都没问题,但动态页面都是显示404页面。

然后查找原因:
dispatch.fcgi确实有执行权限,用控制台手动调用也可以正确返回结果;
errorlog没问题,accesslog记录一堆404,也算正常;
Rails的log就根本什么都没记,说明根本Rails分发器没被触发;
查看进程,确实启动了一个lighttpd服务器进程,和几个dispatch.fcgi进程。
最后发现是lighttpd.conf中把$HTTP["host"]写错了。

因为只是试试部署,Rails设定的是development环境,项目也在本机,
所以lighttpd.conf配置文件如下:
$HTTP["host"] == "127.0.0.1" {
  server.document-root = "/yourrails/public"
  server.error-handler-404 = "/dispatch.fcgi"
  fastcgi.server = (".fcgi" =>
    ("localhost" => 
      ("minprocs" => 10,
       "maxprocs" => 10,
       "socket" => "/tmp/rails.socket",
       "bin-path" => "/yourrails/public/dispatch.fcgi",
       "bin-environment" => ("RAILS_ENV" => "development")
      )
    )
  )
}

我在浏览器中敲的动态页面网址是:http://localhost/test

问题就在这句上
$HTTP["host"] == "127.0.0.1"

lighttpd认为"127.0.0.1"和"localhost"是不同的地址……所以,url里只有用"127.0.0.1",lighttpd才能正确识别这是该调用Rails分发器,而不是直接抛404错误的。
解决方法很简单,改成以下两种形式的任一种就行了:
# 第一种,完全匹配
$HTTP["host"] == "localhost"
# 第二种,正则匹配
$HTTP["host"] =~ "^localhost"


顺便说说这两种方式的区别:
$HTTP["host"] == "localhost" 这种方式可以匹配localhost加任意端口,如果Rails项目没有使用子域名的话,这种写法是最简单也最不容易出错的。
$HTTP["host"] =~ "^localhost" 这种方式是把域名+端口号和正则表达式做匹配的,所以这种正则"^localhost$"是不匹配"http://localhost:3000"的,想完全匹配只能用"^localhost\:3000$"。当然实际情况中没人会把正则写的这么死,这只是举例。

你可能感兴趣的:(正则表达式,socket,lighttpd,bash,Rails)