redmine生产环境500错误解决方法

每次遇到wordpress出现500错误的时候都心情抑郁。这种直接导致没有心情继续发日志。生活点滴无法记录的感觉很差。
下午的时候发现让人更为头疼的问题,redmine出现了500错误。

An error occurred on the page you were trying to access.
If you continue to experience problems please contact your redMine administrator for assistance.

对于这种只显示一行英文字的错误,提供的有用信息基本上没有。而对于Linux来说,最好的办法就是查log。
1. Redmine的系统管理员要看这里:
/var/log/redmine/default/production.log
比如我这次发生的错误是:

Parameters: {"action"=>"index", "controller"=>"welcome"}

ActiveRecord::StatementInvalid (Mysql::Error: Got error 28 from storage engine: SHOW FIELDS FROM `setting
s`):
  /usr/lib/ruby/1.8/active_record/connection_adapters/abstract_adapter.rb:219:in `log'

2. 在mysql里测试:
show fields from `settings`;
果然出现ERROR 1030 (HY000): Got error 28 from storage engine

3. 检查磁盘空间:

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
...                      96118540  91236092         0 100% /

4. 清理足够的空间,问题解决。

参考:
1. Got error 28 from storage engine
2. redMine 500 error
3.

我自己的相关文章:Redmine on Ubuntu

选择、选择、选择:CAS还是OpenID?

来源:Choices, choices, choices: CAS or OpenID?

注:前一段时间研究CAS的Ruby和Python对比时看到的这篇文章。本文并未取得原文作者的授权,只做过个人翻译练习存在。如果有问题,敬请到原站查看。

With RubyCAS and Ruby-OpenID you have two choices to enable authentication for your application.
使用RubyCAS和Ruby-OpenID,你有两个选项可以用来为你的应用程序启用验证部分。

But which choice is the best one? Or rather the correct one? That depends on your usage scenario.
但是哪一个选项是最好的呢?或者说会有一个正确的选项? 这个取决于你使用的场合。

RubyCAS and OpenID solve, roughly, two different problems:
大体上,RubyCAS和OpenID是解决两个不同的问题的:

  • Single Sign On(单点登录)
  • User account management(用户账号管理)

Solving the Single Sign On problem(解决单点登录难题)
This is RubyCAS’ strength. If you want to offer multiple applications to your users (be it on the internet, or in an intranet), RubyCAS is the better choice. Since it allows proxy authentication, users only have to sign into their account once, and all applications available to them can be used without retyping their credentials when switching applications.
这个是RubyCAS的优势。如果你想为你的用户提供多项应用服务的话(在internet或者intranet上) ,RubyCAS是更好的选择。因为它允许代理认证,用户只需要登录他们的账户一次,所有的应用对于他们来说都是可用的,而不用他们在切换应用的时候重新输入他们的认证信息。

This is the classic environment prompting the need for SSO solutions in general, and RubyCAS fits the bill (especially since it provides Authenticators for common enterprisey storage solutions, like LDAP).
在一般的情况下,这是快速适应SSO需求的经典环境,RubyCas正符合这个要求。 (特别是它提供了适合一般企业存储方案的认证工具,比如使用LDAP)。

Simplifying sign up(简化的注册)
This is where OpenID shines. User’s only have to maintain one set of credentials, and can use it whereever they can log in with OpenID. This is a big bonus for you. No need to store passwords, you can automate account creation at the first sign in of your users (you can request account data like passwords, nicknames, first and last names, etc.), and don’t have to worry ( alot) about validation of this data. The user’s OpenID provider took care of that for them.
这是OpenID的闪光点。用户仅需要维护一组登录信息,就可以使用OpenID在任何(支持OpenID)的地方登录了。这对于你来说有更多好处。(整个过程)没有必要保存密码,你可以在你的用户第一次登录的时候自动创建账户(你可以请求账户信息,如密码、昵称、姓名等数据),(一点)也没有必要担心这个数据的验证。用户的OpenID提供者会关注这些。

You can of course offer them an OpenID services with your application, allowing them to use the credentials they use for your application to login everywhere else.
你可以理所当然的与你的应用一起为他们提供 OpenID服务,允许他们使用这些用来使用你的应用登录的信息到其它站点登录。

However, it seems that OpenID doesn’t allow proxy authentication out of the box (you could add it, or maybe the next version will provide support for that, but that is difficult to do in an essentially untrusted network, which leads to things like Kerberos).
然而,看起来OpenID并不允许开箱即用代理认证方式(你可以增加它,或者下一版本会提供它,但是在一个本质上非信任网络中,它导致如同Kerboros的情形)。

So, what should you use?(所以,你该使用哪一个呢?)

If you are user-centric, use RubyCAS. Examples of user-centric scenarios would be Google Apps for Domains: One account for all these services.
如果你是用户为中心的,使用RubyCAS。典型的用户为中心的场合 应该是Google Apps for Domains:一个账户可用于所有的服务。

If you are application-centric use OpenID. Users will only use one or few applications you offer, and you can thusly simplify the process for them, by cutting the amount of username/password credentials your users have to maintain drastically.
如果你是应用为中心的话,你应该使用OpenID。用户会仅使用一个或多个你提供的应用,你就应该以简化用户过程,(比如)采取裁减你的用户必须维护的用户名/密码等登录凭据的方式。

Remember, though, that OpenID is not an ID verification service! If you plan to use OpenID in an intranet, you should have users use an OpenID server you provide on the intranet, and not have them authenticate via, say myopenid.com. This also allows you to fine-tune the data stored with OpenID accounts, for example organizational units, supervisors, etc.
请记住,虽然,OpenID不是一套身份验证的服务!如果你计划在intranet上使用OpenID,那么你应该让你的用户使用你在intranet上提供的OpenID服务器,而不是让他们通过比如:myopenid.com这样的网站认证。这也可以让你微调OpenID账户的数据存储,比如组织机构、主管等信息。

As you can see, there is no single correct answer. Neither RubyCAS nor Ruby-OpenID are silver bullets, solving all your account problems. It is a question of what fits your usage-scenario the best.
就象你了解的那样,这里没有简单正确的答案。无论是RubyCAS还是Ruby-OpenID都不是所谓的“银弹” ,可以解决你关于账户管理的所有难题。它只是个关于哪个更适合你的使用场合更好一些。


说明:CAS的解决方案在独立的企业应用中,即不对外提供开放式服务的时候是一个非常容易布署和实施的方案。比如Server有官方的Java版,还可以使用诸如RubyCAS-Server、django-cas-provider这样的工具或库来自行建立。而且CAS工具集所提供的客户端基本涵盖目前进行B/S开发的语言,比如PHP、Ruby、Python、.NET等。

或曰成败乃坚持: 自由软件日

作为一个兴趣点很多的人,作为一个开源软件的爱好者、受益者、使用者,自由软件日的活动还是很让我期待的。就象上次python的活动@sagasw讲的LUA一样。这次一开始的计划是Mark Smith讲Visual comparison of Unix-like systems & Virtualisation。因为对Linux, FreeBSD都比较感兴趣,现在又主要在Ubuntu Linux下工作,所以一定要去听听。后来又加入了saka的自由软件和debian介绍、段永明兄的Liferay和孔令亮兄的Ruby介绍,怎能不去呢。

当天大雨肆意,又到了出租车们挑挑拣拣的时段了。所幸是你要是想学习,老天都会帮你的,我遇到了一位好司机。虽然五一路方向压车严重,但我们还是上路了,特意选择了前排的座位,这样如果有人同方向的话就可以一起了。还真上来一位大工的退休老师,英语系的。谈起老人来还是很有话题。后来连司机师傅也加入进来,家俱市场旁边的桥还有西部通道交汇处还真是不给力啊。

理工大学变化好大。也是啊,抽屉里的Ubuntu正版光盘还是Version 6.06 LTS呢,会场门口已经发的是Version 10.04了。来的人比想像的少,亮点是居然有不少女生。不知道事先他们是否知道话题,是否做一些功課了解一下讲的内容是什么。开场的时候如果有个小调查就好了,比如了解一下听众使用的操作系统、软件、开发工具之类话题,应该能增进互动。

果然Debian和自由软件介绍还好。孔兄讲Ruby的时候就有些同学开始云山雾罩了。虽然孔兄准备的时候还留了DRY – Don’t repeat yourself这样的笑点。等段兄讲Liferay这种企业级应用的时候,我自然的想到了围棋里常用的一句话:感觉有些麻。虽然内容都是以介绍为主,但是好象同学们的兴趣点都偏失。技术话题不做准备就开始听的话会有问题的。Mark讲的话题技术性更强,而且用的是英语,虽然听力差了一些,Mark的Slide还是真给力。里面竟然提到了Plan9这只神牛。后面介绍的虚拟化技术也是最近的热点。相关演讲的PPT,有兴趣的同学可以去大连2010自由软件日总结下载看。

活动完毕,感想如下图:

关于开放的自由软件的介绍,看来学校里还是应该经常性的做些普及工作。技术性院校的同学也只会使用Windows(不知道有几个人用正版),为了方便使用破解的软件,殊不知自由软件、开源软件界的替代产品相当多呢。如果将来他们去做开发的话,更会接触到大量的开源工具、开源方案。一次活动或许给不了什么帮助,但至少可以让他们过了这条河。希望至少在这次活动之后,至少在这些人里搜索的关系字会以几个关键字为主。希望他们的Ubuntu 10.04光盘拿回去都能安装一下。如果能告诉一下有个简短的介绍告诉他们如何使用WUBI或者VirtualBox之类安装它就好了。

有幸又认识@beride@gucs@ln_bo等诸兄,高兴。

注:此处的云,乃云山雾罩之云,希望不要误会我。

相关链接:

1. 自由软件日中国站点

2. 大连2010自由软件日总结 by @yuanyi_wang

3. 大连自由软件日”活动简记 by sagasw

4. Saka’s Personal Page

5. plan 9简介

6.

rubycas-server and rubycas-client demo on Ubuntu

CAS( Central Authentication Service)是由JA-SIG开发的一套开源的单点登录系统,在教育行业有着非常广泛的应用,有不少企业也在使用它。CAS的特点是安全性非常高,可维护性高。感謝Yale大学,名校就是不同。最近要做个单点登录,对比了几个开源产品,比如CAS, JOSSO…。这几天又做了ruby cas和python django cas对比。都很容易。但是ruby的这个居然也象python一样有版本的问题,各种库之间的关系太磨人,实在让我对它大跌眼镜。

版本設定:Ubuntu 10.04缺省安装。注:因为我使用VirtualBox虚拟机,新创建一个比较容易,把安装好的clone一下就可以了。如果没地方还可以用snapshot。

一、安装准备:

安装ruby

gems的版本10.04是1.3.5的,要求1.3.6以上
可按下面的步骤升级:

$ sudo gem install rubygems-update
$ cd /var/lib/gems/1.8/bin/
$ sudo ./rubygems-update
$ gem -v

二、相关软件

先熟悉相关软件吧:RubyCAS
gunark / rubycas-server

gunark / rubycas-client

三、安装配置

根据后面的尝试,确定下面的安装方式可以顺利一些:

$ sudo gem install v=2.1.2 rails
$ sudo gem install picnic
$ sudo gem install rubycas-server

* 我是在rubycas-client的源文件里看到的这个2.1.2,前面走了不少弯路。因为一开始会提醒缺少activesupport,如果缺省安装activespport, activerecord的,会安装gems3的版本。

安装完成执行sudo /usr/bin/rubycas-server,就提醒/etc/rubycas-server/config.yml这个文件不在并生成要你配置了。

配置:

/etc/rubycas-server/config.yml

#服务器配置,如果你象我一样不使用https,注释掉ssl_cert吧。
server: webrick
port: 9000
#数据库配置:
database:
  adapter: mysql
  database: casserver
  username: root
  password: 123456
  host: localhost
#认证程序配置,我使用的是明文的,你可以根据需要使用加密版本
authenticator:
  class: CASServer::Authenticators::SQL
  database:
    adapter: mysql
    database: casserver
    username: root
    password: 123456
    username_column: username
    password_column: password

创建上面提到的数据库。不习惯用mysqladmin -u root create casserver的话安装图形客户端吧。

根据指引,接下来要建立用户表,这个表没有地方说明应该怎样创建,满足什么规范,需要知晓还是自己查代码吧,我只是根据自己的分析随便写的:

create table users
(
  userid int not null auto_increment,
  username varchar(40) not null,
  password varchar(40) not null,
  full_name varchar(50) null,
  access_level int null,
  primary key(userid)
);

忘记了MySQL的auto increment类型写法,参考了这个网站:Create table: auto increment primary key。记得少数参加过的电话面试曾经有人问过cvs的命令,我告之曰我使用的是WinCVS客户端,結果他们很不以为然。有些东西只有天天用才需要记的。难道技能是以不参考任何帮助的情况下才算吗?

再次执行sudo /usr/bin/rubycas-server

访问:http://127.0.0.1:9000/随便输入用户名密码

你可能会遇到下面的错误:

NoMethodError at /login
undefined method `connection_pool' for #<Class:0xb73dfdd0>

