• WordPress Permalink in Nginx


    To set up pretty permalink in wordpress in a LEMP environment add the following line inside location / block:

    nano /etc/nginx/sites-available/example.com
    try_files $uri $uri/ /index.php?q=$uri&$args;

    Off course you should remove try_files if there is any inside location / block.

  • PHP: Missing MySQL Extension



    Your PHP installation appears to be missing the MySQL extension which is required by WordPress.


    Run the following command in your hosting account:

    apt-get install php5-mysql
  • Error: Unable to Resolve Hostname


    When you are getting error “Unable to resolve hostname” in your VPS even after changing the hostname from command line, you can solve it by simply restarting the server.

    How to change Hostname?

    Use the following commands:-

    Change hostname:

    sudo echo "yourhostname" > /etc/hostname
    sudo hostname -F /etc/hostname

    Check hostname:

    sudo nano /etc/hostname

    Edit Hostfile:

    sudo nano /etc/hosts

    You need to change the corresponding text just after to “yourhostname”.

    Final Check:


    If the output gives “yourhostname”. you are done.


    Whenever you run a command using sudo you are getting an error which displays, “Unable to resolve hostname ..“.


    Restart VPS from command line by typing the following command.

    sudo reboot

    This will solve the issue.

  • Host Websites in Linode (LAMP stack)


    We assume that you have already bought a domain name for your website. Hope you know why should one buy a domain name. You need to change DNS server of your domain to host it. For example the DNS records for Linode hosting will be:


    Buy a Linode 1GB @ 10 USD per month.

    Linode 1 GB is a good start to host single or multiple websites. It costs 10 USD per month. We recommend you buy VPS hosting from Linode only because it is awesome. Take our word for it.

    Update: Linode is now offering 2 GB RAM @ 10 USD per month.

    Linode Data Center Location:

    Choosing data center should be proper. It should be nearest to the location from which major traffic comes from. This is always not the truth, however. If major traffic of your website is from India, you should choose London as your data center. Check out this post for an in-depth analysis: Data Center for Indian Websites

    Buy a Linode

    Install Linux, Apache, MySQL, PHP.

    This tutorial is for a LAMP stack i.e. Linux, Apache, MySQL and PHP. If you want to create a LEMP stack i.e. Linux, NGINX, MySQL, PHP stack then follow this tutorial: Host Multiple Sites on LEMP Server in a 1GB Linode.

    From Linode Manager, install debian / ubuntu 64 bit into the linode. This installation will take some time. Then Boot it. Your linode is now loaded with a linux operating system.

    You can not install other softwares direct from linode manager. You have to connect through ssh client e.g. PuTTY in windows. Open up PuTTY. Use linux root user/password and IP address to connect with your linode.

    After successful connect execute following commands each one by one:-

    Set Hostname

    echo "yourhostname" > /etc/hostname
    hostname -F /etc/hostname
    nano /etc/hosts

    Edit: Change debian/ubuntu to yourhostname.


    will give output “yourhostname”

    Troubleshooting: Unable to resolve hostname.

    Set Timezone

    dpkg-reconfigure tzdata

    System Update

    apt-get update
    apt-get upgrade

    Create User

    adduser admin
    usermod -a -G sudo admin

    Securing Linode

    To secure your linode you need to restrict root user access. Admin user will do the job of root instead. You also need to create ssh key pair authentication method.

    Open puTTYgen in your own PC; (Download puTTy from here).
    Generate a Public/Private key pair.
    Copy Public key into a Text file (Use Notepad++)
    Save Private key in your PC.

    Now go to terminal window of linode again. But this time login as admin

    mkdir .ssh
    sudo nano .ssh/authorized_keys

    Paste the copied text i.e. public key into this file.

    sudo chown -R admin:admin .ssh
    sudo chmod 700 .ssh
    sudo chmod 600 .ssh/authorized_keys
    sudo nano /etc/ssh/sshd_config

    Disable Root Login

    PasswordAuthentication no
    PermitRootLogin no

    Restart SSH

    sudo service ssh restart

    Set Firewall Rules

    sudo nano /etc/iptables.firewall.rules

    Paste the following code into this:

    #  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
    -A INPUT -i lo -j ACCEPT
    -A INPUT -d -j REJECT
    #  Accept all established inbound connections
    #  Allow all outbound traffic - you can modify this to only allow certain traffic
    #  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
    -A INPUT -p tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp --dport 443 -j ACCEPT
    #  Allow SSH connections
    #  The -dport number should be the same port number you set in sshd_config
    -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
    #  Allow ping
    -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    #  Log iptables denied calls
    -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
    #  Drop all other inbound - default deny unless explicitly allowed policy
    -A INPUT -j DROP

    Activate Firewall

    sudo iptables-restore < /etc/iptables.firewall.rules
    sudo nano /etc/network/if-pre-up.d/firewall

    Add the following code:-

    /sbin/iptables-restore < /etc/iptables.firewall.rules
    sudo chmod +x /etc/network/if-pre-up.d/firewall

    Secure Fail2ban

    sudo apt-get install fail2ban
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    sudo nano /etc/fail2ban/jail.local

    Set “enabled” to “true” in the [ssh-ddos] section.

    Restart Fail2ban

    sudo service fail2ban restart

    Adding DNS Records

    Install Apache

    sudo apt-get install apache2
    sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.backup.conf
    sudo nano /etc/apache2/apache2.conf

    Optimize Apache

    KeepAlive Off
    StartServers 2
    MinSpareServers 6
    MaxSpareServers 12
    MaxClients 30
    MaxRequestsPerChild 3000

    Further Tuning Apache

    sudo echo "ServerName localhost" | sudo tee /etc/apache2/conf.d/fqdn
    sudo service apache2 restart
    sudo a2enmod rewrite
    sudo a2dissite *default

    Create directory for your first website

    mkdir -p /var/www/example.com/html
    mkdir /var/www/example.com/logs

    Create directory for your second website

    mkdir -p /var/www/example.org/html
    mkdir /var/www/example.org/logs

    You may host as many websites as you wish in a single Linode. So, carry on.

    Create Name-based Virtual Host for your first domain

    sudo nano /etc/apache2/sites-available/example.com.conf

    Add the follwing code:

    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/html/
    ErrorLog /var/www/example.com/logs/error.log
    CustomLog /var/www/example.com/logs/access.log combined

    Create Name-based Virtual Host for your first domain

    sudo nano /etc/apache2/sites-available/example.org.conf

    Add the following:

    ServerAdmin webmaster@example.org
    ServerName example.org
    ServerAlias www.example.org
    DocumentRoot /var/www/example.org/html/
    ErrorLog /var/www/example.org/logs/error.log
    CustomLog /var/www/example.org/logs/access.log combined

    Enable Hosting

    sudo a2ensite example.com.conf
    sudo a2ensite example.org.conf
    sudo service apache2 restart

    Install MySQL

    sudo apt-get install mysql-server
    sudo mysql_install_db
    sudo mysql_secure_installation

    Optimize MySQL

    cp /etc/mysql/my.cnf /etc/mysql/my.backup.cnf
    sudo nano /etc/mysql/my.cnf

    Set the following:

    max_connections = 75
    key_buffer = 32M
    max_allowed_packet = 1M
    thread_stack = 128K
    table_cache = 32

    Restart MySQL

    sudo service mysql restart

    Create Database/User

    mysql -u root -p
    show databases;
    create database example;
    use mysql;
    show tables;
    select user,host from mysql.user;
    create user 'exuser'@'localhost' identified by 'expwd';
    grant all privileges on example.* to 'exuser'@'localhost';
    flush privileges;

    Install PHP

    sudo apt-get install php5 php-pear php5-mysql
    sudo nano /etc/apache2/mods-enabled/dir.conf

    Add the following:

    DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm

    Optimize PHP

    sudo cp /etc/php5/apache2/php.ini /etc/php5/apache2/php.backup.ini
    sudo nano /etc/php5/apache2/php.ini

    Set the following:

    max_execution_time = 30
    memory_limit = 128M
    display_errors = Off
    log_errors = On
    error_log = /var/log/php/error.log
    register_globals = Off

    Restart PHP

    sudo service apache2 restart

    Adding into DNS Manager

    In Linode Manager, go to DNS Manager and add your domain zone like this picture:


    Browse your Website

    Write http://example.com/ in your browser and hit enter. you should see its working.

    For WordPress Installation

    sudo wget https://wordpress.org/latest.zip
    sudo apt-get install unzip
    sudo unzip latest.zip
    sudo cp -R wordpress/* /var/www/example.com/html/
    cd /var/www/example.com/html/
    chown -R www-data html
    sudo cp -R wordpress/* /var/www/example.com/html/

    You may install other Web-Software at your convenience.

    If you have any query, let us know, we’ll get back to you.


    Getting Started – Linode Guides & Tutorials
    Securing Your Server – Linode Guides & Tutorials
    Hosting a Website – Linode Guides & Tutorials
    How To Set Up Your Linode For Maximum Awesomeness

  • Should I buy a Domain Name for Website?


    Time will come when there will be a website for every ordinary things.

    It may be a personal website, a company’s website, shop owner’s website, school, college, club, restaurant, gym etc. and a long list which you can not imagine.

    The purpose of all of the above is to create an online presence.

    If you have ever thought of creating a website for your own or your company, the very first thing you should buy is a name for it, which is called “domain name“.

    Note: You can create also your website without buying a domain name. In that case, you can not have something like, “XYZCompany.com”; rather you have to choose “XYZCompany.blogspot.in” or “XYZCompany.wordpress.com” or “XYZCompany.weebly.com” etc.

    There are places from where you can buy domain names. They are called domain registrar. To name a few:

    1. Namecheap.com
    2. Name.com
    3. Hover.com
    4. Godaddy.com
    5. Bigrock.in

    Namecheap provides 2 factor authentication which is a great tool to secure the domains account. By the way, purchasing a domain name is not expensive. It is a matter of 10USD (approx 700 INR) per year. It may vary from registrar to registrar.

    It is also to be mentioned here, that the following domain name extensions are most popular:

    • .com
    • .net
    • .org
    Domain names extensions
    Domain names extensions

    Precisely, .com is for commercial websites; .net is for internet related sites and .org is for non-profit organizations. However, there is no bar choosing domain name extensions.