Files
www-krisforbes-ca/2010/09/11/rails-3-on-aws-micro-centos-nginx-passenger.html

332 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Rails 3 on AWS micro: CentOS Nginx Passenger</title>
<meta name="description" content="Note: This was tested on AWS using a micro instance and ami-6b608c02 which seemed to be the most barebones community CentOS i386 EBS AMI I could find. It wor...">
<link rel="stylesheet" href="/css/main.css">
<link rel="canonical" href="http://blog.krisforbes.ca/2010/09/11/rails-3-on-aws-micro-centos-nginx-passenger.html">
<link rel="alternate" type="application/rss+xml" title="Kris Forbes Blog" href="http://blog.krisforbes.ca/feed.xml">
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7J4BKPGWR1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-7J4BKPGWR1');
</script>
</head>
<body>
<header class="site-header" role="banner">
<div class="wrapper">
<a class="site-title" href="/">Kris Forbes Blog</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg viewBox="0 0 18 15">
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="/about/">About</a>
</div>
</nav>
</div>
</header>
<main class="page-content" aria-label="Content">
<div class="wrapper">
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">Rails 3 on AWS micro: CentOS Nginx Passenger</h1>
<p class="post-meta"><time datetime="2010-09-11T21:07:00-04:00" itemprop="datePublished">Sep 11, 2010</time></p>
</header>
<div class="post-content" itemprop="articleBody">
<p>Note: This was tested on AWS using a micro instance and ami-6b608c02 which seemed to be the most barebones community CentOS i386 EBS AMI I could find. It works as a Micro instance out of the box without issues.</p>
<h2 id="prepare-the-server">Prepare the Server</h2>
<h3 id="update-the-system-and-install-required-libraries">Update the system and install required libraries</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>yum update -y
yum groupinstall “Development Tools” -y
yum install zlib-devel wget openssl-devel pcre pcre-devel readline-devel sudo nano -y
</code></pre>
</div>
<h3 id="configure-time-settings">Configure Time Settings</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>yum install tzdata system-config-date -y
yum install ntp -y
<span class="c"># Contact NTP server and update current time</span>
ntpdate ntp.ubuntu.com
</code></pre>
</div>
<h3 id="configure-the-hostname">Configure the hostname</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>hostname my.specialhost.name
</code></pre>
</div>
<p>Write loopback IP and your hostname in your /etc/hosts file:
<code class="highlighter-rouge">bash
nano /etc/hosts
127.0.0.1 my.specialhost.name
Write your hostname to /etc/hostname
nano /etc/hostname
my.specialhost.name
</code>
## Installing the Application Stack</p>
<h3 id="install-mysql">Install MySQL</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>yum install mysql mysql-devel
Secure your MySQL install:
mysql_secure_installation
Install Ruby
Ignore ri and rdoc <span class="k">for </span>this server
nano ~/.gemrc
Add these two lines:
install: —no-ri —no-rdoc
update: —no-ri —no-rdoc
</code></pre>
</div>
<h3 id="download-ruby-from-source-and-install">Download Ruby from source and install:</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>wget ftp://ftp.ruby-lang.org:21//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
tar xvfz ruby<span class="k">*</span>
<span class="nb">cd </span>ruby<span class="k">*</span>
./configure <span class="o">&amp;&amp;</span> make <span class="o">&amp;&amp;</span> make install
Check that Ruby and RubyGems all were installed correctly:
ruby -v
gems -v
</code></pre>
</div>
<h3 id="clean-up-the-ruby-source-files">Clean up the Ruby source files:</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code><span class="nb">cd</span> ..
rm -R ruby<span class="k">*</span>
Install Git <span class="o">(</span>Good idea <span class="k">for </span>Capistrano deployments<span class="o">)</span>
yum install gettext-devel expat-devel curl-devel zlib-devel openssl-devel
wget http://kernel.org/pub/software/scm/git/git-1.7.1.tar.gz
tar xzvf git-1.7.1.tar.gz
<span class="nb">cd </span>git-1.7.1
make <span class="nv">prefix</span><span class="o">=</span>/usr/local all
make <span class="nv">prefix</span><span class="o">=</span>/usr/local install
</code></pre>
</div>
<h3 id="install-rails-and-passenger-gems">Install Rails and Passenger gems</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>gem install rails
If you need a specific version of Rails:
gem install rails -v<span class="o">=</span>2.3.8
gem install passenger
Install modified Nginx with Passenger built-in
passenger-install-nginx-module
Option 1
</code></pre>
</div>
<h3 id="create-init-scripts-for-nginx">Create init scripts for Nginx</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>git clone git://github.com/xdite/rails-nginx-passenger-centos.git
sudo mv rails-nginx-passenger-centos/nginx/nginx /etc/init.d/nginx
sudo chown root:root /etc/init.d/nginx
Verify the script can start and stop Nginx:
sudo /etc/init.d/nginx start
  <span class="k">*</span> Starting Nginx Server…
  …done.
sudo /etc/init.d/nginx status
  nginx found running with processes:  11511 11510
sudo /etc/init.d/nginx stop
  <span class="k">*</span> Stopping Nginx Server…
  …done.
