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.
1. Rock Solid Deployment
of PHP Applications
Pablo Godel @pgodel - codeworks.phparch.com
Oct 3rd 2012 - Boca Raton, FL
Wednesday, October 3, 2012
2. 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
5. ServerGrove!
⁃ 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!
Wednesday, October 3, 2012
6. Community is our teacher
⁃ Very active open source supporter through code
contributions and usergroups/conference sponsoring
Wednesday, October 3, 2012
8. Deployment
Software deployment is all of the activities that make
a software system available for use.
http://en.wikipedia.org/wiki/Software_deployment
Wednesday, October 3, 2012
9. Deployment
A very important part of
the application life-cycle
Wednesday, October 3, 2012
10. Deployment
A very important critical part
of the application life-cycle
Wednesday, October 3, 2012
11. Deployment
It should not be an
after thought
Wednesday, October 3, 2012
12. Deployment
It should be predictable
Wednesday, October 3, 2012
13. Deployment
The more you do it the
better it goes
Wednesday, October 3, 2012
30. 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
31. 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
32. 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
36. 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
37. Web Apps Deployment:
Subsequent times
• Copy files to server(s)
• Apply DB updates (migrations)
• Process and install assets
• Warm up cache
• “Enable” site
Wednesday, October 3, 2012
39. Deployment: Challenges
Challenge:
Fast & reliable copy of files
Solutions:
• rsync
• git pull
• setup git repo on local network to save
bandwidth and avoid issues if git server is down
(i.e. github)
Wednesday, October 3, 2012
40. Deployment: Challenges
Challenge:
Scalable
Solutions:
• 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
Wednesday, October 3, 2012
41. Deployment: Challenges
Challenge:
Rollbacks
Solutions:
• test!
• tag releases
• dedicated branches (master for production)
• deploy each release in its own directory
Wednesday, October 3, 2012
42. Deployment: Challenges
Challenge:
Secure
Solutions:
• use ssh based connections
• donʼt store passwords on source control
• store sensitive strings (passwords) in server
environment variables
Wednesday, October 3, 2012
43. 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
44. 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
result
Wednesday, October 3, 2012
45. 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
46. 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
51. PHP Apps Deployment:
Examples
Capistrano
• Ruby based
• Very extensible
• Large number of extensions
• Simple client side installation
$ gem install capistrano
Wednesday, October 3, 2012
52. PHP Apps Deployment:
Examples
Capistrano
set :application, "myapp" # Application name
set :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
53. PHP Apps Deployment:
Examples
Capistrano
$ cap deploy
$ cap deploy:migrations
$ cap deploy:rollback
Wednesday, October 3, 2012
54. PHP Apps Deployment:
Examples
Capifony (Symfony2)
• Extension of Capistrano
• Implements lots of needed features
for Symfony
• Great documentation
Wednesday, October 3, 2012
56. PHP Apps Deployment:
Examples
Capifony (Symfony2)
set :keep_releases, 3
# directories that will be shared between all deployments
set :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
57. PHP Apps Deployment:
Examples
Capifony (Symfony2)
$ cap deploy:setup
Wednesday, October 3, 2012
63. PHP Apps Deployment:
Tools
Logging: Logstash
Ship logs from any source, parse them, get the right
timestamp, index them, and search them
Wednesday, October 3, 2012
66. PHP Apps Deployment:
Tools
Logging: Kibana
Kibana is a user friendly way to view, search and visualize
your log data
Wednesday, October 3, 2012
67. PHP Apps Deployment:
Tools
Packaging: 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
https://github.com/jordansissel/fpm
Wednesday, October 3, 2012