I wrote the site at tetractysproductions.com.  It is a CGI driven
webpage being served by Cherokee. It is pretty simple. I make
asyncronous requests t o fill the various "containers" around the
page. On my development machine running the same Arch Linux/Cherokee
combinations with the same settings every request is consistently
satisfied. However, when run on remote servers the requests are
inconsistent returning 500s on one occassion and 200s on the next.
Click around the menus on my site and you will likely reproduce this.

The file that answers the request contains the following code:

***START***
#!/usr/bin/env ruby

require 'json'

require 'cgi'

# CONSTANTS
DATA_PATH = 'data'
VALID_TYPES = [
  :articles,
  :article_title,
  :menu,
  :news,
  :products
]
VALID_CATEGORIES = [
  :home,
  :music,
  :film,
  :books,
  :software,
  :blog,
  :all
]

# Validate parameters
cgi = CGI.new
cgi.out {'Bad Request: Incorrect value for parameter "type"'} unless
VALID_TYPES.include? cgi['type'].to_sym
cgi.out {'Bad Request: Incorrect value for parameter "category"'}
unless VALID_CATEGORIES.include? cgi['category'].to_sym


# DATA RETRIEVAL FUNCTIONS

def get_article(category, id)
  data = JSON.parse(File.open("#{DATA_PATH}/articles.json", 'r') {|f|
f.read})
  data['articles'].each do |section|
    if section['category'] == category
      section['entries'].each do |entry|
        if entry['id'] == id
          CGI.new.out {"Failed to require view: #{entry['path']}"}
unless require entry['path']
          CGI.new.out {render}
        end
      end
    end
  end
  CGI.new.out {"Failed to find #{id} in #{category}"}
end

def get_article_title(category, id)
  data = JSON.parse(File.open("#{DATA_PATH}/articles.json", 'r') {|f|
f.read})
  data['articles'].each do |section|
    if section['category'] == category
      section['entries'].each do |entry|
        CGI.new.out {entry['title']} if entry['id'] == id
      end
    end
  end
end

def get_menu(category)
  data = JSON.parse(File.open("#{DATA_PATH}/menus.json", 'r') {|f|
f.read})
  data['menus'].each {|menu| CGI.new.out
{JSON.generate(menu['entries'])} if menu['category'] == category}
  CGI.new.out {"Menu category \"#{category}\" not found"}
end

def get_news(category)
  data = JSON.parse(File.open("#{DATA_PATH}/news.json", 'r') {|f|
f.read})
  if category == 'all'
    CGI.new.out {JSON.generate(data['news'])}
  else
    data['news'].each {|article| CGI.new.out
{JSON.generate(article['articles'])} if article['category'] ==
category}
  end
  CGI.new.out {"News category \"#{category} not found"}
end

def get_products(category)
  data = JSON.parse(File.open("#{DATA_PATH}/products.json", 'r') {|f|
f.read})
  if category == 'all'
    CGI.new.out {JSON.generate(data['products'])}
  else
    data['products'].each {|item| CGI.new.out
{JSON.generate(item['items'])} if item['category'] == category}
  end
  CGI.new.out {"Products category \"#{category} not found"}
end

# Determine operation
case cgi['type']
  when 'articles'
    cgi.out {'Bad Request: Incorrect value for parameter "id"'} unless
cgi['id'].to_i > 0
    get_article(cgi['category'], cgi['id'])
  when 'article_title'
    cgi.out {'Bad Request: Incorrect value for parameter "id"'} unless
cgi['id'].to_i > 0
    get_article_title(cgi['category'], cgi['id'])
  when 'menu' then get_menu(cgi['category'])
  when 'news' then get_news(cgi['category'])
  when 'products' then get_products(cgi['category'])
  else cgi.out {"Bad Request: #{cgi['type']}"}
end

***END***

I have never written CGI programs before so I assume I must be doing
something wrong. Are any of you good people able to spot my mistake
from either the brief description, the actual webpage or the code? I
appreciate your time and thanks you all in advance.