Friday, August 28, 2009

We've Moved!

Appoxy LLC has moved! We've moved the office to a beautiful 11th floor location on Nob Hill in San Francisco.


The Building:







Some of the office space:




We're excited. We're also right across from the Ritz Carlton so we can conduct meetings there and pretend that we're uniting nations or something.

Chad

Thursday, August 20, 2009

CloudCache is Now Officially in our Development Arsenal

As you are probably aware if you're reading this blog, everyone here at Appoxy is a big Amazon Web Services fan boy/girl (we also spend a lot of our hard earned money at amazon.com, but that's not for this post). But Amazon is missing a few pieces of the infrastructure puzzle and one of those missing pieces is a caching service. Thankfully, there is CloudCache. We are now using it in two production projects and it has become a standard component in all our new development efforts.

A Little Background

The most commonly used caching software is memcached which is a very lightweight, high-performance, distributed, in-memory caching system. To use memcached, you run memcached daemons on servers that have some extra memory to spare. Then in your application when you want to put some data into the cache, the memcached client that your application is using will hash the key you are using to put your data against the list of servers. After choosing a server, it will send the request to that server to store the data. So the servers don't really need to know anything about the other servers around it, it just stores whatever you give it and it will return whatever you ask for. Very simple, very efficient. There are a few major drawbacks though:

  1. Each client must know the entire list of memcached servers (if you add/remove a server, you have to update the server list on each client)
  2. If you change the server list on the clients, you invalidate the entire cache because the key to server hashes will all change.
  3. Memcached doesn't handle failover. If a server goes down it's just down and any attempt to put to or get from keys that hash to that server will fail.
  4. You have to run and maintain all these memcached servers!

The last point is the biggest pain point in our eyes. It's the very reason we love using AWS, so we don't have to maintain anything. AWS frees us from requiring storage hardware (S3), queueing servers (SQS), and database servers (SimpleDB), but not caching.

Enter CloudCache by Quetzall, or as I like to call it...

Memcached On Demand

If Amazon were to make a caching service, CloudCache is what it would look like. It gives you everything memcached gives you (and more) and you barely need to lift a finger. Just sign up, get your access key, secret key, and a client library for your language of choice. In a couple of minutes, you have a whole farm of cache servers ready and waiting for you. And did I mention it's cheap? At only $0.05 per MB per month, it's almost the same as running an EC2 instance for a month and better yet, you pay only for what you use.

Wednesday, August 19, 2009

How to Rotate Your Ruby on Rails Log Files

Nobody wants a disk to fill up when you least expect it so here is a simple step by step for rotating your Phusion Passenger log files.

1. Create a file called /etc/logrotate.d/passenger

