I have installed the PHP extension Xdebug on multiple platforms and for some reason I keep forgetting how I manage to do it every time.

Below are the steps I followed to get Xdebug working with Zend Server CE 5.04 with PHP 5.3 on Windows 7 Ultimate 64-bit.

  1. Download the correct Xdebug extension from here.
    Note: Although I am running a 64-bit OS, Zend Server CE 5.04 is 32-bit and requires 32-bit extensions so I downloaded the 32-bit version of Xdebug php_xdebug-2.1.0-5.3-vc9-nts.dll
  2. Copy the DLL to C:\Program Files (x86)\Zend\ZendServer\lib\phpext\
  3. Add the following lines ABOVE [Zend] in your php.ini file which is located at C:\Program Files (x86)\Zend\ZendServer\etc\php.ini
    [xdebug]
    zend_extension="C:\Program Files (x86)\Zend\ZendServer\lib\phpext\php_xdebug-2.1.0-5.3-vc9-nts.dll"
    
  4. Restart Apache
  5. Log in to the Zend Server GUI at http://localhost:10081/ZendServer and check the PHP Info page for Xdebug
  6. If you have an Xdebug section then it works. Now you’ll want to probably add some more configuration to the [xdebug] section of the php.ini file. See xdebug.org for more info.
Share

Rackspace

Rackspace Cloud Server vs. Running Your Own ServerEvery web developer needs some sort of web server. Some use a virtual machine running on their workstation. Some use a physical box connected to their LAN. Until recently, it wasn’t really even feasible to consider having a remotely hosted development server. But with the introduction of hosted VPS services like the Rackspace Cloud servers, it’s not only affordable but possibly cheaper, depending on your requirements, to have your own hosted VPS.

The following is a comparison of the total cost of ownership for a Rackspace Cloud Server versus running your own local web development server. We want the comparison to be as fair as possible, and therefore we will try to compensate for the major differences between a virtual server and a physical server.

Rackspace Cloud Server… 1.5¢ per hour? I’ll take 2 please.

Let’s start with a Rackspace Cloud Server. The cheapest Cloud Server plan–which is more than sufficient for web development–starts at $0.015 per hour. All plans include 4 virtual CPU cores and RAID 10, and provide dedicated resources and CPU time. The cheapest plan comes with 256MB memory, 10GB of disk space and a 10Mbps connection to the Internet.

Hourly Daily Yearly Monthly
Price $0.015 $0.36 $131.49 $10.96

Formula: (Hourly rate X 24 X 365.25) / 12

Data transfer

Rackspace charges an additional per-gigabyte fee for incoming and outgoing data transfer, but since this is a dev server, it’s very unlikely this will affect your monthly fee very much. In my case, my dev server never comes close to 1GB in or out.

Bandwidth In Bandwidth Out
Price $0.08 $0.22

For these calculations, we will assume that we will be charged for 1GB incoming and 1GB outgoing transfer.

Our total transfer cost will be 1GB X $0.08 + 1GB X $0.22 = $0.30

Don’t forget to backup your Cloud Server

The last thing to consider is backup. Rackspace Cloud Server’s are hosted on servers featuring a RAID 10 hard drive configuration. Ideally your data should be safe, but just in case something goes wrong with the physical servers your Cloud Server is on, you’re covered. Rackspace’s backup for Cloud Servers is stored on their Cloud Files service. Backup storage is currently free, but it will eventually cost you $0.15 per gigabyte.

We’ll assume you want both a daily backup and a weekly backup, so your backup storage cost would be:

10GB X $0.15 X 2 = $3.00

Note: The backups are transferred via the network interface on your Rackspace Cloud Server that is connected to Rackspace private network. Rackspace does not charge any data transfer fees for any data transferred on this network.

Ok, so after adding up our average monthly server fee, monthly data transfer and backup charges, the total cost for running a Rackspace Cloud Server is:

$14.26 USD

Now let’s see what it costs to run your own server.

 

Running your own server

With a Cloud Server, you are essentially leasing space on Rackspace’s hardware. They provide the hardware and make sure it’s working. If it breaks, they have to pay to fix it. With your own server, well… it’s all up to you.

I know you can turn your old Pentium 4 desktop into a great Linux box, but it’s not really fair to compare a professional grade server product to a budget workstation. To make our comparison as accurate as possible, we will use a used or off-lease server that is easily affordable for the average web developer.

Our used server will feature 2 hard drives in a RAID 1 configuration, a Pentium 4 processor, a 300W power supply and 1GB of RAM. I know the RAM here is 4 times the amount in Rackspace’s base Cloud Server, but since we are using a Pentium 4 processor instead of the quad core server class CPU Rackspace is using, I think that its use in our calculation is justified.

