How to Configure Per-Domain php.ini Settings in LAMP with NameVirtualHosts


2 views

When hosting multiple websites on a single LAMP server with NameVirtualHost, developers often encounter situations where different sites require unique PHP configurations. A global php.ini file becomes limiting when:

  • Specific sites need custom memory_limit settings
  • Individual projects require different error_reporting levels
  • Certain applications need specialized extensions enabled/disabled

Before implementing per-site configurations:

sudo apt-get install apache2 php libapache2-mod-php
sudo a2enmod php7.x  # Replace with your PHP version

Verify your PHP handler with:

apache2ctl -M | grep php

Method 1: Using .user.ini Files

Create a .user.ini file in your document root:

cd /var/www/example.com/public_html
echo "memory_limit = 256M" >> .user.ini
echo "upload_max_filesize = 50M" >> .user.ini
chmod 644 .user.ini

Method 2: VirtualHost Directives

Edit your VirtualHost configuration (/etc/apache2/sites-available/example.com.conf):

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/public_html
    
    <Directory /var/www/example.com/public_html>
        php_admin_value memory_limit "256M"
        php_admin_value upload_max_filesize "50M"
        php_admin_flag display_errors On
    </Directory>
</VirtualHost>

For PHP-FPM setups, create separate pools:

# /etc/php/7.x/fpm/pool.d/example.com.conf
[example.com]
user = exampleuser
group = examplegroup
listen = /run/php/php7.x-fpm-example.com.sock
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 50M

Then configure Apache to use this pool:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.x-fpm-example.com.sock|fcgi://localhost/var/www/example.com/public_html
  • Ensure php_admin_value directives aren't being overridden
  • Check file permissions on .user.ini files
  • Verify PHP version compatibility with chosen method
  • Restart Apache/PHP-FPM after changes: sudo systemctl restart apache2 php7.x-fpm
  • Document all per-site PHP modifications
  • Implement version control for configuration files
  • Test changes in staging before production
  • Monitor performance impact of custom settings

When managing multiple websites on a single LAMP (Linux, Apache, MySQL, PHP) server using NameVirtualHosts, you might encounter situations where different sites require unique PHP configurations. While the global php.ini works for most cases, certain applications may need custom settings that shouldn't affect other sites.

PHP offers several ways to handle configuration:

1. Global php.ini (affects all sites)
2. Per-directory .user.ini files
3. Apache configuration directives
4. Runtime ini_set() calls

For our scenario, we'll focus on the most maintainable solution: per-virtualhost configuration.

The most robust approach is using PHP's FPM (FastCGI Process Manager) with Apache. Here's how to set it up:

# Install PHP-FPM if not already present
sudo apt install php-fpm  # For Debian/Ubuntu
sudo yum install php-fpm  # For CentOS/RHEL

# Enable proxy_fcgi module
sudo a2enmod proxy_fcgi
sudo systemctl restart apache2

Here's a sample VirtualHost configuration with custom PHP settings:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/public_html

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php/php7.4-fpm-example.com.sock|fcgi://localhost"
    </FilesMatch>

    <Directory /var/www/example.com/public_html>
        php_admin_value upload_max_filesize "50M"
        php_admin_value post_max_size "55M"
        php_admin_value memory_limit "256M"
        php_admin_value max_execution_time "120"
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

For simpler cases, you can use .user.ini files in each site's document root:

# /var/www/example.com/public_html/.user.ini
upload_max_filesize = 50M
post_max_size = 55M
memory_limit = 256M
max_execution_time = 120

When implementing per-site PHP configurations:

  • Always test changes in a staging environment first
  • Document all custom configurations
  • Consider security implications of increased limits
  • Monitor resource usage after implementing changes

If settings don't take effect:

# Check active PHP configuration
php -i | grep "Loaded Configuration File"

# Verify FPM pool configuration
sudo systemctl status php-fpm

# Check Apache error logs
sudo tail -f /var/log/apache2/error.log