332 lines
14 KiB
HTML
332 lines
14 KiB
HTML
<!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">&&</span> make <span class="o">&&</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">&&</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 host’s 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 host’s 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>
|