We’ll assign a price of $150 for this server.

What if the power goes out?

Since Rackspace obviously has uninterrupted power supplies supporting their servers, it’s only fair that we use one as well. Let’s assume we need a 300W UPS and it costs $50. If we add the cost of our server and UPS together we get $200. Let’s assume our used server will last 2 years (24 months).

$200 / 24 = $8.33

So a Rackspace Cloud Server costs almost double this amount? Not quite. I left out one important factor that you may not think about unless you’re the one paying the hydro bills: electricity. Surprisingly, the cost to run your server 24/7 is not an insignificant factor.

Electricity costs money too, you know

Since I live in Ontario, Canada, I’ll be using Canadian hydro rates for my initial calculations and then converting them to US dollars before adding them to our server total.

The non-Smart-Meter hydro rates for Ontario are as follows:

Condition Rate
First 1000 Kilo Watt Hours per month: 5.8 cents/kWh
Above 1000 kWh: 6.7 cents/kWh

Assuming we use under 1000kWh per month, we’ll use the rate of 5.8 cents.

In order to calculate the cost of our electricity consumption, we must first figure out how much power our server will consume. Since the server will probably be idle for the majority of the day, we won’t use the maximum power consumption but rather an average. I used this website to determine how much power our server will use. The calculator gave me a power consumption of 163W.

Let’s convert that to kilowatts:

163W / 1000 = 0.163kW

  Hourly Daily Yearly Monthly
Price $0.009454 $0.226896 $82.873764 $6.90

Formula: (0.163kW X $0.058 X 24 X 365.25) / 12

Before you get too excited, we still have to convert this back into US dollars. We’ll use $1.00 USD = $0.95 CAD as our exchange rate.

$6.90 CAD X 0.95 = $6.56

Wow, you could definitely argue that shared hosting is cheaper than running your own server on the basis of the electricity cost alone. When we add our electricity bill to our server cost we get:

$8.33 + $6.56 = $14.89

 

Wow, they’re close!

  Rackspace Cloud Server Your own server Difference
Average monthly cost $14.26 USD $14.89 USD $0.63

The numbers speak for themselves.

Results with a grain of salt

There are two important aspects to consider when evaluating these results.

First, we made a lot of assumptions about our server. If you prefer to run a low power desktop as a server, can find a cheaper used server, or decide to turn your server off at night, these will significantly reduce the costs for running your own server.

Second, the value of the features and expertise provided by Rackspace is far superior to anything you might set up in your basement. I made a brief chart to highlight some of these differences that can’t easily be assigned a monthly monetary value.

  Rackspace Cloud Server Your own server
Hardware Managed for you by the professionals at Rackspace It’s your problem
Support 24/7 – chat, phone, email That’s up to you – 24/7 (if you don’t sleep)
Scalability Add more RAM and disk space anytime automatically or with a few clicks Turn off your server and open it up

Obviously a Cloud Server is not ideal for everybody, but I bet that it could save a lot of developers a great deal of time and money.

Why not try a Cloud Server? It’s only 1.5 cents an hour!

Cloud Computing & Cloud Hosting by Rackspace

Share

I came across a stupid problem the other day while trying to figure out why my site changes weren’t showing up.

I’m writing my problem and solution on my blog so I’ll remember and not screw up the same way again.

Consider the following virtual host files.

/etc/apache2/sites-available/example.com-05-production.vhost


    ServerName www.example.com
    ServerAlias *.example.com

    . . .

/etc/apache2/sites-available/example.com-10-staging.vhost


    ServerName staging.example.com
    ServerAlias *.staging.example.com

    . . .

My goal is to have www.example.com and anything.example.com point to one vhost with the exception of staging.example.com and anything.staging.example.com. The problem is that Apache loads the scripts in order by file name. So when the second virtual host is loaded Apache pretty much ignores it because *.example.com overrides staging.example.com.

I changed my file names of my vhost files, reloaded Apache, and all was fixed.

The correct file names:
/etc/apache2/sites-available/example.com-05-staging.vhost
/etc/apache2/sites-available/example.com-10-production.vhost

Share

Cloud Computing & Cloud Hosting by Rackspace

Overview

This guide will help you set up the following:

  • Zend Server CE (Apache/PHP)
  • Iptables
  • SSH
  • MySQL
  • Postfix (for outgoing mail)

Some of these steps are taken from the Rackspace Cloud Server Knowledgebase.

Create a new server instance

Log in to http://manage.rackspacecloud.com and create a new server instance with Ubuntu 9.10. Any instance size is great. I’d recommend naming your server with your FQDN as it saves a few changes later on.

Securing the server

