论坛首页 编程语言技术论坛

Windows下,Apache+Monrel真的问题多多啊

浏览 12273 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-04   最后修改:2008-12-04
nhyjq 写道
谢谢Robbin的指导,看来只能这样了,但为什么会出现这种情况呢?难道就简单解释为“rails不适合在windows上跑?”

我也考虑过vmware啊,但咱们还没有正版,呵呵,我主要是想尝个鲜,反正对于小应用,咱们企业对用什么语言开发没多少限制,只要没版权问题就好。

我在windows上跑过几个月的apache+mongrel,同时跑4个RoR站点,分别是2,2,4,10个进程,未出现你说的问题
apache配置如下:
<Proxy balancer://cluster_name>
  BalancerMember http://localhost:8820
  BalancerMember http://localhost:8821
  BalancerMember http://localhost:8822
  BalancerMember http://localhost:8823
  BalancerMember http://localhost:8824
  ......
</Proxy>
 
#Virtual host section (create one for each ruby app you need to publish)
<VirtualHost *:80>
  ServerName your.domain.com
  DocumentRoot path/to/your/app_root/public
 
  <Directory path/to/your/app_root/public >
      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order allow,deny
      allow from all
  </Directory>
 
  #log files
  ErrorLog path/to/your/app_root/log/qilang_error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog path/to/your/app_root/log/qilang_access.log combined
 
  #Rewrite stuff
   RewriteEngine On
 
  # Check for maintenance file and redirect all requests
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
 
  # Rewrite index to check for static
  RewriteRule ^/$ /index.html [QSA] 
 
  # Rewrite to check for Rails cached page
  RewriteRule ^([^.]+)$ $1.html [QSA]
 
  # Redirect all non-static requests to cluster
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://cluster_name%{REQUEST_URI} [P,QSA,L]
</VirtualHost>
0 请登录后投票
   发表时间:2008-12-04  
是不是你的应用有问题啊?
我们的系统也是windows 2003+apache+mongrel cluster
开个1-2个月没人管也没事啊
0 请登录后投票
   发表时间:2008-12-04   最后修改:2008-12-04
谢谢各位的意见,看来应该是

enviroment.rb里面
RAILS_DEFAULT_LOGGER = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}#{Date.today.to_s}.log", "daily") 

的问题

明天回去试一下去掉看看如何,我是看到之前的一个贴而写上去的。不过我也写了个脚本做site status health check了,呵呵

那,请问windows有什么比较好的每日切换rails日志方式呢?很多linux的命令都没得用了

0 请登录后投票
   发表时间:2008-12-05  
nhyjq 写道
谢谢各位的意见,看来应该是

enviroment.rb里面
RAILS_DEFAULT_LOGGER = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}#{Date.today.to_s}.log", "daily") 

的问题

明天回去试一下去掉看看如何,我是看到之前的一个贴而写上去的。不过我也写了个脚本做site status health check了,呵呵

那,请问windows有什么比较好的每日切换rails日志方式呢?很多linux的命令都没得用了



装一个cygwin,你就可以用用Linux的shell了。
0 请登录后投票
   发表时间:2008-12-05   最后修改:2008-12-05
各位早上好,我今天经过了一些测试

发现如下情况

1、我是根据根据这个贴http://www.iteye.com/topic/89723
<<如何让日志按日期分开存储>>进行每日日志切换的
里面分成两句
#web访问日志 
RAILS_DEFAULT_LOGGER = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}#{Date.today.to_s}.log", "daily") 


#sql日志
ActiveRecord::Base.logger = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}#{Date.today.to_s}.log", "daily") 


经过反复测试,发现是第一句引起的,使每天到零点就会出现空白页;第二句则没任何问题。难道是Rails有bug,而ActiveRecord反而没有?

2、但好像不是像wayne_deng、hideto所说的,多个Rails进程同时操作log文件的问题。因为我测试过只运行一个Rails进程,仍然出问题。

3、因为之前一直都作为Windows服务运行,我现在改成用命令行运行,就发现有错误提示了:
引用
Error during failsafe response: Shifting failed. close stream
(originally Shifting failed. Permission deined - 前一天的log文件名)

看来是因为不能关闭前一天的日志引起的。但如上所说,我只有一个进程,没理由引起冲突啊

4、虽然是出现出现空白页,但至少Mongrel没有死掉,直接向Mongrel发送请求仍然能返回200,郁闷死了,难道还要检测返回的http内容进行判断?

