In this tutorial you will learn how to setup a LEMP stack on Ubuntu 12.04 for serving a Drupal site (s).

Update: I originally started this post to document my setup for actually configuring Nginx server on Ubuntu for Drupal site at the start of 2015. Many things have changed ,ever since, thus most of the written bellow will work.

LEMP is a variation of the ubiquitous LAMP stack used for developing and deploying web applications. Traditionally, LAMP consists of Linux, Apache, MySQL, and PHP. Due to its modular nature, the components can easily be swapped out. With LEMP, Apache is replaced with the lightweight yet powerful Nginx.

I have been serving Drupal websites running Nginx for years already, my favorite combination is a Linode VPS, Ubuntu and Nginx. For the past 3 years I have been running Ubuntu 10.04 Nginx 0.67 and PHP 5.2. It worked and still works great, but many things have advanced in those last 3 years, like for running a Drupal 8 I'm required to have a php 5.3 version at least. The support for Ubuntu 10.04 has ended on April 30, 2015, not to speak of my existing version of Nginx.

In fact the reason that made me to do those upgrades are that recently some bot-hacker cracked my website(s) and changed content of index.php files. Well I'm not sure for 100% right now, but I believe there were some server vulnerabilities involved as well.

To perform this brand new installation I bought a new 1GB VPS server for 10$/month from Linode

LEMP Server on Ubuntu 12.04 (Precise Pangolin)

Pretty much of written here I have taken from this guide on Linode

Follow this tutorial on Linode for getting started (Deploying a server), then add some basic security to your VPS

Installing Nginx web server compiling from source

install the prerequisites:

apt-get install libpcre3-dev build-essential libssl-dev sudo

Check the Nginx download page and ensure you are using the most recent “stable” version. Latest stable version of nginx by writting this article was 1.8.0. Issue the following commands to download and install the Nginx web server:

cd /opt/
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.6.2.tar.gz
cd /opt/nginx-1.6.2/

The following ./configure command will prepare nginx for compilation:

./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module

Issue the following commands to compile and then install the software

make
make install

Create a dedicated system user to run the Nginx process under by issuing the following command:

adduser --system --no-create-home --disabled-login --disabled-password --group nginx 

Now install and configure the init script to make it possible to start and stop the web server more easily. Issue the following command sequence:

wget -O init-deb.sh http://www.linode.com/docs/assets/1131-init-deb.sh
mv init-deb.sh /etc/init.d/nginx
chmod +x /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults 

Now, issue the following command to start the web-server:

/etc/init.d/nginx start

Configure Nginx Virtual Server Blocks

A lot of I have taken from Insready article here

sudo mkdir -p /srv/www/reinisfischer.com/{public_html,logs}
sudo usermod -a -G www-data admin
sudo chown -R www-data:www-data /srv/www
sudo chmod -R 775 /srv/www/reinisfischer.com
sudo mkdir -p /opt/etc/nginx/{sites-available,sites-enabled}

Make sure you change admin in second row to your username

Telling Nginx you are using virtual servers

Insert the server directives directly into the http section of the /opt/nginx/conf/nginx.conf

sudo nano /opt/nginx/conf/nginx.conf

add a line into http section

