$ rvm current
ruby-1.9.3-p392@global
# search through apache conf to find RVM environment path:
$ grep -i passenger /etc/apache2/apache2.conf
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p392@global/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p392@global/gems/passenger-3.0.19
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p392@global/ruby
#!/usr/bin/env bash
source /usr/local/rvm/environments/ruby-1.9.3-p392@global
gem outdated
$ sudo crontab -e
1 1 * * * /root/scripts/cron_gem_outdated.sh
# upgrade packages
apt-get update
apt-get upgrade -y
# install ssh server
apt-get install openssh-server -y
apt-get install mysql-server -y
curl -L https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
# rvm requirements...
apt-get --no-install-recommends install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev libgdbm-dev ncurses-dev automake libtool bison subversion pkg-config libffi-dev
rvm install ruby
apt-get install tcl8.5 -y
wget http://redis.googlecode.com/files/redis-2.6.9.tar.gz
tar -xzf redis-2.6.9.tar.gz
cd redis-2.6.9
make
make test
cd src
cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/bin/
cd ..
cp redis.conf /etc
# start redis
redis-server /etc/redis.conf &
# test redis
redis-cli ping
PONG
apt-get install gearman gearman-server -y
# check if service is running
/etc/init.d/gearman-job-server status
* gearmand is running
apt-get install libmysqlclient-dev -y
cd
mkdir ~/lib_mysqludf_json
cd ~/lib_mysqludf_json
wget http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
tar -xzf lib_mysqludf_json_0.0.2.tar.gz
# remove shared object, and recompile
rm lib_mysqludf_json.so
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
# locate plugin directory
mysql -u root -pPASSWORD --execute="show variables like '%plugin%';"
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| plugin_dir | /usr/lib/mysql/plugin/ |
+---------------+------------------------+
# copy shared object to plugin directory
cp lib_mysqludf_json.so /usr/lib/mysql/plugin/
# enable json_object method
mysql -u root -pPASSWORD --execute="create function json_object returns string soname 'lib_mysqludf_json.so'"
apt-get install libgearman-dev -y
cd
wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
tar -xzf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib/mysql/plugin/
make
make install
# enabled udf functions
mysql -u root -pPASSWORD --execute="CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'"
mysql -u root -pPASSWORD --execute="CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so'"
# set gearman server
mysql -u root -pPASSWORD --execute="SELECT gman_servers_set('127.0.0.1')"
# setup RVM gemset
mkdir ~/ruby
echo "rvm use --create ruby-1.9.3@redis_gearman" > ~/ruby/.rvmrc
cd ~/ruby
# new file: Gemfile; contents:
source 'https://rubygems.org'
gem 'gearman-ruby'
gem 'redis'
# execute bundle to install gems
bundle
#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'
require 'redis'
require 'json'
servers = ['localhost']
worker = Gearman::Worker.new(servers)
REDIS_DELIMITER = ':'
$redis = Redis.new
module RedisWorker
def RedisWorker.work(data, job)
# decode json
json_data = JSON.parse data
# create redis key
redis_key = "user_page_views#{REDIS_DELIMITER}#{json_data['user_id']}"
$redis.lpush redis_key, data
true
end
end
worker.add_ability('redis_worker') do |data,job|
RedisWorker::work data,job
end
loop {worker.work}
chmod +x redis_worker.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'
require 'json'
servers = ['localhost']
client = Gearman::Client.new(servers)
taskset = Gearman::TaskSet.new(client)
data = '{"user_id":1,"timestamp":"2013-02-14 19:13:15","page":"http://www.google.com"}'
result = client.do_task('redis_worker', data)
puts result
chmod +x redis_client.rb
# in terminal 1, start worker
./redis_worker.rb
# in terminal 2, check gearman status & verify worker
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
redis_worker 0 0 1
# in terminal 3, monitor redis
redis-cli monitor
OK
# in terminal 4, run client test script
./redis_client.rb
true
# in terminal 3, verify redis lpush:
redis-cli monitor
OK
1361012555.700504 [0 127.0.0.1:34135] "lpush" "user_page_views:1" "{\"user_id\":1,\"timestamp\":\"2013-02-14 19:13:15\",\"page\":\"http://www.google.com\"}"
# add database & table
mysql -u root -pPASSWORD
mysql> create database redisgearman;
mysql> use redisgearman;
mysql> CREATE TABLE `user_page_views` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`page` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
mysql> exit
# add test record
mysql -u root -pPASSWORD redisgearman --execute="insert into user_page_views (user_id, page) values (1, 'http://www.google.com')"
# ensure json udf is working
mysql -u root -pPASSWORD redisgearman --execute="select json_object(user_id as \`user_id\`, timestamp as \`timestamp\`, page as \`page\`) as json from user_page_views"
+--------------------------------------------------------------------------------+
| json |
+--------------------------------------------------------------------------------+
| {"user_id":1,"timestamp":"2013-02-14 19:13:15","page":"http://www.google.com"} |
+--------------------------------------------------------------------------------+
DELIMITER $$
CREATE TRIGGER redisgearman.redis_gearman AFTER INSERT ON redisgearman.user_page_views
FOR EACH ROW BEGIN
SET @ret=gman_do_background('redis_worker', json_object(NEW.user_id as `user_id`, NEW.timestamp as `timestamp`, NEW.page as `page`));
END$$
DELIMITER ;
mysql -u root -pPASSWORD redisgearman < ~/trigger.sql
# example insert statement
insert into user_page_views (user_id, page) values (1, 'http://ericlondon.com/recent-posts');
# mysql insert => mysql trigger => gearman udf => ruby redis worker => redis insert..
# output from redis-cli monitor
redis-cli monitor
OK
1361327500.888805 [0 127.0.0.1:33649] "lpush" "user_page_views:1" "{\"user_id\":1,\"timestamp\":\"2013-02-19 21:31:40\",\"page\":\"http://ericlondon.com/recent-posts\"}"
#!/usr/bin/env ruby
require 'rubygems'
require 'redis'
require 'json'
require 'mysql2'
class RedisMysql
def initialize
@redis = Redis.new
@mysql = Mysql2::Client.new(:host => 'localhost', :username => 'root', :password => 'PASSWORD', :database => 'redisgearman')
@redis_results = []
end
def query(key, limit)
@redis_results = query_redis key,limit
return @redis_results if @redis_results.size >= limit
@mysql_results = query_mysql key, (limit-@redis_results.size)
@redis_results.concat @mysql_results
end
def query_redis(key, limit)
results = @redis.lrange key, 0, limit
return [] if results.nil?
results.collect {|r| JSON.parse r}
end
def query_mysql(key, limit)
# parse args
parts = key.split ':'
mysql_table = parts[0]
user_id = parts[1]
# get last timestamp from redis results
last_timestamp = @redis_results.last['timestamp'] unless @redis_results.empty?
where = []
where << "user_id = '#{@mysql.escape user_id}'"
where << "timestamp < '#{@mysql.escape last_timestamp}'" unless last_timestamp.nil?
sql = "
select *
from user_page_views
where #{where.join ' and '}
order by id desc
limit #{limit}"
results = @mysql.query sql
return [] if results.nil?
results.collect {|r| r}
end
end
rm = RedisMysql.new
results = rm.query 'user_page_views:1', 10
# debug
puts results

