Codeworks'12 Rock Solid Deployment of PHP Apps

Preview:

DESCRIPTION

Web applications are becoming increasingly more complex, so deployment is not just transferring files with FTP anymore. We will go over the different challenges and how to deploy our PHP applications effectively, safely and consistently with the latest tools and techniques.

Citation preview

Pablo Godel @pgodel - codeworks.phparch.comOct 3rd 2012 - Boca Raton, FL

Rock Solid Deploymentof PHP Applications

Wednesday, October 3, 2012

Who Am I?

⁃ Born in Argentina, living in the US since 1999⁃ PHP & Symfony developer

⁃ Founder of the original PHP mailing list in spanish ⁃ Master of the parrilla

Wednesday, October 3, 2012

Wednesday, October 3, 2012

Wednesday, October 3, 2012

⁃ Founded ServerGrove Networks in 2005

⁃ Provider of web hosting specialized in PHP, Symfony, ZendFramework, MongoDB and others

⁃ Servers in USA (right here in Miami) and Europe!

ServerGrove!

Wednesday, October 3, 2012

⁃ Very active open source supporter through codecontributions and usergroups/conference sponsoring

Community is our teacher

Wednesday, October 3, 2012

Deployment

?Wednesday, October 3, 2012

Deployment

Software deployment is all of the activities that makea software system available for use.

http://en.wikipedia.org/wiki/Software_deployment

Wednesday, October 3, 2012

Deployment

A very important part of the application life-cycle

Wednesday, October 3, 2012

Deployment

A very important critical part of the application life-cycle

Wednesday, October 3, 2012

Deployment

It should not be an after thought

Wednesday, October 3, 2012

Deployment

It should be predictable

Wednesday, October 3, 2012

Deployment

The more you do it the better it goes

Wednesday, October 3, 2012

Wednesday, October 3, 2012

Deployment: Goals

Wednesday, October 3, 2012

Deployment: Goals

One-click deploys

Wednesday, October 3, 2012

Continuous deploys

Deployment: Goals

Wednesday, October 3, 2012

PHP AppsDeployment

Wednesday, October 3, 2012

PHP AppsDeployment

Wednesday, October 3, 2012

PHP AppsDeployment

Wednesday, October 3, 2012

Anytime & Anywhere

Deployment: Goals

Wednesday, October 3, 2012

Anyone

Deployment: Goals

Wednesday, October 3, 2012

Reliable

Deployment: Goals

Wednesday, October 3, 2012

Rollbacks

Deployment: Goals

Wednesday, October 3, 2012

No downtime

Deployment: Goals

Wednesday, October 3, 2012

Reusable

Deployment: Goals

Wednesday, October 3, 2012

Scalable

Deployment: Goals

Wednesday, October 3, 2012

• One-click / continuous deploys• Anytime & Anywhere• Anyone • No downtime• Predictable & Reliable• Rollbacks• Reusable• Scalable

Deployment: Goals

Wednesday, October 3, 2012

Deployment Facts

Wednesday, October 3, 2012

Deployment: Fact #1

Deployment starts with the developer

• Setup development environment to be as close as possible to productions servers

• Setup test/qa/staging servers• Use Vagrant to manage VMs• Use Puppet/Chef to manage OS packages/

configuration

Wednesday, October 3, 2012

Deployment: Fact #2

Success linked to server OS setup

• Use Puppet/Chef to manage OS packages/configuration

• Create OS packages for 3rd party software• Setup your own package repositories

Wednesday, October 3, 2012

Deployment: Fact #3

Monitoring is uptime

• Use monitoring tools to know what is going on with your servers (Ganglia, Cacti, Zabbix, etc.)

• Add monitoring and metrics to your app (Graphite, StatsD, New Relic)

• Use your logs wisely (Graylog, Logstash, Kibana)

Wednesday, October 3, 2012

Deployment Methodologies

Wednesday, October 3, 2012

Deployment Methodologies

• VIM-style• FTP uploads• rsync• source control (svn, git)• Build tools (ant, phing)• Specialized tools (capistrano, fabric, etc)• Package based (rpm, deb, etc)

Wednesday, October 3, 2012

Web Apps Deployment: Steps overview

Wednesday, October 3, 2012

Web Apps Deployment: First time

• Copy files to server(s)• Set server-side configurations• Load DB fixtures• Process and install assets• Warm up cache• “Enable” site

Wednesday, October 3, 2012

• Copy files to server(s)• Apply DB updates (migrations)• Process and install assets• Warm up cache• “Enable” site

Web Apps Deployment: Subsequent times

Wednesday, October 3, 2012

Deployment: Challenges

Wednesday, October 3, 2012

Deployment: Challenges

• rsync• git pull• setup git repo on local network to save

bandwidth and avoid issues if git server is down (i.e. github)

Challenge:Fast & reliable copy of files

Solutions:

Wednesday, October 3, 2012

Deployment: Challenges

• use a tool that allows to go from 1 to n servers easily (i.e. capistrano)

• pssh allows to send commands to n servers in parallel

• package your app in OS packages like .rpm/.deb to easily install across n servers

Challenge:Scalable

Solutions:

Wednesday, October 3, 2012

Deployment: Challenges

• test!• tag releases• dedicated branches (master for production)• deploy each release in its own directory

Challenge:Rollbacks

Solutions:

Wednesday, October 3, 2012

Deployment: Challenges

• use ssh based connections• donʼt store passwords on source control• store sensitive strings (passwords) in server

