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);
?>