Ruby /usr/lib/ruby/gems/1.8/gems/activerecord-2.1.2/lib/active_record/base.rb: in method missing, line 1672
Web POST 127.0.0.1/login

源代码修改:

文件:/usr/lib/ruby/gems/1.8/gmes/rubycas-server-0.7.999999.20100202/lib/casserver/authenticators/
85行

$LOG.debug "#{self.class}: [#{user_mode}] " + "Connection pool size: #{user_model.connection_pool.instance_variable_get(:@checked_out).count)}/#{user_model.connection_pool.instance_variable_get(:@connections).count}"

87行

user_mode.connection_pool.checkin(user_mode.connection)

这两句将导致server端出错,直接注释掉就可以了。这两句话的解决办法参考的居然是解决latex问题的一篇文章,见参考18。

没遇到的话你就庆祝吧,因为大功告成了。

四、rubycas-client配置:

进入rubycas-client/examples/rails目录,修改config/environment.rb文件,:cas_base_url指向正确的路径即可,比如我之前配置的http://127.0.0.1:9000,后面的/不需要。

运行ruby script/server,启动这个RoR程序。

用浏览器访问:http://127.0.0.1:3000/advanced_example/

将导向rubycas-server的认证页面http://127.0.0.1:9000/login?service=http:%3A%2F%2F127.0.0.1%3A3000%2Fadvanced_example&gateway=true,这时输入你在users表里登记的内容,就大功告成了。显示下面的页面:

