Configuring Multiple Apache Instances on Ubuntu: Independent Service Management


4 views

Running multiple Apache instances on a single Ubuntu system requires careful configuration of ports, document roots, and service files. The primary constraint comes from Apache's default design to occupy port 80/443.

First, create a second installation using different compilation prefixes:

sudo apt install apache2
sudo cp -r /etc/apache2 /etc/apache2-instance2

Edit the secondary instance's ports.conf:

Listen 8080
<IfModule ssl_module>
    Listen 8443
</IfModule>

Create a new systemd service for the second instance at /etc/systemd/system/apache2-instance2.service:

[Unit]
Description=The Apache HTTP Server (Instance 2)
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/default/apache2-instance2
ExecStart=/usr/sbin/apachectl -f /etc/apache2-instance2/apache2.conf -k start
ExecStop=/usr/sbin/apachectl -f /etc/apache2-instance2/apache2.conf -k stop
ExecReload=/usr/sbin/apachectl -f /etc/apache2-instance2/apache2.conf -k graceful

[Install]
WantedBy=multi-user.target

Create environment file /etc/default/apache2-instance2:

APACHE_RUN_USER=www-data
APACHE_RUN_GROUP=www-data
APACHE_PID_FILE=/var/run/apache2-instance2.pid
APACHE_RUN_DIR=/var/run/apache2-instance2
APACHE_LOCK_DIR=/var/lock/apache2-instance2
APACHE_LOG_DIR=/var/log/apache2-instance2

Create necessary directories:

sudo mkdir -p /var/{run,lock}/apache2-instance2
sudo mkdir /var/log/apache2-instance2
sudo chown -R www-data:www-data /var/{run,lock,log}/apache2-instance2

Start both instances independently:

sudo systemctl start apache2
sudo systemctl start apache2-instance2

Verify using curl:

curl -I http://localhost
curl -I http://localhost:8080

For virtual host separation:

<VirtualHost *:8080>
    ServerAdmin webmaster@instance2.local
    DocumentRoot /var/www/instance2
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Ensure proper SELinux/AppArmor configurations:

sudo aa-genprof /usr/sbin/apache2
sudo audit2allow -a

Check for port conflicts:

sudo netstat -tulnp | grep apache

View instance-specific logs:

sudo tail -f /var/log/apache2-instance2/error.log

Running multiple Apache web servers on a single Ubuntu system is useful for development environments where you need to test different configurations, host multiple projects with separate settings, or maintain isolated environments for different clients. The key challenge is configuring each instance to use unique ports, configuration files, and PID files.

First, create a copy of the default Apache configuration directory for your second instance:

sudo cp -r /etc/apache2 /etc/apache2-instance2

Edit the main configuration file for your second instance:

sudo nano /etc/apache2-instance2/apache2.conf

Change these critical parameters:

PidFile /var/run/apache2-instance2.pid
Listen 8080  # Use a different port than your main Apache instance

Create a new systemd service file for the second instance:

sudo nano /etc/systemd/system/apache2-instance2.service

Add this configuration:

[Unit]
Description=Apache HTTP Server (Instance 2)
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/apache2 -f /etc/apache2-instance2/apache2.conf -k start
ExecStop=/usr/sbin/apache2 -f /etc/apache2-instance2/apache2.conf -k stop
ExecReload=/usr/sbin/apache2 -f /etc/apache2-instance2/apache2.conf -k graceful
PIDFile=/var/run/apache2-instance2.pid

[Install]
WantedBy=multi-user.target

Reload systemd and start your new Apache instance:

sudo systemctl daemon-reload
sudo systemctl start apache2-instance2
sudo systemctl enable apache2-instance2

Check the status of both Apache servers:

sudo systemctl status apache2
sudo systemctl status apache2-instance2

Test access to both web servers by visiting:

http://localhost
http://localhost:8080

For more complex setups, you might want to:

  • Use different document roots for each instance
  • Configure separate log files
  • Set different environment variables
  • Assign different system users

Example document root configuration:

DocumentRoot /var/www/instance2
<Directory /var/www/instance2>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

If you encounter port conflicts:

sudo netstat -tulpn | grep apache

For permission issues:

sudo chown -R www-data:www-data /var/www/instance2