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