Share
Embed
Going Beyond mod_php
A discussions of architecture options available for today's PHP deployments. Presented to Kansas City's PHP User Group.
Daniel Holmes
August 17, 2013
Transcript
45 slides
-
Questions to Answer today • What could be better than
Apache & mod_php? • What is php-fpm? What does it look like? • How does it help Apache be better? • What kind of extra features are in php-fpm? • What is "Opcode caching"? • What is Nginix? • But not exactly - How do I set it up? -
Apache is so much more Loaded Modules: core_module mpm_prefork_module http_module
so_module auth_basic_module auth_digest_module authn_file_module authn_alias_module authn_anon_module authn_dbm_module authn_default_module authz_host_module authz_user_module authz_owner_module authz_groupfile_module authz_dbm_module authz_default_module ldap_module authnz_ldap_module include_module log_config_module logio_module env_module ext_filter_module mime_magic_module expires_module deflate_module headers_module usertrack_module setenvif_module mime_module dav_module status_module autoindex_module vhost_alias_module negotiation_module dir_module actions_module speling_module userdir_module alias_module rewrite_module cache_module suexec_module mem_cache_module version_module security2_module unique_id_module php5_module proxy_ajp_module ssl_module PHP is just one of many: apachectl -t -D DUMP_MODULES -
Apache is so much more Loaded Modules: core_module mpm_prefork_module http_module
so_module auth_basic_module auth_digest_module authn_file_module authn_alias_module authn_anon_module authn_dbm_module authn_default_module authz_host_module authz_user_module authz_owner_module authz_groupfile_module authz_dbm_module authz_default_module ldap_module authnz_ldap_module include_module log_config_module logio_module env_module ext_filter_module mime_magic_module expires_module deflate_module headers_module usertrack_module setenvif_module mime_module dav_module status_module autoindex_module vhost_alias_module negotiation_module dir_module actions_module speling_module userdir_module alias_module rewrite_module cache_module suexec_module mem_cache_module version_module security2_module unique_id_module php5_module proxy_ajp_module ssl_module PHP is just one of many: apachectl -t -D DUMP_MODULES -
What makes this better? • Apache gets to do what
it does best • PHP becomes a service of flexible, restartable application pools -
php-fpm pools configured separately • logging • custom runtime environments
• resource allocation • running as user/groups • restrictions around what can access the pool -
configuring php-fpm pools [myphpadmz] user = www-phpadm group = www-phpadm
listen = /tmp/php5-myphpadmz-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0666 listen.allowed_clients = 127.0.0.1 -
configuring php-fpm pools pm = dynamic pm.max_children = 10 pm.start_servers
= 4 pm.min_spare_servers = 2 pm.max_spare_servers = 6 pm.max_requests = 500 chdir = /u01/myphpadmz/public_html security.limit_extensions = .php -
configuring php-fpm pools ; Pass environment variables like LD_LIBRARY_PATH. ;
All $VARIABLEs are taken from the current environment. ; Default Value: clean env env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp -
configuring php-fpm pools ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f [email protected]
php_flag[display_errors] = off php_admin_value[error_log] = /var/weblogs/phpmyadmz/php.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 128M -
configuring php-fpm pools ;access.log = log/$pool.access.log ;access.format = %R -
%u %t "%m %r%Q%q" %s %f %{mili}d %{kilo} M %C%% ;slowlog = log/$pool.log.slow ;request_slowlog_timeout = 0 ;request_terminate_timeout = 0 ;rlimit_files = 1024 ;rlimit_core = 0 ;chroot = ;catch_workers_output = yes -
The missing Link? Naturally, Apache can’t talk to php-fpm It
needs a module -
The missing Link FastCGI is the interface php-fpm expects to
use with the Web Server -
The missing Link For Apache, is generally: • mod_fcgi •
mod_fastcgi This can get confusing when you are looking at blogs, so listen up! -
mod_fcgi Newer, Bigger Brother Duplicates a lot already in php-fpm
Useful for non php-fpm cgi’s Can be used with mod_suexec Available in most package managers -
mod_fastcgi Simple to configure Doesn’t manage it’s own pool Is
simply a FastCGI interface May not come with your Package Manager, but easy to build -
mod_fastcgi in apache <IfModule mod_fastcgi.c> AddHandler php5-myphpa-fcgi .php Action php5-myphpa-fcgi
/php5.myphpa.fcgi Alias /php5.myphpa.fcgi /usr/lib/cgi-bin/php5.myphpa.fcgi FastCGIExternalServer /usr/lib/cgi-bin/php5.myphpa.fcgi -socket /tmp/php5-myphpadmz-fpm.sock </IfModule> -
Kicking up the Heat Other things we can do: •
Adding an Opcode Cache • Logging Slow PHP requests • Replacing Apache? -
Adding an OpCode cache • Full stack frameworks are big
• Wordpress is big • Drupal is big • 100+ php scripts need to be compiled per requests • php's compiler is still FREAKY FAST • But still, that's a lot of compiling -
Opcode Caching Options • Zend's Opcache ◦ Recently Open Sourced,
built into PHP 5.5 • APC ◦ LOTS of years of production use. ◦ Additional software ◦ APC can also act like a generic cache much like mcached...but that's a whole other talk -
Zend’s PHP’s Opcache Looking at Chris Jones' post, in 5.5
is should be as easy as: ; Adding the extension ... zend_extension=opcache.so ; and turning it on... opcache.enable=On -
APC - Alternate PHP Cache Install from PECL or your
OS's package manager Can use a .php script to see statistics LOTS of blog posts on helping configure with your setup http://www.electrictoolbox.com/apc-php-cache-information/ -
Replacing Apache Apache is still a GREAT, mature, well tested
server Now we get to ask the questions: • Do we need or even use what it offers? • Can we squeeze out more performance with something else? • Is there something easier to configure? -
Nginx Was originally a Reverse Proxy -- so built for
speed May take less memory (so more for php and mysql) Supports fastcgi natively Allows precise control with a simpler syntax Is not Apache -- so no .htaccess files Still "new" compared to Apache's maturity, but this doesn't mean experimental -
Nginx Config location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info
^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php. ini fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; -
Nginx Config Like Apache, you can also configure Nginx to:
• route all non-matching requests through an index.php script (Wordpress, Drupal, etc) • block access to config files, etc. • configure extra modules to add functionality -
Nginx and php-fpm Notice the nginx processes are tiny both
in resident and virtual sizes -
Want to dive deeper? Just ask! KC PUG is always
looking for speakers and topic ideas Don’t be afraid to speak up! http://www.meetup.com/kcphpug/suggestion/