The Rackspace Cloud Server comes with the root account enabled and no firewall setup. This is not a good thing for a public server. So the first thing we will do is create a new administrator account which we will use to log in via SSH, and then we will set up Iptables as our firewall.

Rackspace will email you the IP address and password of your new server instance.

Log in over SSH to your server instance. If you have a Mac just open a terminal window and enter something like the following:

ssh root@your_server_ip

If you use windows download putty, enter the IP address in the host box and click connect.

You should now be logged in to your new Cloud Server.

The first thing we are going to do is change the root password.

Change the password by using:

passwd

Since we don’t want to log in as root anymore, we need to create a new user.

adduser admin

We want the admin user to be able to become a super user so we need to add admin to the visudo file by entering this:

visudo

Nano will open a file; add the following to the bottom of the file.

admin ALL=(ALL) ALL

Next we will make some changes to the SSH configuration file. It is also a good idea to change the port SSH uses for security. We will also disable root logins and enable admin to log in via SSH.

nano /etc/ssh/sshd_config

Port 54321
PermitRootLogin no
X11Forwarding no
UsePAM no
UseDNS no
AllowUsers admin

To make those changes take effect, restart SSH. You will not be disconnected, but if you do disconnect, you will need to reconnect using your new username and new port.

/etc/init.d/ssh restart

Firewall Configuration

This server will be a web host so very few ports will be opened.

  • HTTP 80
  • HTTPS 443
  • HTTP 10081 (Zend Server CE)
  • SSH 54321

All other ports are dropped.

Create a file named iptables.test.rules in /etc and open it using nano.

nano /etc/iptables.test.rules

Add the file lines to that file. Make changes where required.

* filter
:INPUT DROP [1:48]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [129:20352]  
  

#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT

    

#Accept SSH connections
-A INPUT -p tcp -m state --state NEW --dport 54321 -j ACCEPT    

#Accept Established connections
-A INPUT -m state --state RELATED,ESTABLISH -j ACCEPT    

#Accept HTTP connections
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10081 -j ACCEPT

    

#Accept all PING requests on ICMP
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
    

# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT  

COMMIT

Now we are going to load the file to check for errors and to ensure the configuration is valid and our firewall works as expected.

iptables-restore < /etc/iptables.test.rules

You can view the active firewall rules by running this command.

iptables -L

If everything is satisfactory, save the rules into a new file which we will then configure to be automatically loaded upon boot.

iptables-save > /etc/iptables.up.rules

Now we need to add a line to the network interface’s initialization script so that our firewall rules will be loaded upon boot.

nano /etc/network/interfaces

Add the following line after ‘iface lo inet loopback’:

pre-up iptables-restore < /etc/iptables.up.rules

Now before we do anything else, we need to test the configuration. We don’t want to inadvertently lock ourselves out of the server, so we will test the firewall by opening a new SSH connection in a new window. As long as we don’t close our currently active connection we can still make changes if our new SSH connection fails.

If you can successfully connect to the server with the new account on the new port with the firewall rules enabled, then you should reboot the server and verify that iptables loads your configuration file on boot.

sudo reboot

You will be disconnected from both your SSH sessions.
Try reconnecting after 20 or 30 seconds, log in and then check your firewall configuration.

iptables -L

If the rules load successfully then we can move onto the next step.

Time Synchronization Setup

Run the timezone package configuration wizard selecting your time zone.

sudo dpkg-reconfigure tzdata

Create a cron job script:

sudo nano /etc/cron.daily/ntpdate

Enter the following in the /etc/cron.daily/ntpdate file:

sudo ntpdate ntp.ubuntu.com

Change permissions of the cron job script:

sudo chmod 755 /etc/cron.daily/ntpdate

Configure User Locales:

sudo locale-gen en_US.UTF-8

Configure local time zone:

sudo ln -sf /usr/share/zoneinfo/America/Toronto /etc/localtime

Outgoing Mail Server Setup

Install postfix and mail tools:

sudo apt-get install postfix mailx

MySQL Installation

Run the following command to install MySQL:

sudo apt-get install mysql-server

Zend Server CE Setup

I prefer the manual installation method. Instructions can be found here on Zend’s site.
I use a portion of those instructions in my setup.

Define a new package repository by opening the following file: /etc/apt/sources.list and adding the line:

deb http://repos.zend.com/zend-server/deb server non-free

Now download the GPG key:

sudo wget http://repos.zend.com/deb/zend.key -O- |sudo apt-key add -

Update the package list:

sudo apt-get update

Install Zend Server with PHP 5.3. Note: Zend does provide Zend Server with PHP 5.2 packages. View the Zend Server CE documentation for more information.

sudo apt-get install zend-server-ce-php-5.3

I like to install phpmyadmin but it is optional:

sudo apt-get install phpmyadmin-zend-server
Share