Add Nginx to startup:
sudo /sbin/chkconfig nginx on
Check that it starts and stops with the server by:
reboot
Install ImageMagick and RMagick <span class="o">(</span>Optional<span class="o">)</span>
yum remove imagemagick
yum install tcl-devel libpng-devel libjpeg-devel ghostscript-devel bzip2-devel freetype-devel libtiff-devel
yum install libjpeg-devel libpng-devel glib2-devel fontconfig-devel zlib-devel libwmf-devel freetype-devel
Download the ImageMagick Source
wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
tar xvfz ImageMagick.tar.gz
<span class="nb">cd </span>ImageMagick-6<span class="k">*</span>
./configure —prefix<span class="o">=</span>/usr —with-bzlib<span class="o">=</span>yes —with-fontconfig<span class="o">=</span>yes —with-freetype<span class="o">=</span>yes —with-gslib<span class="o">=</span>yes —with-gvc<span class="o">=</span>yes —with-jpeg<span class="o">=</span>yes —with-jp2<span class="o">=</span>yes —with-png<span class="o">=</span>yes —with-tiff<span class="o">=</span>yes
make <span class="o">&amp;&amp;</span> make install
Install RMagick
gem install rmagick
</code></pre>
</div>
<h2 id="create-a-deployer-user-recommended">Create a deployer user (Recommended)</h2>
<p>### Add the user
<code class="highlighter-rouge">bash
useradd deployer
passwd deployer
</code></p>
<h3 id="give-deployer-sudo-permission">Give deployer sudo permission</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>nano /etc/sudoers
Add this near the bottom of the file:
deployer    <span class="nv">ALL</span><span class="o">=(</span>ALL<span class="o">)</span>     ALL
</code></pre>
</div>
<h3 id="end-your-ssh-session">End your SSH session</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code><span class="nb">exit
</span>ssh deployer@my.specialhost.name
Lock the root account
sudo passwd root -l
</code></pre>
</div>
<h2 id="test-a-rails-3-app">Test a Rails 3 app</h2>
<h3 id="create-the-testapp">Create the testapp</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>rails new testapp -d mysql
<span class="nb">cd </span>testapp
bundle install
Enter your database password <span class="k">in </span>your database.yml real quick
nano config/database.yml
rake db:create:all
rails generate scaffold post title:string body:text
rake db:migrate
Check really quick that WeBrick can start the rails app before we involve Passenger/Nginx
rails server
Change the user Nginx runs as
sudo nano /opt/nginx/conf/nginx.conf
At the top of the config file, uncomment or change “user nobody;” to:
 user deployer;
</code></pre>
</div>
<h3 id="add-a-virtual-host-to-nginx">Add a virtual host to Nginx</h3>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>sudo nano /opt/nginx/conf/nginx.conf
Find the server <span class="o">{</span> <span class="o">}</span> block <span class="k">in </span>the default file and remove it. Add this:
server <span class="o">{</span>
    listen 80;
    <span class="c"># server_name www.mycook.com;</span>
    root /home/deployer/testapp/public;
    passenger_enabled on;
<span class="o">}</span>
Restart Nginx:
 sudo /etc/init.d/nginx restart
Try accessing your testapp
In your web browser:
http://my.specialhost.name/posts
Tweaking Nginx/Passenger
Enable gzip
sudo nano /opt/nginx/conf/nginx.conf
Find the existing commented “ <span class="c">#gzip on; ” and remove it and replace it with the following:</span>
gzip on;
gzip_buffers 16 8k;
gzip_disable “MSIE <span class="o">[</span>1-6].”;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
Longer expiration tags on content served by Nginx
Place the following <span class="k">in </span>your virtual hosts server <span class="o">{</span> <span class="o">}</span> block:
location ~<span class="k">*</span> .<span class="o">(</span>ico|css|js|gif|jp?g|png<span class="o">)(</span><span class="se">\?</span><span class="o">[</span>0-9]+<span class="o">)</span>?<span class="nv">$ </span><span class="o">{</span>
      expires max;
      <span class="nb">break</span>;
  <span class="o">}</span>
Reduce Passenger spin-up <span class="nb">time
</span>Place the following <span class="k">in </span>your virtual hosts server <span class="o">{</span> <span class="o">}</span> block:
<span class="c">#Passenger options</span>
rails_spawn_method smart-lv2; <span class="c"># This can cause problems with some apps</span>
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
</code></pre>
</div>
</div>
</article>
</div>
</main>
<footer class="site-footer">
<div class="wrapper">
<h2 class="footer-heading">Kris Forbes Blog</h2>
<div class="footer-col-wrapper">
<div class="footer-col footer-col-1">
<ul class="contact-list">
<li>Kris Forbes Blog</li>
</ul>
</div>
<div class="footer-col footer-col-2">
<ul class="social-media-list">
<li>
<a href="https://github.com/krisf"><span class="icon icon--github"><svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
</span><span class="username">krisf</span></a>
</li>
<li>
<a href="https://twitter.com/forbes_kris"><span class="icon icon--twitter"><svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
</span><span class="username">forbes_kris</span></a>
</li>
</ul>
</div>
<div class="footer-col footer-col-3">
<p>Kris Forbes - Personal blog covering experiences with tech such as Docker, Azure, OVH, Linux, Windows, etc.</p>
</div>
</div>
</div>
</footer>
</body>
</html>