Installing a Webserver on AWS EC2

I’ve recently lantean.co to AWS EC2. Amazon offers a free EC2 instance for a year…. so i decided to give it a shot.

The main reason i had to migrate to a self managed hosting is simple. Shared Hostings don’t allow you to fine tune several settings, such as the PHP Memory, and you might event not be able to login using ssh. What did i need to do?. It’s simple… let’s see…

 

Setting up the Environment

  1. Signup at Amazon Web Services. You’ll need a credit card.
  2. Create a new EC2 instance. Select ‘Micro’ as the type.
  3. Select the Amazon AMI. (I don’t trust 3rd party images!).
  4. Follow the wizard, and generate the SSH private / public keys.
  5. Setup the firewall, so only IP’s in your C class can connect through SSH, and everyone can hit the port 80.
  6. Connect to your box!
    ssh -i certificate.pem ec2-user@[elastic-ip]
  7. Setup a password for your root user
    su passwd
  8. Install Apache
    yum install httpd
    service httpd start
    chkconfig httpd on
  9. Install PHP
    yum instlal php php-mysql
  10. Install mySQL
    yum install mysql-server
    service mysqld start
    chkconfig mysqld on
  11. Secure mySQL
    mysql_secure_installation
  12. Install APC
    yum install php-pecl-alc

 

Setting up Apache

Assuming we’re not gonna host just a single website, but a couple of them… we’re gonna need to setup Virtual Hosts. With VirtualHosts you can serve as many domains as you need, using a single apache installation. Steps!

  1. Log into your instance and type… (replace domain.com with your own domain):
    su
    mkdir -p /var/www/domain.com/public_html
    mkdir /etc/httpd/conf.d/domain.com.conf
    nano /etc/httpd/conf.d/domain.com.conf/httpd.conf
    Add the following lines:

          <VirtualHost *:80>
              ServerAdmin your-mail@domain.com
              DocumentRoot /var/www/domain.com/public_html
              ServerName www.domain.com
              ServerAlias *.domain.com
              ErrorLog /var/www/domain.com/error.log
              CustomLog /var/www/domain.com/requests.log combined
          </VirtualHost>
  2. Enable htaccess in your virtual hosts:
    nano /etc/httpd/conf/httpd.conf
    AllowOverride All
  3. Enable logrotate:
    nano /etc/logrotate.conf
    Add the following lines:

       /var/log/httpd/*log
       /var/www/*/*log
       {
           size 5M
           missingok
           notifempty
           sharedscripts
           delaycompress
           postrotate
          /sbin/service httpd reload > /dev/null 2>/dev/null || true
           endscript
       }

 

Setting up mySQL

At last!. Let’s see how to create a mySQL database, add a new user, and how to import your mySQL dump, using nothing but bash.

  1. Create a new database and a new user
    mysql -u root -p     << You will be asked for your mySQL root-password!
    create database wordpress;
    create user 'wordpress'@'localhost' identified by 'password';
    grant all privileges on wordpress.* to wordpress@localhost;
    flush privileges;
  2. Import a database dump
    mysql -p -u wordpress wordpress < database_dump.sql

 
I hope you found this short guide helpful!

Fixing SVN hangs on OSX

I’m writing this, right here, so i know where to pick it up next time i get the same issue. Thanks to Jonathan, who wrote this awesome post, and saved me quite a lot of time.

Long short story, it seems there is a buggy library on OSX, that produces broken SSL connections to hang for quite some time. Workaround?

sudo port install neon

That should upgrade the faulty library, and fix this annoying issue.

SSH SFTP Updater : “Private key incorrect for user”

If you’re using WordPress SSH SFTP Updater plugin, and you got the error “Private Key is Incorrect for use”… even when the keys are correct, check the following:

nano /etc/ssh/sshd_config

If there is a “ForceCommand internal-sftp” directive, somewhere, in sshd’s config, try disabling it. That was what was causing me issues:

I had an sftp-only user, and the WP plugin doesn’t support that!.

Dropping a MongoDB Database

I’m writing this down, riiight here, because i just got bored of searching this in google everytime i need to run an experiment.
If you need to drop a mongo database, just fire the mongo shell and type:

use mydb;
db.dropDatabase();

That’s it!