Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Going Beyond mod_php

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
Tweet

More Decks by Daniel Holmes

Other Decks in Programming

Transcript

  1. 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?
  2. 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
  3. 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
  4. What makes this better? • Apache gets to do what

    it does best • PHP becomes a service of flexible, restartable application pools
  5. php-fpm pools configured separately • logging • custom runtime environments

    • resource allocation • running as user/groups • restrictions around what can access the pool
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. The missing Link For Apache, is generally: • mod_fcgi •

    mod_fastcgi This can get confusing when you are looking at blogs, so listen up!
  12. 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
  13. 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
  14. 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>
  15. Kicking up the Heat Other things we can do: •

    Adding an Opcode Cache • Logging Slow PHP requests • Replacing Apache?
  16. 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
  17. 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
  18. 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
  19. 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/
  20. 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?
  21. 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
  22. 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;
  23. 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
  24. 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/