AdvancedExample#my_account

abc's Account page

Extra Attributes:

[Logout]

五、各程序版本

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]

$ gem -v
1.3.7

最后列一下gems:

$ gem list

*** LOCAL GEMS ***

actionmailer (2.1.2)
actionpack (2.1.2)
activerecord (2.1.2, 2.0.0)
activeresource (2.1.2)
activesupport (2.1.2, 2.0.0)
arel (1.0.1)
builder (2.1.2)
gettext (2.1.0)
i18n (0.4.1)
locale (2.0.5)
markaby (0.7.1)
picnic (0.8.1.20100201)
rack (1.2.1)
rails (2.1.2)
rake (0.8.7)
rubycas-client (2.2.1)
rubycas-server (0.7.999999.20100202)
rubygems-update (1.3.7)
tzinfo (0.3.23)

总结这些,希望能对想要使用ruby做单点登录(SSO)的朋友有所帮助。我喜欢使用的语言少。其实服务器使用JA-SIG的官方版本也是可以的。毕竟CAS算是个协议吧。

有个希望,希望我用完python的时候,这些还没有忘记。

参考文章:

1. ruby on rails 的安装

2. Install Ubuntu Lucid Lynx 10.04 development server with Apache2 + Ruby + Passenger + PHP5 + MySQL + SQLite3 + Imagemagick