http {
# [...] 
include /opt/etc/nginx/sites-enabled/*;

# [...] }

Once you’ve configured and loaded the Nginx configuration, restart the web server to implement the new configuration by issuing the following command:

sudo
/etc/init.d/nginx restart

Make sure that the directories referenced in your configuration exist on your file system before restarting.

Configure Nginx for Drupal 7

Add a new server_name

sudo nano /opt/etc/nginx/sites-available/reinisfischer.com

copy/paste code bellow (make sure you change reinisfischer.com to your actual domain name)

server {
server_name reinisfischer.com;
root /srv/www/reinisfischer.com/public_html; ## <-- Your only path $
access_log /srv/www/reinisfischer.com/logs/access.log;
error_log /srv/www/reinisfischer.com/logs/error.log;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# This matters if you use drush
location = /backup {
deny all;
}
# Very rarely should these ever be accessed outside of your lan
location ~* \.(txt|log)$ {
allow 192.168.0.0/16;
deny all;
}
location ~ \..*/.*\.php$ {
return 403;
}
location / {
# This is cool because no php is touched for static content
try_files $uri @rewrite;
}
location @rewrite {
# Some modules enforce no slash (/) at the end of the URL
# Else this rewrite block wouldn't be needed (GlobalRedirect)
rewrite ^/(.*)$ /index.php?q=$1;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
# Fighting with ImageCache? This little gem is amazing.
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}

CTRL+O and Enter CTRL+X to exit

Make a symlink

sudo ln -s /opt/etc/nginx/sites-available/reinisfischer.com /opt/etc/nginx/sites-enabled

Restart Nginx

/etc/init.d/nginx restart

To remove a symlink

sudo rm /opt/etc/nginx/sites-enabled/reinisfischer.com
/etc/init.d/nginx restart

Deploy PHP with FastCGI

In order to deploy PHP applications, you will need to implement the following “PHP-FastCGI” solution to allow nginx to properly handle and serve pages that contain PHP code.

apt-get install php5-cli php5-cgi php5-fpm

When you’ve completed the modifications to the configuration, make sure that the virtual host is enabled and issue the following command to restart the web server:

service php5-fpm restart
/etc/init.d/nginx restart

Congratulations! You can now deploy PHP scripts with with your LEMP stack.

Install the MySQL Database Server

apt-get install mysql-server php5-mysql

During the installation process you will be prompted to set a password for the MySQL root user. Choose a strong password and keep it in a safe place for future reference.

Issue the following command to secure the MySQL instance:

mysql_secure_installation

Answer all questions prompted during this process.

Install phpMyAdmin

sudo aptitude install phpmyadmin

Hit ESC when the installation prompts you for auto-configuration, because there is no option for Nginx.

sudo ln -s /usr/share/phpmyadmin/ /srv/www/reinisfischer.com/public_html/phpmyadmin

now access phpmyadmin on your browser. 

Fix for missing mysqli

I found a message warning that no mysqli extension can be found, to fix this I followed advice here:http://www.maketecheasier.com/install-lemp-server-in-ubuntu

uncommented “mysqli.allow_local_infile = On” in php.ini 

possible locations for php.ini

/etc/php5/fpm/php.ini
/etc/php5/cli/php.ini

Restart FPM

service php5-fpm restart

Installing Drupal

cd /srv/www/reinisfischer.com
sudo wget http://ftp.drupal.org/files/projects/drupal-7.38.tar.gz
sudo tar -xvzf drupal-7.38.tar.gz
sudo cp drupal-7.38/* public_html/ -R
sudo chown www-data:www-data public_html -R

Drupal Backup and Restore using Wget

I was deploying a new server with just one aim - to run a Drupal sites. Since I already had a server serving Drupal sites I found the most fastest way to transfer those site is by creating archives on one server and transfer them to other using wget and then extracting and editing just some settings.php file

On server 1

sudo mkdir /srv/www/reinisfischer.com/public_html/backups
sudo tar czf /srv/www/reinisfischer.com/public_html/backups/archive.tar.gz /srv/www/reinisfischer.com/public_html

With first line we created a new folder where to store our backup files, while with second file we archived all files from public_html directory and placed in backups directory

On Server 2

cd /srv/www/reinisfischer.com/public_html
sudo wget http://www.reinisficher.com/backups/archive.tar.gz
sudo tar -zxvf archive.tar.gz

Install Postfix for sending Mail

In many cases your website will use a webform and it's neat to have those emails been sent to your inbox.Read: https://www.digitalocean.com/community/questions/email-not-working-with-...

sudo apt-get install postfix

Then, edit /etc/postfix/main.cf and set inet_interfaces to loopback-only

sudo nano /etc/postfix/main.cf

Restart postfix

sudo service postfix restart