Assumptions: In this article, I will be assuming that you have shell access to your web server, the Apache HTTP Server installed (httpd
), the PHP 5.3 CLI installed with the cURL extension, the ability to restart httpd
and are using Unix-based system.
In an earlier article, I described a general system for handling maintenance periods with Apache HTTP Server Version 2.2. In this article, I will describe a system for automating the code changes required.
The configuration settings developed in the previous article were as follows:
ErrorDocument 503 /errors/503.html
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^x\.x\.x\.x$
RewriteCond %{REQUEST_URI} !^/errors/503.html$
RewriteCond %{REQUEST_URI} !^/phpMyAdmin
RewriteRule .* - [R=503]
Header always set Retry-After "3600"
In this version, we will split the settings up into two parts, one static and one dynamic. The first line, ErrorDocument 503 /errors/503.html
is placed into the virtual host configuration file for the site. The rest of the code is automatically generated by a PHP script (enable_maintenance.php
) intended to be run at the command line and is included into the primary Apache configuration file like so:
Include /srv/www/example.com/maintenance-conf.d/*
The dynamic portion of the Apache configuration file is generated through the co-operation of two PHP scripts, and one local and one server-side.
enable_maintenance.php
This script is run locally on your development machine via the (e.g. php enable_maintance.php > maintenance_on.conf
). It uses the remote script, myip.php
to determine the public IP address of your development machine, and generates an Apache configuration file to suit.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/myip.php");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ip_string = curl_exec($ch);
curl_close($ch);
$ip = explode('.', $ip_string);
$output = "RewriteEngine On\n";
$output .= "RewriteCond %{REMOTE_ADDR} !^" . $ip[0] . "\." . $ip[1] . "\." . $ip[2] . "\." . $ip[3] . "$\n";
$output .= "RewriteCond %{REQUEST_URI} !^/errors/503.html$\n";
$output .= "RewriteRule .* - [R=503]\n";
$output .= "Header always set Retry-After \"3600\"\n";
echo($output);
?>
myip.php
myip.php
is placed on the web server and simply returns the IP address of the requesting client.
<?php
echo($_SERVER['REMOTE_ADDR']);
?>
php enable_maintance.php > maintenance_on.conf
on the development machine.maintenance_on.conf
to /server/www/example.com/maintenance-conf.d/maintenance_on.conf
on the serversudo apache2ctl graceful
)/server/www/example.com/maintenance-conf.d/maintenance_on.conf
sudo apache2ctl graceful
)This article was written for the Apache HTTP Server Version 2.2 and PHP version 5.3. The guidance here may or may not work with earlier versions of the software.
Initial version: July 3rd, 2010. Corrected an insignificant typo on September 19th, 2010.