真是诡异啊,看来还是只能另外写脚本每日切换了。但我还是想寻根问底知道究竟是哪里的问题,呵呵
0 请登录后投票
   发表时间:2008-12-05   最后修改:2008-12-05
Windows平台和Linux平台对文件的锁定机制不一样:

在windows平台上,当一个进程打开文件描述符的时候,该文件就被进程锁定了,其他进程无法修改这个文件的内容,否则会报告没有权限(就像你在console里面看到的错误信息)

但在Linux平台上,当一个进程打开文件描述符的时候,该文件默认情况下被没有被进程锁定,你完全可以修改文件内容,甚至直接删除该文件。

Rails日志切换的实现方式估计还是Unix文件操作的方式,所以你在windows平台上切换日志的时候,会导致失败,随后处理web请求的时候,日志无法写入文件,Rails进程实例被block在写日志方法上了。由于Mongrel是多线程实现,所以还可以响应请求,但调用一旦进入Rails代码堆栈,就被挂起。这就是导致你日志切换失败的主要原因。要解决这个问题,你就得仔细研究一下Rails日志切换的源代码,改掉他默认的Unix日志切换的实现方式。
0 请登录后投票
   发表时间:2008-12-05  
我做了一个简单的测试,证实了我的观点,而且告诉你一个好消息,你在cygwin里面可以自己写脚本来切换日志。

我在windows上面用mongrel启动rails,然后尝试删除development.log,或者修改development.log,结果失败:
引用

D:\Rubyproject\javaeye3\log\development.log
The process cannot access the file because it is being used by another process.

D:\Rubyproject\javaeye3\log>echo
ECHO is on.

D:\Rubyproject\javaeye3\log>echo > development.log
The process cannot access the file because it is being used by another process.

D:\Rubyproject\javaeye3\log>cat development.log


注意看红色的提示信息,文件被独占了,其他进程无法修改。但是我在cygwin里面去修改它:

robbin@mobile /cygdrive/d/Rubyproject/javaeye3/log
$ cp development.log  development.log.old

robbin@mobile /cygdrive/d/Rubyproject/javaeye3/log
$ ll
total 52
drwx------+ 2 robbin None     0 Jul  3 08:50 CVS
-rwx------+ 1 robbin None 19021 Dec  5 11:46 development.log
-rwx------  1 robbin None 19021 Dec  5 11:47 development.log.old

robbin@mobile /cygdrive/d/Rubyproject/javaeye3/log
$ echo > development.log

robbin@mobile /cygdrive/d/Rubyproject/javaeye3/log
$ ll
total 24
drwx------+ 2 robbin None     0 Jul  3 08:50 CVS
-rwx------+ 1 robbin None     1 Dec  5 11:47 development.log
-rwx------  1 robbin None 19021 Dec  5 11:47 development.log.old


就成功了,我先备份日志文件,然后再清空日志文件的内容,没有任何问题。
0 请登录后投票
   发表时间:2008-12-05  
robbin 写道
原来如此阿,我是自己写了一个log.sh shell脚本来切换日志,呵呵,看来还是我的办法高级,不但可以切换日志,还可以分析日志做很多report的工作。

老大,能不能分享一下。正缺这个东东呢...
0 请登录后投票
   发表时间:2008-12-05  
shaquan6776 写道
robbin 写道
原来如此阿,我是自己写了一个log.sh shell脚本来切换日志,呵呵,看来还是我的办法高级,不但可以切换日志,还可以分析日志做很多report的工作。

老大,能不能分享一下。正缺这个东东呢...



#!/bin/sh

cp production.log production-`date +%Y%m%d`.log
gzip production-`date +%Y%m%d`.log
echo -n > production.log


三行shell命令搞定
0 请登录后投票
   发表时间:2008-12-05  
谢谢Robbin,用cygwin是可行的。

但我还是不明白,我只是开了一个Rails的进程,按理说Rails应该是单进程单线程的吧?每天的日志切换还是由本进程进行吧,难道Rails会自动fork一个进程处理日志?我看不到源代码有这类处理啊,为什么还是冲突呢?

而且为什么独立给ActiveReocrd的logger反而没问题呢?
#sql日志  
ActiveRecord::Base.logger = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}#{Date.today.to_s}.log", "daily")   
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics