CentOS 6 安装Redmine

Redmine是一个灵活的项目管理web应用,采用Ruby on Rails框架开发。Redmine是典型的web 2.0网站,项目管理系统的后起之秀。Redmine支持多项目,灵活的角色权限管理,灵活的问题追踪,自动生成甘蔗图和日历,新闻,文档和文件管理,wiki,论坛,问题自定义属性,SCM集成(包括SVN,Git,CVS,Mercurial),支持多种数据库等等。

最新1.3版本要求运行环境如下:

ruby 1.8.6, 1.8.7

Rails 2.3.14

Rack 1.1.x

RubyGems <= 1.7

Rake 0.8.7

I18n 0.4.2

MySQL 5.0

服务器已经配置好LNMP运行环境,参考之前的文章快速配置LNMP环境,ok,开工了。

安装Ruby

yum install ruby

安装rubygems

yum install rubygems

安装rails,gem会自动安装rack等

gem install rails -v=2.3.14
 
Successfully installed rake-0.9.2.2
Successfully installed activesupport-2.3.14
Successfully installed activerecord-2.3.14
Successfully installed rack-1.1.3
Successfully installed actionpack-2.3.14
Successfully installed actionmailer-2.3.14
Successfully installed activeresource-2.3.14
Successfully installed rails-2.3.14
8 gems installed

查看已经安装的gem模块

gem list --local
 
*** LOCAL GEMS ***
 
actionmailer (2.3.14)
actionpack (2.3.14)
activerecord (2.3.14)
activeresource (2.3.14)
activesupport (2.3.14)
rack (1.1.3)
rails (2.3.14)
rake (0.9.2.2)

安装其他依赖环境

gem install -v=0.4.2 i18n

但是在安装mysql时报错了。

gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h
Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/mysql-2.8.1 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/mysql-2.8.1/ext/mysql_api/gem_make.out

安装ruby-dev头文件

gem install ruby-devel
yum install gcc

然后再安装mysql

yum --enablerepo=remi install mysql-devel
gem install mysql -- --with-mysql-config=/usr/bin/mysql_config
 
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed

由于我是rmi的repo来更新mysql的,所以需要加上—enabledrepo=remi参数。你可以使用

yum install mysql-devel

基本Redmine的要求环境安装好了。现在我们来为Nginx添加Passenger模块来运行Redmine。

按照官方的说明文档来安装

gem install passenger
 
Building native extensions.  This could take a while...
Successfully installed fastthread-1.0.7
Successfully installed daemon_controller-1.0.0
Successfully installed passenger-3.0.11
3 gems installed

安装支持nginx的Passenger模块

passenger-install-nginx-module

选择 Yes: download, compile and install Nginx for me.会出现下面的提示。

 To install Curl development headers with SSL support:
   Please run yum install curl-devel as root.

根据提示安装curl-devel

yum install curl-devel

重新安装nginx的模块,会提示PCRE库没有安装

PCRE could not be downloaded

根据这篇文章Nginx Instalation : PCRE Library Not Found,手动安装PCRE库

cd /usr/local/srv
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar xvf pcre-8.21.tar.gz
cd pcre-8.21
./configure &amp;&amp; make &amp;&amp; make install

安装好PCRE库后,重新安装Passenger

passenger-install-nginx-module

由于之前已经安装了Nginx,所以我们会进行覆盖安装

nginx -V
--user=nginx --group=nginx --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf'

可以看到prefix参数安装到/usr/share/nginx,在安装的过程会询问你要安装到哪里 Please specify a prefix directory [/opt/nginx]: 默认会安装到/opt/nginx,由于之前我们安装过nginx,为了偷懒,现在修改为/usr/share/nginx 即可

替换旧版本的nginx

nginx -v 
nginx version: nginx/0.8.54
mv /usr/sbin/nginx  /usr/sbin/nginx_old_0.8.45
ln -s /usr/share/nginx/sbin/nginx /usr/sbin/nginx

链接到之前的的网站配置文件

cd /usr/share/nginx/
mv conf/ conf.bak
ln -s /etc/nginx/ conf

添加对passenger模块的支持

vim /etc/nginx/nginx.conf
http {
      ...
      passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11;
      passenger_ruby /usr/bin/ruby;
      ...
}

重新启动nginx

killall nginx
service nginx start
 
nginx -V 
 
nginx: nginx version: nginx/1.0.10
nginx: built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
nginx: TLS SNI support enabled
nginx: configure arguments: --prefix=/usr/share/nginx --with-http_ssl_module 
--with-cc-opt=-Wno-error 
--add-module=/usr/lib/ruby/gems/1.8/gems/passenger-3.0.11/ext/nginx

添加域名配置信息

cd /etc/nginx/sites-available/
vim roject.xbc.me
 
