Update Your PHP Version on Your Amazon AMI

It’s important to keep your version of PHP updated on your web server in order to get the best performance, minimize memory use, and for the best security.

In this article, I’ll describe how I updated from PHP 5.3 to PHP5.4, but the process should work for more recent versions.

Note this will require command line access. There is no Amazon control panel to do it.

How to Do It

If you Google around on how to upgrade PHP on your Amazon AMI, you’ll find this page which describes the commands to update httpd and php.

But, the problem is that issuing these commands will blow away all of your HTTPD settings and PHP modules, so don’t do it just yet!! You will be left with a server that doesn’t work, as far as hosting your website is concerned.


I would categorize this type of server upgrade as “major surgery” (at least to people who are not Linux experts, myself included). Therefore, you are going to want to take some major precautions before starting.

First of all, take a snapshot or image of your live Amazon EC2 Instance and make sure you know how to restore it.

Second, make a backup of the websites hosted on this server, just in case. Store these offline.

Third, store a local copy of your Virtual Host settings, as your httpd.conf files will get blown away during the upgrade. These are usually located at /etc/httpd/conf and /etc/httpd/conf.d. Search for “<VirtualHost” and copy the settings inside of the tags. The will look something like this:

<VirtualHost *:80>
ServerAdmin webmaster@yourdomain.com
DocumentRoot "/var/www/html/website1_folder"
ServerName yourdomain.com
ErrorLog "logs/yourdomain.com-error_log"
CustomLog "logs/yourdomain.com-access_log" common

<VirtualHost *:80>
ServerAdmin webmaster@yourdomain.com
DocumentRoot "/var/www/html/website2_folder"
ServerName subdomain.yourdomain.com
ErrorLog "logs/yourdomain.com-error_log"
CustomLog "logs/yourdomain.com-access_log" common

<VirtualHost *:80>
ServerAdmin webmaster@yourdomain.com
DocumentRoot "/var/www/html/website3_folder"
ServerName anotherdomain.com
ErrorLog "logs/yourdomain.com-error_log"
CustomLog "logs/yourdomain.com-access_log" common

ssh into your instance and copy these settings to your local computer. (Note, you do not need to copy “NameVirtualHost *.80”. That setting is not used in the new version.)

Doing the Upgrade

Okay, we are finally ready to start. Any websites hosted on this server will experience some downtime starting now, so do this when your traffic is low, and when you have ample time to debug any issues that come up (i.e., don’t go out to lunch during this process).

Just like the article in the Amazon forum says, go ahead and issue the first command to blow away your current httpd and php:

] sudo yum remove httpd* php*

The output will look something like this:

Package Arch Version Repository Size
httpd x86_64 2.2.29-1.4.amzn1 @amzn-updates 3.0 M
httpd-tools x86_64 2.2.29-1.4.amzn1 @amzn-updates 135 k
php x86_64 5.3.29-1.7.amzn1 @amzn-updates 7.4 M
php-bcmath x86_64 5.3.29-1.7.amzn1 @amzn-main 62 k
php-cli x86_64 5.3.29-1.7.amzn1 @amzn-updates 6.4 M
php-common x86_64 5.3.29-1.7.amzn1 @amzn-updates 6.3 M
php-devel x86_64 5.3.29-1.7.amzn1 @amzn-updates 9.9 M
php-gd x86_64 5.3.29-1.7.amzn1 @amzn-main 669 k
php-mbstring x86_64 5.3.29-1.7.amzn1 @amzn-updates 4.1 M
php-mcrypt x86_64 5.3.29-1.7.amzn1 @amzn-main 92 k
php-mysql x86_64 5.3.29-1.7.amzn1 @amzn-updates 445 k
php-pdo x86_64 5.3.29-1.7.amzn1 @amzn-updates 381 k
php-php-gettext noarch 1.0.11-3.el6 @epel 57 k
php-tcpdf noarch 6.0.091-1.el6 @epel 11 M
php-tcpdf-dejavu-sans-fonts noarch 6.0.091-1.el6 @epel 1.5 M
php-tidy x86_64 5.3.29-1.7.amzn1 @amzn-main 100 k
php-xml x86_64 5.3.29-1.7.amzn1 @amzn-main 625 k
phpMyAdmin noarch @epel 19 M
Transaction Summary
Remove 18 Packages