And put the following contents in it.
/home/myapp/log/*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
postrotate
touch /home/myapp/tmp/restart.txt
endscript
}

Now your logs will get rotated daily with the previous day being compressed into it's own file. The compressed files will sit around for 30 days then be deleted. After the rotation is done, postrotate, it will touch /home/myapp/tmp/restart.txt to restart passenger.

2. Test it

Run: logrotate -f /etc/logrotate.d/passenger

After running, you should see an archived log file and a fresh new active one taking the original files place. Also, Passenger will restart so it can log to the new file.

Tuesday, August 11, 2009

Ruby Interface to AWS Elastic Load Balancing Service

The AWS group is hard at work. They responded to the market demand with a load balancing service called, true to form, Elastic Load Balancing.

It's really slick - but generating soap or rest commands from scratch isn't all that fun, so we upgraded our Appoxy-aws gem and added an interface to the ELB service.

Now, using Capistrano, we simply use one command:
cap appoxy:launch_instance
To launch an EC2 instance, provision the system, deploy our code, and (with the new ELB interface), automatically attach the server to our load balancer.... viola, more capacity, testing server, staging server, redundancy, you name it.

Central to this strategy is provisioning and deploying almost everything using Capistrano. Building a full AMI sounds nice, but rebuilding an AMI after a gem update isn't very efficient.

Here's appoxy-aws: http://github.com/appoxy/aws/tree/master

Also if you want our Ubunty Jaunty clean AMI with Ruby 1.9 search for: ami-51769738

Finally, thanks again to RightScale for building the RightAws libraries that made appoxy-aws possible.

Cheers,
Chad

Friday, July 31, 2009

Ruby 1.9 Ubuntu Amazon AMI

Amazon's EC2 allows you to quickly fire up, scale out, and tear down servers at will. It's slick. It's dependable. It's game changing (we spent an entire day testing on 2 servers for under $4).

With that said, we're not huge fans of loaded AMI's. They have the potential for unnecessary maintenance, upgrades, etc. Doesn't that take away from the cleanliness that EC2 offers? Instead, use a base bundle, and Capistrano away. I'll post a follow-up post on that soon.

We're also Ruby 1.9 fans, so we took Ruby 1.9.1p129, installed it into an Alestic Ubuntu Jaunty base AMI, and rebundled it. It took a bit of work since Amazon's tools, AMI's, and Ruby 1.9 aren't totally in sync, but with a bit of work, you can get a clean, production-ready AMI with Ruby 1.9.

Feel free to use ours. It's located in the public AMI list:

appoxy-amis/ubuntu-9.04-jaunty-ruby1.9-base-20090731.manifest.xml
AMI ID: ami-51769738

Enjoy,
Chad


Saturday, July 18, 2009

Installing Ruby 1.9, Apache2, Rails, and Phusion Passenger on new Ubuntu EC2 Instance









Here's the step by step for getting Ruby on Rails running on a sparkling fresh new Amazon EC2 Instance.

1) Launch EC2 Instance

I won't explain this, but pick the latest Ubuntu AMI. The rest of this assumes you're ssh'd into the new isntance.

2) Install Ruby 1.9
  • apt-get update
  • apt-get upgrade
  • apt-get install zlibc zlib-bin zlib1g zlib1g-dbg zlib1g-dev libopenssl-ruby1.9 libssl-dev subversion git-core apache2 apache2-prefork-dev libapr1-dev
  • Install ruby
    • tar -zxvf ruby1.9....tgz
    • cd ruby1.9....
    • ./configure && make && make install
  • ruby -v
    • to check that installed properly
  • cd ext/openssl
  • ruby extconf.rb && make && make install
    • This installs openssl support for ruby

3) Now get Rails up and running

  • gem sources -a http://gems.github.com
  • gem install rails sqlite3-ruby passenger
  • passenger-install-apache2-module
    • follow instructions
    • it will give you a few lines you have to add to: /etc/apache2/apache2.conf (bottom is fine)
  • Get your Rails app on server somewhere
    • If you have an existing app, upload it to the server (eg: /home/myapp would work fine)
    • Now if you don't have a rails app ready to go, lets quickly make one
      • cd /home
      • rails first_rails
  • nano -w /etc/apache2/sites-available/first_rails
  • Assuming you have some.domain.com pointed to the server (this can replace the Apache default site as well):



    • ServerName www.yourhost.com # delete this line if replacing root
      DocumentRoot /home/rails/public
      Allow from all
      # RailsEnv development
      RailsDefaultUser root


  • a2ensite first_rails
    • adds site to sites-enabled
  • /etc/init.d/apache2 reload

That's it.

If you want your app under a sub directory of a different virtual host, see the instructions here:http://www.modrails.com/documentation/Users%20guide.html#_deploying_a_ruby_on_rails_application

Troubleshooting
  • If you get: no such file to load rbconfig.rb
    • be sure all 1.8 stuff is removed
      • apt-get remove libruby1.8 rubygems

And lastly, get the latest awesome gems for web development:

gem install uuidtools appoxy-aws right_http_connection appoxy-simple_record appoxy-local_cache quetzall-cloud_cache

And you should probably setup logrotate to keep your log files under control, but that will come in another post.

Sunday, July 12, 2009

Installing Ruby 1.9 on Windows

As you may already know, Ruby and Windows aren't the best of friends, but you can make it work. Here's how to quickly and easily get Ruby 1.9 up and running on windows.
  1. If you already have Ruby 1.8 installed, make a backup copy of c:\ruby
  2. Download pre-built Ruby 1.9 package for windows here: http://rubyinstaller.org/downloads/
  3. Unzip it into c:\ruby
  4. If you already had Ruby 1.8 installed, you are good to go! If not, add c:\ruby\bin to your PATH environment variable.
Run ruby -v at the command line to check your version.