精华帖 (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> |
|
返回顶楼 | |
发表时间:2008-12-04
是不是你的应用有问题啊?
我们的系统也是windows 2003+apache+mongrel cluster 开个1-2个月没人管也没事啊 |
|
返回顶楼 | |
发表时间: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的命令都没得用了 |
|
返回顶楼 | |
发表时间: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了。 |
|
返回顶楼 | |
发表时间: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内容进行判断? 真是诡异啊,看来还是只能另外写脚本每日切换了。但我还是想寻根问底知道究竟是哪里的问题,呵呵 |
|
返回顶楼 | |
发表时间:2008-12-05
最后修改:2008-12-05
Windows平台和Linux平台对文件的锁定机制不一样:
在windows平台上,当一个进程打开文件描述符的时候,该文件就被进程锁定了,其他进程无法修改这个文件的内容,否则会报告没有权限(就像你在console里面看到的错误信息) 但在Linux平台上,当一个进程打开文件描述符的时候,该文件默认情况下被没有被进程锁定,你完全可以修改文件内容,甚至直接删除该文件。 Rails日志切换的实现方式估计还是Unix文件操作的方式,所以你在windows平台上切换日志的时候,会导致失败,随后处理web请求的时候,日志无法写入文件,Rails进程实例被block在写日志方法上了。由于Mongrel是多线程实现,所以还可以响应请求,但调用一旦进入Rails代码堆栈,就被挂起。这就是导致你日志切换失败的主要原因。要解决这个问题,你就得仔细研究一下Rails日志切换的源代码,改掉他默认的Unix日志切换的实现方式。 |
|
返回顶楼 | |
发表时间: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 就成功了,我先备份日志文件,然后再清空日志文件的内容,没有任何问题。 |
|
返回顶楼 | |
发表时间:2008-12-05
robbin 写道 原来如此阿,我是自己写了一个log.sh shell脚本来切换日志,呵呵,看来还是我的办法高级,不但可以切换日志,还可以分析日志做很多report的工作。
老大,能不能分享一下。正缺这个东东呢... |
|
返回顶楼 | |
发表时间: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命令搞定 |
|
返回顶楼 | |
发表时间: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") |
|
返回顶楼 | |