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, "[email protected]: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: [email protected]
Wednesday, October 3, 2012
Thank you!
Feedback: https://joind.in/7227Slides: http://slideshare.net/pgodel
Twitter: @pgodelE-mail: [email protected]
Wednesday, October 3, 2012