Slide 1

Slide 1 text

Going beyond mod_php Understanding php-fpm

Slide 2

Slide 2 text

Today’s Theme Making your PHP Server perform even better

Slide 3

Slide 3 text

Questions to Answer today

Slide 4

Slide 4 text

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?

Slide 5

Slide 5 text

Apache is... Webserver

Slide 6

Slide 6 text

Apache on the Server ps -ef | grep apache

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Apache + mod_php

Slide 10

Slide 10 text

Apache + mod_php

Slide 11

Slide 11 text

Apache + mod_php

Slide 12

Slide 12 text

Apache is a great....

Slide 13

Slide 13 text

Apache is a great... Webserver

Slide 14

Slide 14 text

Apache + php-fpm

Slide 15

Slide 15 text

Apache + php-fpm

Slide 16

Slide 16 text

Apache + php-fpm

Slide 17

Slide 17 text

Apache Now smaller, multi-threaded, consistent, and a lot more of them...

Slide 18

Slide 18 text

php-fpm And our PHP pools are just waiting for scripts to run.

Slide 19

Slide 19 text

What makes this better? ● Apache gets to do what it does best ● PHP becomes a service of flexible, restartable application pools

Slide 20

Slide 20 text

php-fpm pools configured separately ● logging ● custom runtime environments ● resource allocation ● running as user/groups ● restrictions around what can access the pool

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

The missing Link? Naturally, Apache can’t talk to php-fpm It needs a module

Slide 27

Slide 27 text

The missing Link FastCGI is the interface php-fpm expects to use with the Web Server

Slide 28

Slide 28 text

The missing Link For Apache, is generally: ● mod_fcgi ● mod_fastcgi This can get confusing when you are looking at blogs, so listen up!

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

mod_fastcgi

Slide 32

Slide 32 text

mod_fastcgi in apache 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

Slide 33

Slide 33 text

Kicking up the Heat Other things we can do: ● Adding an Opcode Cache ● Logging Slow PHP requests ● Replacing Apache?

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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/

Slide 38

Slide 38 text

Logging slow PHP runs php-fpm’s slow query log

Slide 39

Slide 39 text

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?

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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;

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Nginx and php-fpm Notice the nginx processes are tiny both in resident and virtual sizes

Slide 44

Slide 44 text

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/

Slide 45

Slide 45 text

Thank you! @dan_holmes http://kcpug.org