Configure Apache with event MPM+php-fpm
We are almost done with this set of tuning. We will be changing the configuration of Apache from prefork MPM+mod_php to event MPM+php-fpm.
Previously, Apache's main multiprocessing module was prefork MPM, but since Apache 2.4 you can choose to use event MPM. If you couple event MPM with fast cgi's php-fpm, your machine will use less memory and prevent the performance drop related to increased concurrent connections.
If you want something to compare it to, it is very similar to the recently popular lightweight high speed web server Nginx. This is probably why this configuration has been dubbed the new Apache, since it takes the merits of Apache's abundant modules and flexible htaccess control and produces much better performance.
First, install and enable php-fpm.
[root@ip plugins]# yum install php-fpm -y [root@ip plugins]# systemctl enable php-fpm [root@ip plugins]# systemctl start php-fpm
Next we will edit Apache's settings files: "/etc/httpd/conf.modules.d/00- mpm.conf", "/etc/httpd/conf.d/php.conf", "/etc/httpd/conf/httpd.conf"
1. # Select the MPM module which should be used by uncommenting exactly 2. # one of the following LoadModule lines: 3. # prefork MPM: Implements a non-threaded, pre-forking web server 4. # See: http://httpd.apache.org/docs/2.4/mod/prefork.html 5. #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 6. # worker MPM: Multi-Processing Module implementing a hybrid 7. # multi-threaded multi-process web server 8. # See: http://httpd.apache.org/docs/2.4/mod/worker.html 9. # 10. #LoadModule mpm_worker_module modules/mod_mpm_worker.so 11. # event MPM: A variant of the worker MPM with the goal of consuming 12. # threads only for connections with active processing 13. # See: http://httpd.apache.org/docs/2.4/mod/event.html 14. # 15. LoadModule mpm_event_module modules/mod_mpm_event.so
[/etc/httpd/conf.modules.d/00- mpm.conf | Lines 5 and 15 are modified]
1. <IfModule prefork.c> 2. # 3. # Cause the PHP interpreter to handle files with a .php extension. 4. # 5. <FilesMatch \.php$> 6. SetHandler application/x-httpd-php 7. </FilesMatch> 8. # 9. # Allow php to handle Multiviews 10. # 11. AddType text/html .php 12. # 13. # Add index.php to the list of files that will be served as directory 14. # indexes. 15. # 16. DirectoryIndex index.php 17. # 18. # Uncomment the following lines to allow PHP to pretty-print .phps 19. # files as PHP source code: 20. # 21. #<FilesMatch \.phps$> 22. # SetHandler application/x-httpd-php-source 23. #</FilesMatch> 24. # 25. # Apache specific PHP configuration options 26. # those can be override in each configured vhost 27. # 28. php_value session.save_handler "files" 29. php_value session.save_path "/var/lib/php/session" 30. </IfModule>
[/etc/httpd/conf.d/php.conf | Lines 1 and 30 are modified]
1. (omitted) 2. # 3. # DirectoryIndex: sets the file that Apache will serve if a directory 4. # is requested. 5. # 6. <IfModule dir_module> 7. DirectoryIndex index.php index.html 8. </IfModule> 9. (omitted) 10. # Supplemental configuration 11. # 12. # Load config files in the "/etc/httpd/conf.d" directory, if any. 13. IncludeOptional conf.d/*.conf 14. # gzip setting 15. AddOutputFilterByType DEFLATE text/html text/plain text/css 16. AddOutputFilterByType DEFLATE text/javascript application/x-javascript application/javascript 17. BrowserMatch ^Mozilla/4 gzip-only-text/html 18. BrowserMatch ^Mozilla/4.0[678] no-gzip 19. BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 20. # expire setting 21. ExpiresActive On 22. ExpiresDefault "access plus 600 seconds" 23. ExpiresByType text/html "access plus 10 seconds" 24. # event MPM setting 25. <IfModule mpm_event_module> 26. StartServers 2 27. MinSpareThreads 25 28. MaxSpareThreads 50 29. ThreadsPerChild 50 30. MaxRequestWorkers 50 31. MaxConnectionsPerChild 0 32. <FilesMatch \.php$> 33. SetHandler "proxy:fcgi://127.0.0.1:9000"34. </FilesMatch> 35. </IfModule>
[/etc/httpd/conf/httpd.conf | Lines 7 and 24-35 are modified]
Restart Apache for the changes to take effect.
[root@ip plugins]# systemctl restart httpd
In my environment, page load time was 33ms and requests per second was 60.79, a performance boost of 5%.