3. Install Ruby on Rails – Lucid Lynx

4. rubycas-server文档

5. How can I get RubyGems 1.3.6 on Ubuntu 10.4

gem install rubygems-update
cd /var/lib/gems/1.9.1/bin
sudo ./update_rubygems

6. Cannot run rubycas-server if Rails 3 gems

7. Rails单点登录解决方案CAS

8. Setup JOSSO Agent – Apache 2.2

9. 主题:RubyCAS—–来自ruby世界的一款灵巧的CAS服务器

10. RubyCAS—–来自ruby世界的一款灵巧的CAS服务器

11. http://rubycas-client.rubyforge.org/

12. RubyCAS-Client Readme

13. RapidSSL

14. NameError: uninitialized constant Picnic::Config when trying to run rubycas-server

15. Ubuntu server 10.04安装apache+passenger+ruby+rails+mysql环境

16. rails知名应用和工具

17. Cannot run rubycas-server if Rails 3 gems (activerecord and activesupport) are installed

18. 奇怪的编译错误,请大家帮忙看看

19. 慎用establish_connection

20. RUBYCAS-Server error

21. Rails Development on Ubuntu 10.04

22. Java版本的CAS服务器搭建

23. CAS项目实践

24. 用 Ruby 脚本在 Project_Zero 平台上构建 Restful 应用