# update installed packages
$ sudo apt-get update
$ sudo apt-get upgrade
# install SSH server
$ sudo apt-get install openssh-server -y
# install PHP & Apache
sudo apt-get install php5 php5-cli php5-common php5-curl php5-gd php5-mysql php-pear -y
# edit file: /etc/apache2/ports.conf
# replace:
NameVirtualHost *:80
Listen 80
# with:
NameVirtualHost *:8000
Listen 8000
$ mkdir /var/www/php.eric.vm
$ echo '<?php echo "hello php world";' >> /var/www/php.eric.vm/index.php
# created new/example file: /etc/apache2/sites-available/php.eric.vm
<VirtualHost *:8000>
ServerName php.eric.vm
ServerAdmin webmaster@localhost
DocumentRoot /var/www/php.eric.vm
<Directory /var/www/php.eric.vm >
AllowOverride All
</Directory>
ErrorLog /var/log/apache2/php.eric.vm-error.log
LogLevel warn
CustomLog /var/log/apache2/php.eric.vm-access.log combined
</VirtualHost>
# Enabling the new conf file by adding a symlink:
$ cd /etc/apache2/sites-enabled
$ sudo ln -s ../sites-available/php.eric.vm
# removed the existing default vhost:
$ sudo rm 000-default
# restarted Apache
$ sudo service apache2 restart
# Install CURL, to start the RVM installation
sudo apt-get install curl -y
# Install RVM (multi-user installation)
$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
# add user to RVM group
$ sudo usermod -a -G rvm eric
# Install Ruby/RVM dependencies
# NOTE: you can run "rvm requirements" to get this list:
$ sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion -y
# install nodejs, per javascript runtime
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update
$ sudo apt-get install nodejs
# install ruby 1.9.2
$ rvmsudo rvm install 1.9.2
# set default version of ruby
$ rvm use 1.9.2 --default
# install rails
$ rvmsudo gem install rails --version 3.2.1
# install mysql server
# note: rails defaults to sqlite3, choose whatever you want
$ sudo apt-get install mysql-server -y
# install passenger
$ rvmsudo gem install passenger
# install nginx/passenger requirements
$ sudo apt-get install libcurl4-openssl-dev -y
# install passenger nginx module
$ rvmsudo passenger-install-nginx-module
# Install options I chose:
# 1. Yes: download, compile and install Nginx for me. (recommended)
# Please specify a prefix directory [/opt/nginx]:
# create new rails app
$ cd /var/www
$ rails new railsdemo
$ cd railsdemo
# integrate with git version control
$ git init
$ git add .
$ git commit -am "initial rails repo"
# remove default placeholder index page
$ rm public/index.html
# create sample home controller
$ rails generate controller home index
# add route in file: config/routes.rb
root :to => "home#index"
# version control
$ git add .
$ git commit -am "added home controller and route"
$ rake db:migrate
$ rails s
config.assets.compile = true
$ RAILS_ENV=production rake db:migrate
$ rails s -e production
# set file permissions
$ sudo chmod +x /etc/init.d/nginx
# add init script run levels
$ sudo /usr/sbin/update-rc.d -f nginx defaults
# replaced:
user nobody;
worker_processes 1;
# with:
user www-data www-data;
worker_processes 4;
http {
# ...snip...
server {
listen 80;
server_name rails.eric.vm
root /var/www/railsdemo/public
passenger_enabled on;
}
# ...snip...
}
http {
# ...snip...
upstream apache {
server 127.0.0.1:8000 weight=5;
}
server {
listen 80;
server_name php.eric.vm;
location / {
proxy_pass http://apache;
}
}
# ...snip...
}
$ yum list | grep -i ^php.*pecl
php-pecl-Fileinfo.x86_64 1.0.4-3.el5.centos extras
php-pecl-fileinfo.x86_64 1.0.4-2.el5.rf rpmforge
php-pecl-http.x86_64 1.6.5-2.el5.rf rpmforge
php-pecl-mailparse.x86_64 2.1.5-2.el5.rf rpmforge
php-pecl-memcache.x86_64 2.2.5-2.el5.rf rpmforge
php-pecl-session_mysql.x86_64 1.9-2.el5.rf rpmforge
php-pecl-ssh2.x86_64 0.11.0-1.el5.rf rpmforge
php-pecl-zip.x86_64 1.8.10-2.el5.rf rpmforge
# downloading packages
$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5.5/x86_64/ius-release-1.0-6.ius.el5.noarch.rpm
$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5.5/x86_64/epel-release-1-1.ius.el5.noarch.rpm
# installing packages
$ rpm -Uvh ius-release-1.0-6.ius.el5.noarch.rpm
$ rpm -Uvh epel-release-1-1.ius.el5.noarch.rpm
# checking which are currently installed
$ yum list | grep -i ^php.*installed
php53.x86_64 5.3.3-1.el5_6.1 installed
php53-cli.x86_64 5.3.3-1.el5_6.1 installed
php53-common.x86_64 5.3.3-1.el5_6.1 installed
php53-devel.x86_64 5.3.3-1.el5_6.1 installed
php53-gd.x86_64 5.3.3-1.el5_6.1 installed
php53-mbstring.x86_64 5.3.3-1.el5_6.1 installed
php53-mysql.x86_64 5.3.3-1.el5_6.1 installed
php53-pdo.x86_64 5.3.3-1.el5_6.1 installed
# removing existing:
$ yum remove php53*
# installing IUS packages:
$ yum install php53u php53u-cli php53u-common php53u-devel php53u-gd php53u-mbstring php53u-mysql php53u-pdo php53u-pear php53u-pecl-apc php53u-xml php53u-xmlrpc php53u-pecl-memcache
# install
$ yum install memcached
# set run levels
$ chkconfig --level 2345 memcached on
# start service
$ /etc/init.d/memcached start
$ php -i | grep -i memcache\ support
memcache support => enabled
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211);
print_r($memcache);
?>
$ php memcachetest.php
Memcache Object
(
[connection] => Resource id #4
)
$ yum update
$ yum install php53 php53-gd php53-mbstring php53-mysql php53-xml mysql-server httpd
$ chkconfig --level 2345 httpd on
$ chkconfig --level 2345 mysqld on
$ yum install subversion
$ mkdir /var/subversion
$ svnadmin create /var/subversion/example.com
$ svn mkdir file:///var/subversion/example.com/trunk -m "added trunk"
$ svn mkdir file:///var/subversion/example.com/branches -m "added branches"
$ svn mkdir file:///var/subversion/example.com/tags -m "added tags"
$ cd /var/www
$ wget http://ftp.drupal.org/files/projects/drush-7.x-4.4.tar.gz
$ tar -xzf drush-7.x-4.4.tar.gz
$ ln -s /var/www/drush/drush /usr/local/bin/drush
$ mkdir /var/www/vhosts
$ cd /var/www/vhosts
$ drush dl drupal
$ mv drupal-7.0/ example.com
$ cd /var/www/vhosts/example.com
$ svn co file:///var/subversion/example.com/trunk .
$ svn add * .htaccess
$ svn commit -m "downloaded drupal"
# make a folder for contrib modules
$ mkdir /var/www/vhosts/example.com/sites/all/modules/contrib
$ cd /var/www/vhosts/example.com/sites/all/modules/contrib
# note: in the below command, you may be prompted to choose which version of the Solr module to install. I choose option 2 for the Supported version
$ drush dl apachesolr
# commit to subversion
$ cd /var/www/vhosts/example.com/sites/all/modules
$ svn add contrib
$ svn commit -m "added contrib folder and apachesolr module"
# start mysql
$ /etc/init.d/mysqld start
# set root password
$ /usr/bin/mysqladmin -u root password 'new-password'
# create new database, user, and set permissions
$ mysql --execute="create database db_example"
$ mysql --execute="grant all privileges on db_example.* to 'example-user'@'localhost' identified by 'some_password'"
$ cd /etc/httpd/conf.d
# create a new file "example.com.conf", with the contents:
NameVirtualHost *:80
<Directory /var/www/vhosts>
AllowOverride All
</Directory>
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/vhosts/example.com
ErrorLog logs/example.com-error_log
CustomLog logs/example.com-access_log common
</VirtualHost>
$ cd /var/www
$ chown -R apache.apache drush*
$ chown -R apache.apache vhosts
$ /etc/init.d/httpd start
$ cd /var/www/vhosts/example.com
# note: you can set your user 1 username, password, email, etc in the following command if desired. type "drush help si" for more install options
$ drush site-install standard --sites-subdir=example.com --db-url=mysqli://example-user:some_password@localhost/db_example

