Setting up hosting environment on Amazon EC2 with NodeJS, Nginx and php-fpm


Posted on Sep 24th, 2015


From last 4 years, I was using Godaddy for hosting my site and my projects but lately figured out there cPanel is not very secure. So I switched to Amazon EC2 Linux hosting and its awesome. It fast, secure and gives you full control to your ecosystem.

My requirement was not to host one single website but to host multiple websites with one instance.

Once you have setup your instance, you will have to ssh to your account and install necessary libraries to setup your hosting environment.

$ ssh id_rsa.pem [email protected]

id_rsa.pem is the permission file that you created while setting up your instance.

After connecting, it will ask you to add the new host in to known_hosts. Say yes. You will have to generate a public key after this and add this key to EC2's authorized_keys.

$ ssh-keygen -t rsa -b 4096 -C "[email protected]"

Save the file in your local system at ~/.ssh or any safe folder and name it as id_rsa.pub

cat ~/.ssh/id_rsa.pub | ssh -i id_rsa.pem [email protected] "cat >> .ssh/authorized_keys"

The above command will automatically add the key to EC2's authorized keys. Now you should be able to connect without .pem key

$ ssh [email protected]

Next, we will update the system and install few libraries which are prerequistes for nodejs.

$ sudo yum update
$ sudo yum install gcc-c++ make
$ sudo yum install openssl-devel

Installing NodeJS

$ wget https://nodejs.org/dist/v4.0.0/node-v4.0.0.tar.gz
$ tar -xvf node-v4.0.0.tar.gz
$ cd node-v4.0.0
$ ./configure && make && sudo make install

At this point, node should be working fine. You can type npm  and see if its installed.

Installing Nginx and PHP-FPM

$ sudo yum install -y nginx php-fpm

After installing Nginx, you will find its configuration file here:

/etc/nginx/nginx.conf

And all your hosting files will stay in the below location:

/var/www/html

Now everytime you host a new website, its not a good practice to touch nginx.conf and add your server information. Instead we are going to create a folder  /var/www/hosts and keep all our custom configuration files here. So if you have a new website, you just create a new conf file for that and nginx will automatically detect that. To do this, we need to tell nginx.conf file to scan this new directory. So open up this file:

$ sudo vim /etc/nginx/nginx.conf

And just after

include /etc/nginx/conf.d/*.conf;

add the below line 

include /var/www/hosts/*.conf;

Now create the hosts folder.

$ mkdir /var/www/hosts

Create a configuration file for one of your website in this folder.

Lets name it as example.com

server {
    listen       80;
    server_name  example.com;

    root   /var/www/html/example.com;
    #autoindex on;
    index index.php index.html;

    #access_log  logs/host.access.log  main;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {

        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}

Restart the server:

$ sudo service nginx restart

All set, lets create the folder example.com inside /var/www/html

$ mkdir /var/www/html/example.com
$ cd /var/www/html/example.com
$ vim index.php

//Add some content inside index.php

<?php
phpinfo();
?>

Save the file. Because we dont have example.com as our real domain, we will have to edit our local machine's hosts file and add an entry.

In your local machine, edit your hosts file:

Windows: C:/Windows/System32/Drivers/etc/hosts

Mac: /etc/hosts

And add the below entry:

xx.xx.xxx.xxx example.com //that ip is your amazon's elastic ip

Now visit example.com and you should be able to see phpinfo information.


Algorithm - QuickSort in JavascriptMysql sorting on multiple columns with IF-ELSE

Comments
100% Complete