first
This commit is contained in:
@@ -0,0 +1,322 @@
|
||||
<!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">
|
||||
</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>
|
||||
Reference in New Issue
Block a user