25.

Ruby快速入门

有件事过一段时间可能要做,所以提前准备一些内容。B/S结构方面RoR还是在开发速度方面具有相当的优势的。要不然Python Django之类也不用“应运而生”了。

要学习RoR还是要掌握一点Ruby语法的。结合《Web敏捷开发之道》一书和网上开源的《Ruby语言入门教程》一书,Ruby的语法还是不难掌握的。用FreeMind总结了下图,一般的程序结合看看也就明白大致过程了。当然,RoR里会有一些特别一点的东西,并不在此图范围之内。

Ruby跟Python还是非常像的。有图为证:

Ruby语法里对符号的使用非常多。让人想起上学時期使用过的DOS下的一个日本编辑器VZ Editor,那个编辑器也是可以定制的。里面的脚本也是很符号化,看来他们对符号很有爱啊。但是与Python相比,由于语法上有太多自由度,所以如果是经常换语言进行开发的话项目维护会比较吃力。

《Ruby语言入门教程》最后一章讲的是Meta Programming。这个功能很强大,很有意思。很像是某脚本可以eval出函数的感觉。:) 看到几个关键的函数比如method_missing, method_modify, class_eval还是比较容易推断实现办法的。但是这么做也是有利有弊吧。

Rails的设计者始终遵循的两个核心原则,即:DRY(Don’t Repeat Yourself)和惯例重于配置(Convention over configuration)非常像我前面做过的产品,虽然B/S和C/S有显著不同,但是实现的方式异曲同工。看来DRY和COC可以算做RAD工具的共性,值得记录。

参考:

1. 再感ruby {注:此处有张开川先生的入门教程下载,因为此处注明了“版权”,所以没有使用CSDN的地址。}

2. 第一章 认识Rails

3. Ruby程序设计语言官方网站

4. Web开发敏捷之道(Agile Web Development with Rails, Second Edition by Dave Thomas and David Heinemeier Hansson) 林芷薰 译

5.

Redmine on Ubuntu

今天安装一下Redmine,据说Ubuntu 10.04下安装非常容易,因为源里已经有了。直接apt-get即可。
1. 安装配置
[code language=”bash”]
sudo apt-get install redmine redmine-pgsql
[/code]
支持mysql用redmine-mysql,支持postgresql的话用redmine-pgsql。因为昨天的安装测试为trac安装了postgresql,所以省掉安装另一种数据库了。
继续阅读Redmine on Ubuntu