How to Configure Separate php.ini Files for Each Apache Virtual Host in LAMP Stack


2 views

In multi-site LAMP environments, different virtual hosts often require unique PHP configurations. While the global php.ini serves as the foundation, individual projects may need:

  • Custom memory_limit settings
  • Project-specific error logging
  • Distinct upload_max_filesize values
  • Environment-specific PHP extensions

We'll explore three approaches with increasing granularity:

Method 1: Using .user.ini Files

For PHP 5.3+ with CGI/FPM:


# In /var/www/website1.com/public_html/.user.ini
memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 55M

Method 2: PHPIniDir Directive

In your Apache vhost configuration:


<VirtualHost *:80>
    ServerName website1.com
    DocumentRoot /var/www/website1.com/public_html
    PHPIniDir /var/www/website1.com/config/
    <Directory "/var/www/website1.com/public_html">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Place your custom php.ini in the specified directory.

Method 3: PHP-FPM Pool Configuration

For PHP-FPM users, in /etc/php/7.4/fpm/pool.d/website1.conf:


[website1]
user = website1
group = website1
listen = /run/php/website1.sock
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 100M
php_admin_flag[display_errors] = off

Create a test file in each vhost:


<?php
phpinfo();
?>

Check these key sections:

  • Loaded Configuration File
  • Additional .ini files parsed
  • Per-directory values

When implementing multiple configurations:

  • Monitor opcache impact with multiple ini files
  • Consider memory overhead for FPM pools
  • Use include_path carefully to avoid redundancy

When managing multiple websites on a single Apache server, different PHP applications often require distinct configurations. The standard approach of using a single php.ini file becomes limiting when:

  • Different sites need varied memory_limit settings
  • Specific projects require custom error_reporting levels
  • Applications demand unique session handling configurations

There are three primary approaches to achieve per-virtual-host PHP configuration:

# Method 1: Using .user.ini files (PHP 5.3+)
# Create in web root directory
memory_limit = 256M
upload_max_filesize = 50M

# Method 2: PHP-FPM pool configuration
[website1]
php_admin_value[memory_limit] = "256M"
php_admin_value[upload_max_filesize] = "50M"

# Method 3: Apache SetHandler directive
<VirtualHost *:80>
    ServerName website1.com
    PHPINIDir /var/www/website1.com/config
</VirtualHost>

For most modern setups using PHP-FPM, the cleanest solution is:

# In your virtual host configuration
<VirtualHost *:80>
    ServerName website1.com
    DocumentRoot /var/www/website1.com/public
    
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.4-fpm-website1.sock|fcgi://localhost"
    </FilesMatch>
    
    # Custom PHP settings
    <Directory "/var/www/website1.com/public">
        php_admin_value memory_limit "256M"
        php_admin_value upload_max_filesize "50M"
    </Directory>
</VirtualHost>
  • Security implications when allowing .user.ini overrides
  • Performance impact of scanning for .user.ini files
  • Configuration precedence hierarchy in PHP
  • Best practices for production environments

To verify your per-host settings are applied:

<?php
// Create test.php in each virtual host
phpinfo(INFO_CONFIGURATION | INFO_MODULES);
?>