# added repo file to get tomcat6:
$ cd /etc/yum.repos.d/
$ wget http://www.jpackage.org/jpackage50.repo
# install Java JDK:
$ yum install java-1.6.0-openjdk
# install tomcat6:
$ yum install tomcat6 tomcat6-admin-webapps tomcat6-webapps
# dang, dependency issue... (!)
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115.x86_64 from base has depsolving problems
--> Missing Dependency: /usr/bin/rebuild-security-providers is needed by package java-1.4.2-gcj-compat-1.4.2.0-40jpp.115.x86_64 (base)
Error: Missing Dependency: /usr/bin/rebuild-security-providers is needed by package java-1.4.2-gcj-compat-1.4.2.0-40jpp.115.x86_64 (base)
You could try using --skip-broken to work around the problem
You could try running: package-cleanup --problems
package-cleanup --dupes
rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.
# Fixing dependency issue (OPTIONAL):
$ mkdir ~/downloads
$ cd ~/downloads
$ wget http://plone.lucidsolutions.co.nz/linux/centos/images/jpackage-utils-compat-el5-0.0.1-1.noarch.rpm
$ rpm -Uvh jpackage-utils-compat-el5-0.0.1-1.noarch.rpm
$ yum install tomcat6 tomcat6-admin-webapps tomcat6-webapps
# setting tomcat runlevels
$ chkconfig --level 2345 tomcat6 on
# starting tomcat
$ /etc/init.d/tomcat6 start