Before you say “yes” to actually do it though, copy the output which says what modules you have installed. The reason you want to copy this is in case something doesn’t work after the update. You then have a list of a modules that you had installed before, and you can re-install any missing ones.

Next, issue the command to install the new httpd and php:

] sudo yum install httpd24 php54

(For PHP5.5, use php55 in this line and from now on). Next, issue this command to install MySQL:

] yum install php54-mysql

Note that when you install php modules from now on, you’ll have to use “php54” as the prefix instead of “php”. For example, if you want to install the php mbstring module, you’d have to do this:

] yum install php54-mbstring

Instead of

] yum install php-mbstring

If there are other PHP modules that you know you need, install them in this way. I’ll explain how to install phpMyAdmin later, though.

Restoring Your Settings

Next, you’ll have to enter those httpd.conf settings that you saved previously. I chose to create a new file called “brian.conf” inside my /etc/httpd/conf.d directory and put my VirutalHost settings inside there. All of the “.conf” files in this directory are read, so you can name it anything you want with the “.conf” suffix.

Alternatively, you can add the settings inside /etc/httpd/conf/httpd.conf.

If you want, you can issue a “sudo service httpd restart” at this point, and you should see the front page of your website in the browser. However, mod_rewrite won’t be working yet, so if your site is a WordPress site, none of the other pages will work.

To get mod_rewrite working (i.e., your .htaccess) you have to tweak a setting in /etc/httpd/conf/httpd.conf. Search for this tag:

<Directory "/var/www/html">

Inside it, change the “AllowOverride” Setting to “AllowOverride All”. In my file, it was on line 151, but that will vary.

Note, if your web files are in a different directory than /var/www/html, you’ll have to find the settings for that directory instead.

Save the file and issue a “sudo service httpd restart”. Voila! Your site should be working now!

If still not working, check out this Stack Overflow answer.

If you are curious to see what modules are installed at this point, issue this command:
] yum list installed | grep "php"

Installing phpMyAdmin

If you are using phpMyAdmin, then issue this command to install it:

] yum --enablerepo=epel install phpmyadmin

Depending on how your phpMyAdmin was set up, you might have to update some settings. In my case, it just worked after I did a “sudo service httpd restart”.

Enabling Auto Start

Okay, everything should be working now except for one thing.  If you were to reboot your instance, the service would not start up automatically, which is not good.  Issue these commands to make httpd and mysqld start up automatically upon bootup:

] sudo /sbin/chkconfig httpd on
] sudo /sbin/chkconfig mysqld on

If you haven’t already, start the services:

] sudo /sbin/service httpd start
] sudo /sbin/service mysqld start

It’s probably a good idea to reboot your instance at this point to make sure the services restart automatically.

Finishing Up

Test your site thoroughly and add any PHP modules that might be needed.

You also might want to take a snapshot or machine image at this point, so you won’t have to go back to PHP5.3 ever!

Note, a side effect of this upgrade is that my ssh connection to my EC2 instance will time out after a period if left unattended. I don’t see why that happened, but I guess it is a good thing. I’ll investigate and add to this article if I figure out why that happened.

How did it work for you? Please share your experiences. I am not a Linux expert; I’m just passing on what worked for me, so your insight would be welcome! – Brian

19 thoughts on “Update Your PHP Version on Your Amazon AMI”

  1. QUITE VITAL: The Virtual Host config is different in 2.4… you must add this to each virtualhost change the directory path to where that site is:

    Require all granted

    Additionally, I had to set my php timezone to get anything to execute.

  2. I plan to follow these instructions to upgrade my 5.3.29 to 5.5.

    You said, “Note, a side effect of this upgrade is that my ssh connection to my EC2 instance will time out after a period if left unattended.”

    I found a simple fix here: http://stackoverflow.com/questions/7210011/amazon-ec2-ssh-timeout-due-inactivity

    It came down to adding a bit to your sshd config. This does the trick:

    sudo echo ‘ClientAliveInterval 60’ >> /etc/ssh/sshd_config

    And then restart your sshd service:

    The command for that on Ubuntu Linux would be..
    sudo service ssh restart

    On any other Linux, though, the following is probably correct..
    sudo service sshd restart

    Now I can open an SSH session, tail a log file, and come back hours later and it’s still working.

  3. there might be some left over php packages even after running the remove command, and this resulted in conflicts when i tried to install. to remove remaining packages, try running

    `sudo yum remove php-common`

    this worked nicely for me :)


Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Share This