environment variables

Challenge:Secure

Solutions:

Wednesday, October 3, 2012

Deployment: Challenges

Challenge:DB migrations

Solutions:• Doctrine Migrations• Consider document oriented DBs like

MongoDB

“The best migrations are the ones you don’t have to do”

Wednesday, October 3, 2012

Deployment: Challenges

Challenge:Static assets

Solutions:• YUICompress shrinks JS and CSS file sizes• Enable web server compression• Add versioning to static assets links (code.js?v=1)• Assetic combines multiple files into one• Run utilities locally or in a staging server, deploy

resultWednesday, October 3, 2012

Deployment: Challenges

Challenge:Caching

Solutions:• Update one server while others handle load• Group servers and update group at a time• execute commands on “finalize” to clear up APC

cache

Wednesday, October 3, 2012

Deployment: Challenges

Challenge:File permission conflicts

Solutions:• Run Apache/PHP with same user• Use php-fpm instead of mod_php• Create “deploy” user and add web server to the

group• Use setfacl to give write access to multiple users

Wednesday, October 3, 2012

PHP Apps Deployment: Other common pitfalls

Wednesday, October 3, 2012

PHP Apps Deployment: Other common pitfalls

• Case sensitive filesystems• Configuration differences• Outdated 3rd party software• Github down

$ git daemon --base-path=/git/repo/path/ --export-all

$ git clone git://127.0.0.1/repo

http://ozmm.org/posts/when_github_goes_down.htmlWednesday, October 3, 2012

PHP Apps Deployment: Examples

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Simplest continuous deployment ever!

<?php

exec(ʻ/usr/bin/env -i HOME=/var/www git pullʼ);echo “All done!”;

hook.php

screenshot

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capistrano

• Ruby based• Very extensible• Large number of extensions• Simple client side installation

$ gem install capistrano

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capistrano

set :application, "myapp" # Application nameset :deploy_to, "/var/www/myapp"

set :user, "deployer"set :use_sudo, false # sudo isn't required

set :deploy_via, :remote_cache set :repository, "git@github.com:user/repo.git"

role :web, "server.example.com", “server2.example.com”

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capistrano

$ cap deploy$ cap deploy:migrations$ cap deploy:rollback

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capifony (Symfony2)

• Extension of Capistrano• Implements lots of needed features

for Symfony• Great documentation

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capifony (Symfony2)

$ capifony .

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capifony (Symfony2)set :keep_releases, 3

# directories that will be shared between all deploymentsset :shared_children, [ app_path + "/logs", web_path + "/uploads"]

set :update_vendors, true# set :use_composer, true

set :dump_assetic_assets, true

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capifony (Symfony2)

$ cap deploy:setup

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

Capifony (Symfony2)

|-- httpdocs| `-- index.php|-- releases`-- shared |-- logs `-- uploads

5 directories, 1 file

Wednesday, October 3, 2012

PHP Apps Deployment: Examples

$ cap deploy$ cap deploy:migrations$ cap deploy:rollback

Capifony (Symfony2)

Wednesday, October 3, 2012

PHP Apps Deployment:Other options

• Fabric• WePloy• Phing• Magallanes• Jenkins

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

App Metrics: StatsD & Graphite

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Logging: LogstashShip logs from any source, parse them, get the right timestamp, index them, and search them

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Logging: Logstash

Configure Apache to log jsonLogFormat "{ \"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \"@fields\": { \"client\": \"%a\", \"duration_usec\": %D, \"status\": %s, \"request\": \"%U%q\", \"method\": \"%m\", \"referrer\": \"%{Referer}i\" } }" logstash_json

# Write our 'logstash_json' logs to logs/access_json.logCustomLog logs/access_json.log logstash_json

{ "@timestamp": "2012-08-22T14:35:19-0700", "client": "127.0.0.1", "duration_usec": 532, "status": 404, "request": "/favicon.ico", "method": "GET", "referrer": "-" }

Result

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Logging: Graylog

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Logging: KibanaKibana is a user friendly way to view, search and visualize your log data

Wednesday, October 3, 2012

PHP Apps Deployment: Tools

Packaging: fpm

https://github.com/jordansissel/fpm

Build packages for multiple platforms (deb, rpm, etc) with great ease and sanity.

fpm -s dir -t rpm -n "myapp" -v 1.0 /var/www/myapp

fpm -s dir -t deb -a all -n myapp -v 1.0 /etc/apache2/conf.d/my.conf /var/www/myapp

Wednesday, October 3, 2012

PHP Apps Deployment: Time for demo

Wednesday, October 3, 2012

PHP Apps Deployment: Summary

Wednesday, October 3, 2012

•Stop using FTP

Wednesday, October 3, 2012

•Stop using FTP•Plan early

Wednesday, October 3, 2012

•Stop using FTP•Plan early•Practice

Wednesday, October 3, 2012

•Stop using FTP•Plan early•Practice•Monitor

Wednesday, October 3, 2012

•Stop using FTP•Plan early•Practice•Monitor•AUTOMATE!

Wednesday, October 3, 2012

QUESTIONS?

Feedback: http://joind.in/event/view/1062Slides: http://slideshare.net/pgodel

Twitter: @pgodelE-mail: pablo@servergrove.com

Wednesday, October 3, 2012

Thank you!

Feedback: https://joind.in/7227Slides: http://slideshare.net/pgodel

Twitter: @pgodelE-mail: pablo@servergrove.com

Wednesday, October 3, 2012

Recommended