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