server {
    server_name project.xbc.me;
    access_log /srv/www/project.xbc.me/logs/access.log;
    error_log /srv/www/project.xbc.me/logs/error.log;
    root /srv/www/project.xbc.me/public_html/public;
    passenger_enabled on;
 
    # add expires
    location ~* \.(js|css|jpg|jpeg|gif|png)$ {
        if (-f $request_filename) {
            expires 30d;
            break;
        }
    }
}

启用project.xbc.me

cd ../sites-enabled
ln -s /etc/nginx/sites-available/project.xbc.me

创建网站文件夹

cd /srv/www
mkdir project.xbc.me
cd project.xbc.me
mkdir logs
mkdir public_html
cd ..

设置权限

chown -R nginx.nginx project.xbc.me/
chmod 755 -R project.xbc.me/

测试配置文件是否正确

nginx -t
 
nginx: the configuration file /usr/share/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/share/nginx/conf/nginx.conf test is successful

安装redmine,下载最新版本的redmine

wget http://rubyforge.org/frs/download.php/75814/redmine-1.3.1.tar.gz
tar xzf redmine-1.3.1.tar.gz
cp -r redmine-1.3.1/* .
rm -rf redmine-1.3.1*

设置文件的权限

chown -R nginx.nginx .
chmod 755 -R .

创建数据库

create database redmine character set utf8;
grant all on redmine.* to "redmine"@localhost identified by "redmine";//注意替换成你的密码
exit

退出mysql.配置redmine的数据库信息

mv config/database.yml.example config/database.yml
vim config/database.yml
 
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

生成你的session 密钥

pwd
/srv/www/project.xbc.me/public_html
 
rake generate_session_store

创建数据库

RAILS_ENV=production rake db:migrate

导入默认的配置选项

RAILS_ENV=production rake redmine:load_default_data

语言默认的选择en。重新载入nginx配置文件

service nginx reload

现在访问 http://project.xbc.me

参考网站

http://www.mike.org.cn/articles/ubuntu-install-redmine/

http://www.modrails.com/install.html

http://www.modrails.com/documentation/Users%20guide%20Nginx.html

http://stackoverflow.com/questions/4304438/mysql-failed-to-build-gem-native-extension

http://www.fedora-tunisia.org/?q=node/44

http://www.asep.us/2011/05/30/nginx-instalation-pcre-library-not-found/

http://www.redmine.org/projects/redmine/wiki/RedmineInstall

Magento 多站点多域名安装教程

在电子商务越来越火的今天,在线建立自己的商店已经不是一件很困难的事了,Open Source的网店软件比比皆是,现在最流行Prestashop, Magento, Opencart等等,以Magento最为著名,可扩展性强,多商店统一后台管理,对SEO友好。在这里可以看到三个软件的对比

这篇文章是安装magento子域名的教程,请先进行安装之前,确认以下几点:

1.请先确认子域名是否已经指向你的服务器

2.可以编辑.htaccess文件

3. 熟悉Cpanel操作

我们的目标是建立一个独立在线商店store.xbc.me,再安装一个mage.xbc.me的子域名商店,后台统一使用store.xbc.me的后台。我们可以一步一步来安装一个测试的Store商店和子域名商店。

首先创建数据库,在cpanel面板的MYSQL数据库页面添加Store的数据库

magento-tutorial-multi-site-multi-domain-1

使用密码生成器来加强安全性

magento-tutorial-multi-site-multi-domain-2

为xbcme_store用户授权

magento-tutorial-multi-site-multi-domain-3

 

授予全部的权限

magento-tutorial-multi-site-multi-domain-4

添加一个子域名,store.xbc.me目录指向ROOT/store/magento

magento-tutorial-multi-site-multi-domain-5

添加子域名mage.xbc.me,和store指向同一个目录。

magento-tutorial-multi-site-multi-domain-6

现在有了两个子域名了。ROOT代表你的根目录。

store.xbc.me    对应目录  ROOT/store/magento

mage.xbc.me  对应目录   ROOT/store/magento

上传magento的安装包到ROOT/store,我这里测试安装的版本为1.6.1。解压后会自动生成magento文件夹。

如果想安装示例数据的话,可以使用sample-data里面的media替换掉magento,然后导入sample-data的sample-data。sql。

现在可以访问http://store.xbc.me,就会出现magento的经典安装界面。

magento-tutorial-multi-site-multi-domain-10

使用默认的设置就可以了,直接点Continue。

magento-tutorial-multi-site-multi-domain-11

添加数据库信息

magento-tutorial-multi-site-multi-domain-12

Web设置,使用默认的设置即可。

magento-tutorial-multi-site-multi-domain-13

创建管理员帐号

magento-tutorial-multi-site-multi-domain-14

安装完成后,转到后台System-> Manage Stores。

magento-tutorial-multi-site-multi-domain-16

点击Create Website

magento-tutorial-multi-site-multi-domain-17

创建一个新的网站

Name:Mage.xbc.me

Code:mage

Sort Order : 显示的顺序,选填。

magento-tutorial-multi-site-multi-domain-18

保存网站,点击Save Website,创建一个新的商店,点击Create Store。

magento-tutorial-multi-site-multi-domain-20

选择新建的网站:Mage.xbc.me

Website:Mage.xbc.me

Name:Main Store

Root Category:Defult Category

magento-tutorial-multi-site-multi-domain-21

保存商店,点击Save Store。创建一个商店的视图,点击Create  Store View。

magento-tutorial-multi-site-multi-domain-23

填写刚刚创建的Store信息。

Store:Main Store

Name:English

Code:mage_en

Status:Enabled

Sort Order:选填。

magento-tutorial-multi-site-multi-domain-24

保存视图信息,点击Save Store View。就可以看到我们创建的Mage.xbc.me网站信息

magento-tutorial-multi-site-multi-domain-26

现在开配置Mage.xbc.me网站的URL,转到System->Configuration,选择Current Configuration Scope为Mage。xbc.me

magento-tutorial-multi-site-multi-domain-28

选择GENERAL->Web选项,设置Unsecure 和secure选项,去掉Use Default视图的单选框

设置Base URL为http://mage.xbc.me

magento-tutorial-multi-site-multi-domain-29

按照官方的多站点安装向导,修改.htaccess。用你熟悉的编辑器打开.htaccess,在结尾处添加一下内容:

SetEnvIf Host store\.xbc\.me MAGE_RUN_CODE=base
SetEnvIf Host store\.xbc\.me MAGE_RUN_TYPE=website
 
SetEnvIf Host mage\.xbc\.me MAGE_RUN_CODE=mage
SetEnvIf Host mage\.xbc\.me MAGE_RUN_TYPE=website

 

打开http://store.xbc.mehttp://mage.xbc.me都可以正常访问了。

过滤Magento地址的P.O Box

原因很简单,我们使用的快递是UPS,UPS是不送P.O.Boxes地址的。这就需要在支付填写地址时进行验证。

在自己动手之前,我找了一个解决方案preventing P.O. Boxes in shipping addresses 。这篇文章里面写得比较清楚。

只需要修改Customer/Model/Address/Abstract.php 和Checkout/Model/Type/Onepage.php 就行。在作者的基础上,我做了一点小的修改。原文是在新建一个validate_pobox的函数,我是直接把验证添加到validate函数里的。

找到文件

/app/code/core/Mage/Customer/Model/Address/Abstract.php

将下面这段代码加到validate函数的下面

if ($this->getCountryModel()->getRegionCollection()->getSize()
               && !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
            $errors[] = $helper->__('Please enter the state/province.');
        }

添加验证代码之后就变成下面这样了

if ($this->getCountryModel()->getRegionCollection()->getSize()
   	&& !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
    	$errors[] = $helper->__('Please enter the state/province.');
   }
   //add filter for P.O. Box
if( preg_match("/p\.* *o\.* *box/i", $this->getStreet(1))
      || preg_match("/p\.* *o\.* *box/i", $this->getStreet(2)) )
  {
      $errors[] = $helper->__('We cannot ship to PO boxes.');
  }

然后为了不修改Magento的Core文件,然后将文件移到local文件夹

/app/code/local/Mage/Customer/Model/Address/Abstract.php

下即可。

在参考这篇文章Adding validation to registration form in Magento后,我创建了一个插件 No PO Box Shipping。该插件是重写了Mage_Sales_Model_Quote_Address这个类实现的。在实现的过程中遇到无法重写abstract class的问题。Mage_Sales_Model_Quote_Address 是从Mage_Customer_Model_Address_Abstract 类继承过来的。validate函数是写在Mage_Customer_Model_Address_Abstract 这个抽象函数的,本来想直接重写这个类,后来失败了,在Magento中是无法重写Absract Class的,因为Magento在core里面是直接继承这个抽象类的,例如

class Matt_Nopobox_Model_Quote_Address extends Mage_Customer_Model_Address_Abstract

Magento 可以重写非class 主要是因为Magento使用的URI命名来实例化对象。

$helper = Mage::helper('mymodule/myclass');

但是abstract class是直接在php文件中继承,所以替换的时候并没有hook上.

文件app/code/core/Mage/Core/Model/Config.php的类Mage_Core_Model_Config.该类会在getGroupedClassName函数里,会检查是否被rewrite, 如果被重写过,就会返回重写后的对象.

 

插件下载地址:

No PO Box Shipping

 

参考资料

http://www.westwideweb.com/wp/2011/03/15/magento-prevent-entry-of-po-boxes-for-shipping-address/

http://www.fontis.com.au/blog/magento/preventing-po-box-shipping-addresses

http://www.magentocommerce.com/boards/viewthread/18494/P15/

http://www.webbitten.com/index.php?option=com_content&view=article&id=6&Itemid=2

http://inchoo.net/ecommerce/magento/how_to_override_magento_model_classes/