$ cd ~/downloads
# note: you may need to choose a different mirror to download
$ wget http://www.fightrice.com/mirrors/apache//lucene/solr/1.4.1/apache-solr-1.4.1.tgz
$ tar -xzf apache-solr-1.4.1.tgz
# copy/rename solr war file into Tomcat webapps directory
$ cp ~/downloads/apache-solr-1.4.1/dist/apache-solr-1.4.1.war /var/lib/tomcat6/webapps/solr.war
# copy solr files
$ cp -r ~/downloads/apache-solr-1.4.1/example/solr/ /var/lib/tomcat6/solr/
/var/lib/tomcat6/webapps/solr
$ cd /etc/tomcat6/Catalina/localhost
# create new file: "solr.xml", with the contents:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/var/lib/tomcat6/webapps/solr.war" debug="0" privileged="true" allowLinking="true" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/var/lib/tomcat6/solr" override="true" />
</Context>
# edit file: /etc/tomcat6/tomcat-users.xml, ensure similar contents exist:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="admin"/>
<role rolename="manager"/>
<user username="eric" password="supersecretpassword" roles="admin,manager"/>
</tomcat-users>
# edit file: /var/lib/tomcat6/webapps/solr/WEB-INF/web.xml, update section to reflect solr path:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/var/lib/tomcat6/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
$ cp /var/www/vhosts/example.com/sites/all/modules/contrib/apachesolr/protwords.txt /var/lib/tomcat6/solr/conf/
$ cp /var/www/vhosts/example.com/sites/all/modules/contrib/apachesolr/schema.xml /var/lib/tomcat6/solr/conf/
$ cp /var/www/vhosts/example.com/sites/all/modules/contrib/apachesolr/solrconfig.xml /var/lib/tomcat6/solr/conf/
$ cd /var/lib
$ chown -R tomcat.tomcat tomcat6/
$ /etc/init.d/tomcat6 restart

/var/log/tomcat6/catalina.out
$ cd /var/www/vhosts/example.com
$ drush en apachesolr apachesolr_search apachesolr_taxonomy apachesolr_access --uri=example.com

$ cp ~/downloads/apache-solr-1.4.1/example/multicore/solr.xml /var/lib/tomcat6/solr/
$ mkdir /var/lib/tomcat6/solr/example.com
cp -r /var/lib/tomcat6/solr/conf /var/lib/tomcat6/solr/example.com/conf/
# edit file: /var/lib/tomcat6/solr/solr.xml, added <core> section for each site:
<cores adminPath="/admin/cores">
<core name="example.com" instanceDir="example.com" />
</cores>
$ /etc/init.d/tomcat6 restart