Ubuntu mainstream packages are pretty out of date for nginx; we want version > 1.0, so we need to reference repository that has more recent versions before we install:
$ sudo add-apt-repository ppa:nginx/stable && apt-get update
Update, upgrade and install nginx and development tools:
$ sudo apt-get -y install nginx git-core build-essential
Extras for RubyGems and Rails:
$ sudo apt-get -y install zlib1g-dev
$ sudo apt-get -y install libssl-dev libsqlite3-dev
$ sudo apt-get -y install libreadline5-dev
$ sudo apt-get -y install curl
# Note: For Ubuntu 11.10, you will probably require 'libreadline-gplv2-dev' instead
Add a deployment user:
$ sudo useradd -m -g staff -s /bin/bash deployer
$ sudo passwd deployer
Create a custom shudders file, and add the following line (sudo vi /etc/sudoers.d/our-company):
%staff ALL=(ALL) ALL
Edit or create /etc/nginx/proxy_params and add shared proxy config settings. You don't have to have these in a separate file, but it will mean you don't have to repeat yourself if you have other apps on the same server. If you don't want the extra file, then put these proxy settings into your apps nginx conf file instead of include proxy_params;
.
proxy_set_header Host $host;
# needed to forward user's IP address to application server
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
$ sudo adduser --shell /bin/bash example-user
$ su - example-user
$ cd ~example-user
Check out rbenv into ~/.rbenv :
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
Add ~/.rbenv/bin to your $PATH for access to the rbenv command-line :
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
Add rbenv init to your shell to enable shims and autocompletion:
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
Official Rbenv docs say "Restart your shell so the path changes take effect" in order to use rbenv:
$ exec $SHELL
If the above shell reload doesn't give you the rbenv command (it never works for me), then you will have to exit and re-enter the shell.
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ ./install.sh
This will install ruby-build into /usr/local
. If you do not have
write permission to /usr/local
, you will need to run sudo ./install.sh
instead. You can install to a different prefix by
setting the PREFIX
environment variable.
Use rbenv to install a specific Ruby version :
$ rbenv install 1.9.3-p0
Rebuild the shim binaries. You should do this any time you install a new Ruby binary e.g. when installing a new Ruby version, or when installing a gem that provides a binary:
$ rbenv rehash
Set a global Ruby version for all shells:
$ rbenv global 1.9.3-p0
Install Rails, Bundler and additionally a JavaScript runtime if you are using >= Rails 3.1 and are using the asset pipeline
$ gem install rails bundler execjs --no-rdoc --no-ri; rbenv rehash
$ gem install unicorn --no-rdoc --no-ri; rbenv rehash
Add the following environment config variables to a file at /etc/unicorn/example.co.uk.conf
(The Unicorn process will look here):
RAILS_ROOT=/home/example.co.uk/website
RAILS_ENV=production
Clone your app into ~/website (depends upon if you are using git, or some other source), and then install your bundle:
$ cd ~/website
$ bundle install
create app-specific unicorn init file here and make it executable (See init file in this gist):
$ sudo chmod +x /etc/init.d/unicorn_example.co.uk
Add a unicorn.rb app config file to your Rails app at config/unicorn.rb
(Example attached). Edit the file to match the directory path to your app, and user names and groups. Also uncomment the 'listen' directive in the file for listening on a TCP port.
Check that unicorn can be started:
$ /etc/init.d/unicorn_example.co.uk start
Check that unicorn is listening on the configured port (8080 in this example):
$ netstat -natp | grep unicorn
You should see something like:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 5272/unicorn.rb -E
Okay, if that's all good, then you can comment out the TCP port listening directive in config/unicorn.rb
, so that unicorn worker processes are only accessible to Nginx via Unix socket.
Create an Nginx virtual hosts configuration file in 'sites-available' and enter contents of nginx_virtual_host file:
$ sudo vi /etc/nginx/sites-available/example.co.uk
Create a symlink from sites-available to site-enabled:
$ sudo ln -s /etc/nginx/sites-available/example.co.uk /etc/nginx/sites-enabled/example.co.uk
In production, you probably want your unicorn workers to start up automatically during the server boot process.
$ sudo update-rc.d unicorn_example.co.uk defaults