SlideShare a Scribd company logo
WordPress Meetup
Karlsruhe
AutoScaling WordPress
with Docker & AWS
22. September 2016 Jan Löffler, CTO Plesk
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
0%
5%
10%
15%
20%
25%
30%
2011 2012 2013 2014 2015 2016
WordPress related to all websites worldwide
http://w3techs.com/technologies/history_overview/content_management/all/y
# WEBSITES WORLDWIDE
1.058.544.813
http://www.internetlivestats.com/total-number-of-websites/
38% of E-Shops
26,6%
2,7%
2,2%
High Traffic Sites???
NEED
FOR
SPEED
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
my-wordpress-site.com
my-wordpress-site.com
MYSQL ServerLoad-Balancer
my-wordpress-site.com
MYSQL ServerLoad-Balancer
File Storage
my-wordpress-site.com
MYSQL Server
Load-Balancer
File Storage
CDN
MYSQL Server
Kommt ihr noch
mit?
DEPLOYMENT
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
0%
5%
10%
15%
20%
25%
30%
2015 2016
Nutzung von Docker
verdoppelt auf 30%
http://www.rightscale.com/blog/cloud-industry-insights/cloud-computing-trends-2016-state-cloud-survey
my-wordpress-site
Moderne
Web-Entwicklung
2016
IMMUTABLE
INFRASTRUCTURE
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
IMMUTABLE STACKS
ELB myapp-v1
app.example.org
EC2
+ Docker
EC2
+ Docker
EC2
+ Docker
100
%
IMMUTABLE STACKS
ELB myapp-v1
EC2
+ Docker
EC2
+ Docker
EC2
+ Docker
ELB myapp-v2
EC2
+ Docker
EC2
+ Docker
app.example.org
90
%
10
%
IMMUTABLE STACKS
ELB myapp-v1
EC2
+ Docker
EC2
+ Docker
EC2
+ Docker
ELB myapp-v2
EC2
+ Docker
EC2
+ Docker
app.example.org
0% 100
%
APP INSTANCE
VM (EC2)
Basis Image (AMI)
Docker Container
Application
✓ VPC
✓ Security
Groups
✓ AutoScaling
✓ CloudWatch
✓ CloudFront
✓ Route53
✓ Docker Runtime
✓ Logging
✓ Monitoring
✓ Security config
✓ Debian
✓ Nginx
✓ php7-fpm
✓ NewRelic
AWS
API
Docker
Registry
docker pull
docker push
AMI
DER WUNSCH
DIE REALITÄT
$ accept-vpc-peering-connection$
$ allocate-address$
$ allocate-hosts$
$ assign-private-ip-addresses$
$ associate-address$
$ associate-dhcp-options$
$ associate-route-table$
$ attach-classic-link-vpc$
$ attach-internet-gateway$
$ attach-network-interface$
$ attach-volume$
$ attach-vpn-gateway$
$ authorize-security-group-egress$
$ authorize-security-group-ingress$
$ bundle-instance$
$ cancel-bundle-task$
$ cancel-conversion-task$
$ cancel-export-task$
$ cancel-import-task$
$ cancel-reserved-instances-listing$
$ cancel-spot-fleet-requests$
$ cancel-spot-instance-requests$
$ confirm-product-instance$
$ copy-image$
$ copy-snapshot$
$ create-customer-gateway$
$ create-dhcp-options$
$ create-flow-logs$
$ create-image$
$ create-instance-export-task$
$ create-internet-gateway$
$ create-key-pair$
$ create-nat-gateway$
$ create-network-acl$
$ create-network-acl-entry$
$ create-network-interface
$ create-reserved-instances-listing$
$ create-route$
$ create-route-table$
$ create-security-group$
$ create-snapshot$
$ create-spot-datafeed-subscription$
$ create-subnet$
$ create-tags$
$ create-volume$
$ create-vpc$
$ create-vpc-endpoint$
$ create-vpc-peering-connection$
$ create-vpn-connection$
$ create-vpn-connection-route$
$ create-vpn-gateway$
$ delete-customer-gateway$
$ delete-dhcp-options$
$ delete-flow-logs$
$ delete-internet-gateway$
$ delete-key-pair$
$ delete-nat-gateway$
$ delete-network-acl$
$ delete-network-acl-entry$
$ delete-network-interface$
$ delete-placement-group$
$ delete-route$
$ delete-route-table$
$ delete-security-group$
$ delete-snapshot$
$ delete-spot-datafeed-subscription$
$ delete-subnet$
$ delete-tags$
$ delete-volume$
$ delete-vpc$
$ delete-vpc-endpoints$
$ delete-vpc-peering-connection$
$ delete-vpn-connection$
$ delete-vpn-connection-route$
$ delete-vpn-gateway$
$ deregister-image$
$ describe-account-attributes$
$ describe-addresses$
$ describe-availability-zones$
$ describe-bundle-tasks$
$ describe-classic-link-instances$
$ describe-conversion-tasks$
$ describe-customer-gateways$
$ describe-dhcp-options$
$ describe-export-tasks$
$ describe-flow-logs$
$ describe-host-reservation-offerings$
$ describe-host-reservations$
$ describe-hosts$
$ describe-id-format$
$ describe-identity-id-format$
$ describe-image-attribute$
$ describe-images$
$ describe-import-image-tasks$
$ describe-import-snapshot-tasks$
$ describe-instance-attribute$
$ describe-instance-status$
$ describe-instances$
$ describe-internet-gateways$
$ describe-key-pairs$
$ describe-moving-addresses$
$ describe-nat-gateways$
$ describe-network-acls$
$ describe-network-interface-attribute$
$ describe-network-interfaces$
$ describe-placement-groups$
$ describe-prefix-lists$
$ describe-regions$
$ describe-reserved-
$ describe-reserved-
$ describe-reserved-
modifications$
$ describe-reserved-
$ describe-route-tab
$ describe-scheduled
$ describe-scheduled
$ describe-security-
$ describe-security-
$ describe-snapshot-
$ describe-snapshots
$ describe-spot-data
$ describe-spot-flee
$ describe-spot-flee
$ describe-spot-flee
$ describe-spot-inst
$ describe-spot-pric
$ describe-stale-sec
$ describe-subnets$
$ describe-tags$
$ describe-volume-at
$ describe-volume-st
$ describe-volumes$
$ describe-vpc-attri
$ describe-vpc-class
$ describe-vpc-class
$ describe-vpc-endpo
$ describe-vpc-endpo
$ describe-vpc-peeri
$ describe-vpcs$
$ describe-vpn-conne
$ describe-vpn-gatew
$ detach-classic-lin
$ detach-internet-ga
$ detach-network-int
$ detach-volume$
210 calls for EC2
only
$ accept-vpc-peering-connection$
$ allocate-address$
$ allocate-hosts$
$ assign-private-ip-addresses$
$ associate-address$
$ associate-dhcp-options$
$ associate-route-table$
$ attach-classic-link-vpc$
$ attach-internet-gateway$
$ attach-network-interface$
$ attach-volume$
$ attach-vpn-gateway$
$ authorize-security-group-egress$
$ authorize-security-group-ingress$
$ bundle-instance$
$ cancel-bundle-task$
$ cancel-conversion-task$
$ cancel-export-task$
$ cancel-import-task$
$ cancel-reserved-instances-listing$
$ cancel-spot-fleet-requests$
$ cancel-spot-instance-requests$
$ confirm-product-instance$
$ copy-image$
$ copy-snapshot$
$ create-customer-gateway$
$ create-dhcp-options$
$ create-flow-logs$
$ create-image$
$ create-instance-export-task$
$ create-internet-gateway$
$ create-key-pair$
$ create-nat-gateway$
$ create-network-acl$
$ create-network-acl-entry$
$ create-network-interface
$ create-reserved-instances-listing$
$ create-route$
$ create-route-table$
$ create-security-group$
$ create-snapshot$
$ create-spot-datafeed-subscription$
$ create-subnet$
$ create-tags$
$ create-volume$
$ create-vpc$
$ create-vpc-endpoint$
$ create-vpc-peering-connection$
$ create-vpn-connection$
$ create-vpn-connection-route$
$ create-vpn-gateway$
$ delete-customer-gateway$
$ delete-dhcp-options$
$ delete-flow-logs$
$ delete-internet-gateway$
$ delete-key-pair$
$ delete-nat-gateway$
$ delete-network-acl$
$ delete-network-acl-entry$
$ delete-network-interface$
$ delete-placement-group$
$ delete-route$
$ delete-route-table$
$ delete-security-group$
$ delete-snapshot$
$ delete-spot-datafeed-subscription$
$ delete-subnet$
$ delete-tags$
$ delete-volume$
$ delete-vpc$
$ delete-vpc-endpoints$
$ delete-vpc-peering-connection$
$ delete-vpn-connection$
$ delete-vpn-connection-route$
$ delete-vpn-gateway$
$ deregister-image$
$ describe-account-attributes$
$ describe-addresses$
$ describe-availability-zones$
$ describe-bundle-tasks$
$ describe-classic-link-instances$
$ describe-conversion-tasks$
$ describe-customer-gateways$
$ describe-dhcp-options$
$ describe-export-tasks$
$ describe-flow-logs$
$ describe-host-reservation-offerings$
$ describe-host-reservations$
$ describe-hosts$
$ describe-id-format$
$ describe-identity-id-format$
$ describe-image-attribute$
$ describe-images$
$ describe-import-image-tasks$
$ describe-import-snapshot-tasks$
$ describe-instance-attribute$
$ describe-instance-status$
$ describe-instances$
$ describe-internet-gateways$
$ describe-key-pairs$
$ describe-moving-addresses$
$ describe-nat-gateways$
$ describe-network-acls$
$ describe-network-interface-attribute$
$ describe-network-interfaces$
$ describe-placement-groups$
$ describe-prefix-lists$
$ describe-regions$
$ describe-reserved-
$ describe-reserved-
$ describe-reserved-
modifications$
$ describe-reserved-
$ describe-route-tab
$ describe-scheduled
$ describe-scheduled
$ describe-security-
$ describe-security-
$ describe-snapshot-
$ describe-snapshots
$ describe-spot-data
$ describe-spot-flee
$ describe-spot-flee
$ describe-spot-flee
$ describe-spot-inst
$ describe-spot-pric
$ describe-stale-sec
$ describe-subnets$
$ describe-tags$
$ describe-volume-at
$ describe-volume-st
$ describe-volumes$
$ describe-vpc-attri
$ describe-vpc-class
$ describe-vpc-class
$ describe-vpc-endpo
$ describe-vpc-endpo
$ describe-vpc-peeri
$ describe-vpcs$
$ describe-vpn-conne
$ describe-vpn-gatew
$ detach-classic-lin
$ detach-internet-ga
$ detach-network-int
$ detach-volume$
210 calls for EC2
only
S3
EL
B RDS
CloudFron
t
CloudWatc
h
AutoScalin
Route5
3
Events
IAM
S3a
pi
SN
S
PLESK WORDPRESS AWS SCALER
https://github.com/plesk/wordpress-aws-scaler
AWS
manage-
wordpress.sh
Docker
Registry
docker pull
docker push
AMI
PLESK WORDPRESS AWS SCALER
manage-wordpress.sh create
Too quick? How does it work internally?
Install AWS CLI (https://docs.aws.amazon.com/cli/latest/userguide/installing.html)
$ sudo pip install awscli
$ aws configure
$ aws --version
Clone WordPress AWS Scaler git repo (https://github.com/plesk/wordpress-aws-scaler)
$ git clone https://github.com/plesk/wordpress-aws-scaler.git
$ cd wordpress-aws-scaler
Build Docker Image and Upload to Docker Hub (https://hub.docker.com/explore/)
$ docker build -t janloeffler/wordpress-aws-scaler:latest -t janloeffler/wordpress-aws-scaler:0.2 .
$ docker push janloeffler/wordpress-aws-scaler:latest
List existing AWS resources
List existing AWS Resources
$ aws ec2 describe-vps
$ aws ec2 describe-security-groups
$ aws ec2 describe-instances
$ aws rds describe-db-instances
[...]
Do this for all AWS components
$ aws autoscaling
$ aws ec2
$ aws cloudfront
$ aws cloudwatch
$ aws elb
$ aws rds
$ aws s3
$ aws route53
$ aws events
Create new resources
Create new AWS Resources
$ aws ec2 create-vpc
$ aws ec2 create-security-group
[...]
Do this for all AWS components
$ aws autoscaling
$ aws ec2
$ aws cloudfront
$ aws cloudwatch
$ aws elb
$ aws rds
$ aws s3
$ aws route53
$ aws events
Create new Launch Configuration
Generate EC2-User-Data Script to run directly after booting EC2 VM
$ cat >ec2-user-data.sh <<EOL
#!/bin/bash
docker pull janloeffler/wordpress-aws-scaler:latest
docker run -d -p 80:80 -p 443:443 -e WORDPRESS_DB_HOST='${DB}' -e
WORDPRESS_DB_USER='${DB_USERNAME}' -e WORDPRESS_DB_PASSWORD='${DB_PASSWORD}' -e
WORDPRESS_DB_NAME='${DB_NAME}' -e WORDPRESS_DB_PREFIX='${WORDPRESS_DB_PREFIX}' -e
WORDPRESS_URL='http://${ELB}' -e WORDPRESS_TITLE='${WORDPRESS_TITLE}' -e
WORDPRESS_USER_EMAIL='${WORDPRESS_USER_EMAIL}' -e NEWRELIC_KEY='${NEWRELIC_KEY}' -e
NEWRELIC_NAME='${NEWRELIC_NAME}' -e S3_KEY='${IAM_USER_KEY}' -e S3_SECRET='${IAM_USER_SECRET}' -e
S3_BUCKET='${S3_BUCKET_NAME}' -e S3_BUCKET_URL='${S3_URL}' -it janloeffler/wordpress-aws-
scaler:latest
EOL
Create new Launch Configuration for AutoScaling
$ aws autoscaling create-launch-configuration --launch-configuration-name $LC_NAME --image-id
$AMI --instance-type $INSTANCE_TYPE --key-name $KEYNAME --security-groups $SEC_GROUP_ID --user-
data file://ec2-user-data.sh
You must love JSON !!! ;-)
{
"Reservations": [
{
"OwnerId": "699328319947",
"ReservationId": "r-041ac13209e0d4eef",
"Groups": [],
"RequesterId": "226008221399",
"Instances": [
{
"Monitoring": {
"State": "enabled"
},
"PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2016-09-05T12:19:54.000Z",
"PublicIpAddress": "52.210.200.157",
"PrivateIpAddress": "172.31.25.83",
"ProductCodes": [
{
"ProductCodeId": "4jvb72q6a56js2x7jzd24jar5",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-fffbe19a",
"StateTransitionReason": "",
"InstanceId": "i-0ea3384a24a3c6aba",
"ImageId": "ami-64385917",
"PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal",
"KeyName": "Marko Heijnen",
"SecurityGroups": [
{
"GroupName": "WordPress-Docker-Test",
"GroupId": "sg-1b8dde7c"
}
],
"ClientToken": "70aa81e1-10a3-4b83-acc7-62702015d06e_subnet-cff90cb9_1",
"SubnetId": "subnet-cff90cb9",
"InstanceType": "m3.medium",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "06:c0:22:65:b4:ed",
"SourceDestCheck": true,
"VpcId": "vpc-fffbe19a",
"Description": "",
"Association": {
"PublicIp": "52.210.200.157",
"PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com",
"IpOwnerId": "amazon"
},
"NetworkInterfaceId": "eni-2f4efa63",
"PrivateIpAddresses": [
{
"PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal",
"Association": {
"PublicIp": "52.210.200.157",
"PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com",
"IpOwnerId": "amazon"
},
"Primary": true,
"PrivateIpAddress": "172.31.25.83"
}
],
"PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal",
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-7f9031a0",
"AttachTime": "2016-09-05T12:19:54.000Z"
},
[…]
Plesk Mission
“We simplify the lives of
web professionals.”
Jan Löffler
CTO Plesk
● @jlsoft2
● jan@plesk.com
● http://www.slideshare.net/jlsoft/
● https://about.me/jan.loeffler
code.talks 2016, Hamburg
Keynote:
“High traffic sites with WordPress,
Docker & AWS”
How to auto-scale WordPress on
AWS and make it fly!
Stay tuned!
Jan Löffler Marko Heijnen
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
BACKUP
AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk
We b D e v e l o p m e n t Ke y To o l s – w h a t w e b d e v e l o p e rs n e e d a n d
u s e
47
26,6% of all websites
worldwide
2,7% 2,2%
(high traffic sites)
70% of developers use git as primary
source management solution
Increasing usage by web agencies
38% of all online stores worldwide
runs on top of WordPress as plugin
developed by automattic
used by 30% of IT companies
increased from 13% to 30% in 12 months
further 35% plan introduction
Sources: w3techs.com, Rightscale, StackOverflow Survey 2015, 2016, Netcraft
311% growth
17.2% usage
26.8% growth
17.9% usage
14.9% growth
16% of all webservers
22% of all active sites
continuously growing,
while Apache is shrinking
WordPress Management
Free SSL everywhere
http2 50+ extensions
CLI
Automatic Updates
Site Migration
Free support
30+ languages
nginx
Server Security DNS
✔
Plesk Onyx: Continuous Delivery Deployment Pipeline (sample)
49
Jenkins runs as
Docker container
managed by Plesk
Plesk Multi Server
Extension installs
three environments
Apps managed
by Plesk via Docker

More Related Content

PDF
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
PDF
Container Days 2017 Hamburg - Plesk - How Docker helps tune Websites into Rac...
PDF
HTTP For the Good or the Bad - FSEC Edition
PDF
[CB16] 80時間でWebを一周:クロムミウムオートメーションによるスケーラブルなフィンガープリント by Isaac Dawson
PPTX
Twas the night before Malware...
PDF
API Analytics with Redis and Bigquery. NoSQLmatters Cologne '14 edition. Javi...
PDF
Atmosphere Conference 2015: Taming the Modern Datacenter
PDF
Die .htaccess richtig nutzen
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
Container Days 2017 Hamburg - Plesk - How Docker helps tune Websites into Rac...
HTTP For the Good or the Bad - FSEC Edition
[CB16] 80時間でWebを一周:クロムミウムオートメーションによるスケーラブルなフィンガープリント by Isaac Dawson
Twas the night before Malware...
API Analytics with Redis and Bigquery. NoSQLmatters Cologne '14 edition. Javi...
Atmosphere Conference 2015: Taming the Modern Datacenter
Die .htaccess richtig nutzen

What's hot (7)

PDF
RESTful API - GDG Tech Talk - Novembro de 2014
PDF
Mehr Performance für WordPress - WordCamp Köln
PDF
Przemysław Iwanek - ABC AWS, budowanie infrastruktury przy pomocy Terraform
PDF
AWSをテラフォーミングする会(Terraformハンズオン)
PDF
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
KEY
Site Performance - From Pinto to Ferrari
KEY
Socket applications
RESTful API - GDG Tech Talk - Novembro de 2014
Mehr Performance für WordPress - WordCamp Köln
Przemysław Iwanek - ABC AWS, budowanie infrastruktury przy pomocy Terraform
AWSをテラフォーミングする会(Terraformハンズオン)
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
Site Performance - From Pinto to Ferrari
Socket applications
Ad

Similar to AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk (20)

PDF
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
PDF
Container Days 2017 Hamburg - Plesk - How Docker helps tune Websites into Ra...
PPTX
WordCamp Cologne - WordPress auf SPEED
PPTX
Scaling Your App With Docker Swarm using Terraform, Packer on Openstack
PPTX
Building Openstack in AllegroGroup
PPTX
Building hybrid cloud with cloudify (public)
PPTX
Taming unruly apps with open source networking
PDF
AWS re:Invnet Highlights for VCs
PDF
RedHat OpenStack Platform Overview
PPTX
Marriage of Openstack with KVM and ESX at PayPal OpenStack Summit Hong Kong F...
PDF
OSDC 2017 | Taming the Modern Data Center by Seth Vargo
PDF
OSDC 2017 | Modern Secrets Management with Vault by Seth Vargo
PDF
OSDC 2017 - Seth Vargo - Taming the modern data center
PPTX
Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...
PPTX
Stack kicker devopsdays-london-2013
PPTX
Open stack in sina
PPTX
Openstack Quantum + Devstack Tutorial
PDF
CoreOS and cloud provider integration: simple cloud-init example at Exoscale
PDF
OpenStack Operations Guide 1st Edition Tom Fifield
PDF
Getting Started with OpenStack and VMware vSphere
 
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
Container Days 2017 Hamburg - Plesk - How Docker helps tune Websites into Ra...
WordCamp Cologne - WordPress auf SPEED
Scaling Your App With Docker Swarm using Terraform, Packer on Openstack
Building Openstack in AllegroGroup
Building hybrid cloud with cloudify (public)
Taming unruly apps with open source networking
AWS re:Invnet Highlights for VCs
RedHat OpenStack Platform Overview
Marriage of Openstack with KVM and ESX at PayPal OpenStack Summit Hong Kong F...
OSDC 2017 | Taming the Modern Data Center by Seth Vargo
OSDC 2017 | Modern Secrets Management with Vault by Seth Vargo
OSDC 2017 - Seth Vargo - Taming the modern data center
Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...
Stack kicker devopsdays-london-2013
Open stack in sina
Openstack Quantum + Devstack Tutorial
CoreOS and cloud provider integration: simple cloud-init example at Exoscale
OpenStack Operations Guide 1st Edition Tom Fifield
Getting Started with OpenStack and VMware vSphere
 
Ad

More from Jan Löffler (20)

PPTX
The Influence of AI in the Hosting Industry - Jan Loeffler, CTO WebPros, Clou...
PPTX
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
PPTX
The Influence of AI in the Cloud & Hosting Market - Jan Loeffler (CTO, WebPro...
PPTX
CloudFest US 2023 - Building a Connected Future for Your Business - Jan Loeff...
PPTX
CloudFest 2023 - Unleashing the Power of Innovation: A Game Changer for Your ...
PPTX
CloudFest 2023 - WordPress by the numbers - Jan Loeffler (CTO, WebPros)
PPTX
WebPros at CloudFest 2022 - Walk the New Revenue Avenues of Server Management
PPTX
A Platform for Builders - How to win Web Developers?
PDF
The WordPress Hosting experience - Bought cheaply and paid dearly? - Jan Löf...
PPTX
World Cloud Summit 2017 - How Service Providers can offer a Ready to Code and...
PPTX
WordCamp Cologne - Web Trends in Zahlen und wie sich Hosting verändert
PPTX
WordPress Meetup Karlsruhe Plesk 2016 - Die Veränderung der Web Entwicklung -...
PPTX
Container Days Conference Plesk 2016 - How AWS, Docker and Microservices infl...
PPTX
WHD.usa - Plesk - more than just a control panel - reveal the power of web op...
PPTX
Hosting Service Provider Summit - Was haben AWS, Docker und co mit kommerziel...
PPTX
World Hosting Days - More than just a control panel - reveal the power of Web...
PPTX
Stups.io - an Open Source Cloud Framework for AWS
PPTX
GOTO Copenhagen - Radical Agility with Autonomous Teams and Microservices in ...
PPTX
Dev ops con 2015 radical agility with autonomous teams and microservices in...
PPTX
Zalando - The Big Switch - ForgeRock Identity Summit 2015
The Influence of AI in the Hosting Industry - Jan Loeffler, CTO WebPros, Clou...
WordPress by the numbers - Jan Loeffler, CTO WebPros, CloudFest 2024
The Influence of AI in the Cloud & Hosting Market - Jan Loeffler (CTO, WebPro...
CloudFest US 2023 - Building a Connected Future for Your Business - Jan Loeff...
CloudFest 2023 - Unleashing the Power of Innovation: A Game Changer for Your ...
CloudFest 2023 - WordPress by the numbers - Jan Loeffler (CTO, WebPros)
WebPros at CloudFest 2022 - Walk the New Revenue Avenues of Server Management
A Platform for Builders - How to win Web Developers?
The WordPress Hosting experience - Bought cheaply and paid dearly? - Jan Löf...
World Cloud Summit 2017 - How Service Providers can offer a Ready to Code and...
WordCamp Cologne - Web Trends in Zahlen und wie sich Hosting verändert
WordPress Meetup Karlsruhe Plesk 2016 - Die Veränderung der Web Entwicklung -...
Container Days Conference Plesk 2016 - How AWS, Docker and Microservices infl...
WHD.usa - Plesk - more than just a control panel - reveal the power of web op...
Hosting Service Provider Summit - Was haben AWS, Docker und co mit kommerziel...
World Hosting Days - More than just a control panel - reveal the power of Web...
Stups.io - an Open Source Cloud Framework for AWS
GOTO Copenhagen - Radical Agility with Autonomous Teams and Microservices in ...
Dev ops con 2015 radical agility with autonomous teams and microservices in...
Zalando - The Big Switch - ForgeRock Identity Summit 2015

Recently uploaded (20)

PDF
Cloud-Scale Log Monitoring _ Datadog.pdf
PDF
Paper PDF World Game (s) Great Redesign.pdf
PPT
tcp ip networks nd ip layering assotred slides
PPTX
innovation process that make everything different.pptx
PDF
The New Creative Director: How AI Tools for Social Media Content Creation Are...
PPTX
Power Point - Lesson 3_2.pptx grad school presentation
PDF
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
PDF
WebRTC in SignalWire - troubleshooting media negotiation
PPTX
Digital Literacy And Online Safety on internet
PDF
FINAL CALL-6th International Conference on Networks & IOT (NeTIOT 2025)
PPTX
Module 1 - Cyber Law and Ethics 101.pptx
PPTX
presentation_pfe-universite-molay-seltan.pptx
PDF
Decoding a Decade: 10 Years of Applied CTI Discipline
PDF
Tenda Login Guide: Access Your Router in 5 Easy Steps
PPTX
522797556-Unit-2-Temperature-measurement-1-1.pptx
PPTX
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
PPTX
Introuction about ICD -10 and ICD-11 PPT.pptx
PPTX
CHE NAA, , b,mn,mblblblbljb jb jlb ,j , ,C PPT.pptx
PPTX
Slides PPTX World Game (s) Eco Economic Epochs.pptx
DOCX
Unit-3 cyber security network security of internet system
Cloud-Scale Log Monitoring _ Datadog.pdf
Paper PDF World Game (s) Great Redesign.pdf
tcp ip networks nd ip layering assotred slides
innovation process that make everything different.pptx
The New Creative Director: How AI Tools for Social Media Content Creation Are...
Power Point - Lesson 3_2.pptx grad school presentation
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
WebRTC in SignalWire - troubleshooting media negotiation
Digital Literacy And Online Safety on internet
FINAL CALL-6th International Conference on Networks & IOT (NeTIOT 2025)
Module 1 - Cyber Law and Ethics 101.pptx
presentation_pfe-universite-molay-seltan.pptx
Decoding a Decade: 10 Years of Applied CTI Discipline
Tenda Login Guide: Access Your Router in 5 Easy Steps
522797556-Unit-2-Temperature-measurement-1-1.pptx
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
Introuction about ICD -10 and ICD-11 PPT.pptx
CHE NAA, , b,mn,mblblblbljb jb jlb ,j , ,C PPT.pptx
Slides PPTX World Game (s) Eco Economic Epochs.pptx
Unit-3 cyber security network security of internet system

AutoScaling WordPress with Docker & AWS - WordPress Meetup Karlsruhe - Plesk

  • 1. WordPress Meetup Karlsruhe AutoScaling WordPress with Docker & AWS 22. September 2016 Jan Löffler, CTO Plesk
  • 3. 0% 5% 10% 15% 20% 25% 30% 2011 2012 2013 2014 2015 2016 WordPress related to all websites worldwide http://w3techs.com/technologies/history_overview/content_management/all/y
  • 17. 0% 5% 10% 15% 20% 25% 30% 2015 2016 Nutzung von Docker verdoppelt auf 30% http://www.rightscale.com/blog/cloud-industry-insights/cloud-computing-trends-2016-state-cloud-survey
  • 23. IMMUTABLE STACKS ELB myapp-v1 app.example.org EC2 + Docker EC2 + Docker EC2 + Docker 100 %
  • 24. IMMUTABLE STACKS ELB myapp-v1 EC2 + Docker EC2 + Docker EC2 + Docker ELB myapp-v2 EC2 + Docker EC2 + Docker app.example.org 90 % 10 %
  • 25. IMMUTABLE STACKS ELB myapp-v1 EC2 + Docker EC2 + Docker EC2 + Docker ELB myapp-v2 EC2 + Docker EC2 + Docker app.example.org 0% 100 %
  • 26. APP INSTANCE VM (EC2) Basis Image (AMI) Docker Container Application ✓ VPC ✓ Security Groups ✓ AutoScaling ✓ CloudWatch ✓ CloudFront ✓ Route53 ✓ Docker Runtime ✓ Logging ✓ Monitoring ✓ Security config ✓ Debian ✓ Nginx ✓ php7-fpm ✓ NewRelic
  • 29. $ accept-vpc-peering-connection$ $ allocate-address$ $ allocate-hosts$ $ assign-private-ip-addresses$ $ associate-address$ $ associate-dhcp-options$ $ associate-route-table$ $ attach-classic-link-vpc$ $ attach-internet-gateway$ $ attach-network-interface$ $ attach-volume$ $ attach-vpn-gateway$ $ authorize-security-group-egress$ $ authorize-security-group-ingress$ $ bundle-instance$ $ cancel-bundle-task$ $ cancel-conversion-task$ $ cancel-export-task$ $ cancel-import-task$ $ cancel-reserved-instances-listing$ $ cancel-spot-fleet-requests$ $ cancel-spot-instance-requests$ $ confirm-product-instance$ $ copy-image$ $ copy-snapshot$ $ create-customer-gateway$ $ create-dhcp-options$ $ create-flow-logs$ $ create-image$ $ create-instance-export-task$ $ create-internet-gateway$ $ create-key-pair$ $ create-nat-gateway$ $ create-network-acl$ $ create-network-acl-entry$ $ create-network-interface $ create-reserved-instances-listing$ $ create-route$ $ create-route-table$ $ create-security-group$ $ create-snapshot$ $ create-spot-datafeed-subscription$ $ create-subnet$ $ create-tags$ $ create-volume$ $ create-vpc$ $ create-vpc-endpoint$ $ create-vpc-peering-connection$ $ create-vpn-connection$ $ create-vpn-connection-route$ $ create-vpn-gateway$ $ delete-customer-gateway$ $ delete-dhcp-options$ $ delete-flow-logs$ $ delete-internet-gateway$ $ delete-key-pair$ $ delete-nat-gateway$ $ delete-network-acl$ $ delete-network-acl-entry$ $ delete-network-interface$ $ delete-placement-group$ $ delete-route$ $ delete-route-table$ $ delete-security-group$ $ delete-snapshot$ $ delete-spot-datafeed-subscription$ $ delete-subnet$ $ delete-tags$ $ delete-volume$ $ delete-vpc$ $ delete-vpc-endpoints$ $ delete-vpc-peering-connection$ $ delete-vpn-connection$ $ delete-vpn-connection-route$ $ delete-vpn-gateway$ $ deregister-image$ $ describe-account-attributes$ $ describe-addresses$ $ describe-availability-zones$ $ describe-bundle-tasks$ $ describe-classic-link-instances$ $ describe-conversion-tasks$ $ describe-customer-gateways$ $ describe-dhcp-options$ $ describe-export-tasks$ $ describe-flow-logs$ $ describe-host-reservation-offerings$ $ describe-host-reservations$ $ describe-hosts$ $ describe-id-format$ $ describe-identity-id-format$ $ describe-image-attribute$ $ describe-images$ $ describe-import-image-tasks$ $ describe-import-snapshot-tasks$ $ describe-instance-attribute$ $ describe-instance-status$ $ describe-instances$ $ describe-internet-gateways$ $ describe-key-pairs$ $ describe-moving-addresses$ $ describe-nat-gateways$ $ describe-network-acls$ $ describe-network-interface-attribute$ $ describe-network-interfaces$ $ describe-placement-groups$ $ describe-prefix-lists$ $ describe-regions$ $ describe-reserved- $ describe-reserved- $ describe-reserved- modifications$ $ describe-reserved- $ describe-route-tab $ describe-scheduled $ describe-scheduled $ describe-security- $ describe-security- $ describe-snapshot- $ describe-snapshots $ describe-spot-data $ describe-spot-flee $ describe-spot-flee $ describe-spot-flee $ describe-spot-inst $ describe-spot-pric $ describe-stale-sec $ describe-subnets$ $ describe-tags$ $ describe-volume-at $ describe-volume-st $ describe-volumes$ $ describe-vpc-attri $ describe-vpc-class $ describe-vpc-class $ describe-vpc-endpo $ describe-vpc-endpo $ describe-vpc-peeri $ describe-vpcs$ $ describe-vpn-conne $ describe-vpn-gatew $ detach-classic-lin $ detach-internet-ga $ detach-network-int $ detach-volume$ 210 calls for EC2 only
  • 30. $ accept-vpc-peering-connection$ $ allocate-address$ $ allocate-hosts$ $ assign-private-ip-addresses$ $ associate-address$ $ associate-dhcp-options$ $ associate-route-table$ $ attach-classic-link-vpc$ $ attach-internet-gateway$ $ attach-network-interface$ $ attach-volume$ $ attach-vpn-gateway$ $ authorize-security-group-egress$ $ authorize-security-group-ingress$ $ bundle-instance$ $ cancel-bundle-task$ $ cancel-conversion-task$ $ cancel-export-task$ $ cancel-import-task$ $ cancel-reserved-instances-listing$ $ cancel-spot-fleet-requests$ $ cancel-spot-instance-requests$ $ confirm-product-instance$ $ copy-image$ $ copy-snapshot$ $ create-customer-gateway$ $ create-dhcp-options$ $ create-flow-logs$ $ create-image$ $ create-instance-export-task$ $ create-internet-gateway$ $ create-key-pair$ $ create-nat-gateway$ $ create-network-acl$ $ create-network-acl-entry$ $ create-network-interface $ create-reserved-instances-listing$ $ create-route$ $ create-route-table$ $ create-security-group$ $ create-snapshot$ $ create-spot-datafeed-subscription$ $ create-subnet$ $ create-tags$ $ create-volume$ $ create-vpc$ $ create-vpc-endpoint$ $ create-vpc-peering-connection$ $ create-vpn-connection$ $ create-vpn-connection-route$ $ create-vpn-gateway$ $ delete-customer-gateway$ $ delete-dhcp-options$ $ delete-flow-logs$ $ delete-internet-gateway$ $ delete-key-pair$ $ delete-nat-gateway$ $ delete-network-acl$ $ delete-network-acl-entry$ $ delete-network-interface$ $ delete-placement-group$ $ delete-route$ $ delete-route-table$ $ delete-security-group$ $ delete-snapshot$ $ delete-spot-datafeed-subscription$ $ delete-subnet$ $ delete-tags$ $ delete-volume$ $ delete-vpc$ $ delete-vpc-endpoints$ $ delete-vpc-peering-connection$ $ delete-vpn-connection$ $ delete-vpn-connection-route$ $ delete-vpn-gateway$ $ deregister-image$ $ describe-account-attributes$ $ describe-addresses$ $ describe-availability-zones$ $ describe-bundle-tasks$ $ describe-classic-link-instances$ $ describe-conversion-tasks$ $ describe-customer-gateways$ $ describe-dhcp-options$ $ describe-export-tasks$ $ describe-flow-logs$ $ describe-host-reservation-offerings$ $ describe-host-reservations$ $ describe-hosts$ $ describe-id-format$ $ describe-identity-id-format$ $ describe-image-attribute$ $ describe-images$ $ describe-import-image-tasks$ $ describe-import-snapshot-tasks$ $ describe-instance-attribute$ $ describe-instance-status$ $ describe-instances$ $ describe-internet-gateways$ $ describe-key-pairs$ $ describe-moving-addresses$ $ describe-nat-gateways$ $ describe-network-acls$ $ describe-network-interface-attribute$ $ describe-network-interfaces$ $ describe-placement-groups$ $ describe-prefix-lists$ $ describe-regions$ $ describe-reserved- $ describe-reserved- $ describe-reserved- modifications$ $ describe-reserved- $ describe-route-tab $ describe-scheduled $ describe-scheduled $ describe-security- $ describe-security- $ describe-snapshot- $ describe-snapshots $ describe-spot-data $ describe-spot-flee $ describe-spot-flee $ describe-spot-flee $ describe-spot-inst $ describe-spot-pric $ describe-stale-sec $ describe-subnets$ $ describe-tags$ $ describe-volume-at $ describe-volume-st $ describe-volumes$ $ describe-vpc-attri $ describe-vpc-class $ describe-vpc-class $ describe-vpc-endpo $ describe-vpc-endpo $ describe-vpc-peeri $ describe-vpcs$ $ describe-vpn-conne $ describe-vpn-gatew $ detach-classic-lin $ detach-internet-ga $ detach-network-int $ detach-volume$ 210 calls for EC2 only S3 EL B RDS CloudFron t CloudWatc h AutoScalin Route5 3 Events IAM S3a pi SN S
  • 36. Too quick? How does it work internally? Install AWS CLI (https://docs.aws.amazon.com/cli/latest/userguide/installing.html) $ sudo pip install awscli $ aws configure $ aws --version Clone WordPress AWS Scaler git repo (https://github.com/plesk/wordpress-aws-scaler) $ git clone https://github.com/plesk/wordpress-aws-scaler.git $ cd wordpress-aws-scaler Build Docker Image and Upload to Docker Hub (https://hub.docker.com/explore/) $ docker build -t janloeffler/wordpress-aws-scaler:latest -t janloeffler/wordpress-aws-scaler:0.2 . $ docker push janloeffler/wordpress-aws-scaler:latest
  • 37. List existing AWS resources List existing AWS Resources $ aws ec2 describe-vps $ aws ec2 describe-security-groups $ aws ec2 describe-instances $ aws rds describe-db-instances [...] Do this for all AWS components $ aws autoscaling $ aws ec2 $ aws cloudfront $ aws cloudwatch $ aws elb $ aws rds $ aws s3 $ aws route53 $ aws events
  • 38. Create new resources Create new AWS Resources $ aws ec2 create-vpc $ aws ec2 create-security-group [...] Do this for all AWS components $ aws autoscaling $ aws ec2 $ aws cloudfront $ aws cloudwatch $ aws elb $ aws rds $ aws s3 $ aws route53 $ aws events
  • 39. Create new Launch Configuration Generate EC2-User-Data Script to run directly after booting EC2 VM $ cat >ec2-user-data.sh <<EOL #!/bin/bash docker pull janloeffler/wordpress-aws-scaler:latest docker run -d -p 80:80 -p 443:443 -e WORDPRESS_DB_HOST='${DB}' -e WORDPRESS_DB_USER='${DB_USERNAME}' -e WORDPRESS_DB_PASSWORD='${DB_PASSWORD}' -e WORDPRESS_DB_NAME='${DB_NAME}' -e WORDPRESS_DB_PREFIX='${WORDPRESS_DB_PREFIX}' -e WORDPRESS_URL='http://${ELB}' -e WORDPRESS_TITLE='${WORDPRESS_TITLE}' -e WORDPRESS_USER_EMAIL='${WORDPRESS_USER_EMAIL}' -e NEWRELIC_KEY='${NEWRELIC_KEY}' -e NEWRELIC_NAME='${NEWRELIC_NAME}' -e S3_KEY='${IAM_USER_KEY}' -e S3_SECRET='${IAM_USER_SECRET}' -e S3_BUCKET='${S3_BUCKET_NAME}' -e S3_BUCKET_URL='${S3_URL}' -it janloeffler/wordpress-aws- scaler:latest EOL Create new Launch Configuration for AutoScaling $ aws autoscaling create-launch-configuration --launch-configuration-name $LC_NAME --image-id $AMI --instance-type $INSTANCE_TYPE --key-name $KEYNAME --security-groups $SEC_GROUP_ID --user- data file://ec2-user-data.sh
  • 40. You must love JSON !!! ;-) { "Reservations": [ { "OwnerId": "699328319947", "ReservationId": "r-041ac13209e0d4eef", "Groups": [], "RequesterId": "226008221399", "Instances": [ { "Monitoring": { "State": "enabled" }, "PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com", "State": { "Code": 16, "Name": "running" }, "EbsOptimized": false, "LaunchTime": "2016-09-05T12:19:54.000Z", "PublicIpAddress": "52.210.200.157", "PrivateIpAddress": "172.31.25.83", "ProductCodes": [ { "ProductCodeId": "4jvb72q6a56js2x7jzd24jar5", "ProductCodeType": "marketplace" } ], "VpcId": "vpc-fffbe19a", "StateTransitionReason": "", "InstanceId": "i-0ea3384a24a3c6aba", "ImageId": "ami-64385917", "PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal", "KeyName": "Marko Heijnen", "SecurityGroups": [ { "GroupName": "WordPress-Docker-Test", "GroupId": "sg-1b8dde7c" } ], "ClientToken": "70aa81e1-10a3-4b83-acc7-62702015d06e_subnet-cff90cb9_1", "SubnetId": "subnet-cff90cb9", "InstanceType": "m3.medium", "NetworkInterfaces": [ { "Status": "in-use", "MacAddress": "06:c0:22:65:b4:ed", "SourceDestCheck": true, "VpcId": "vpc-fffbe19a", "Description": "", "Association": { "PublicIp": "52.210.200.157", "PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com", "IpOwnerId": "amazon" }, "NetworkInterfaceId": "eni-2f4efa63", "PrivateIpAddresses": [ { "PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal", "Association": { "PublicIp": "52.210.200.157", "PublicDnsName": "ec2-52-210-200-157.eu-west-1.compute.amazonaws.com", "IpOwnerId": "amazon" }, "Primary": true, "PrivateIpAddress": "172.31.25.83" } ], "PrivateDnsName": "ip-172-31-25-83.eu-west-1.compute.internal", "Attachment": { "Status": "attached", "DeviceIndex": 0, "DeleteOnTermination": true, "AttachmentId": "eni-attach-7f9031a0", "AttachTime": "2016-09-05T12:19:54.000Z" }, […]
  • 41. Plesk Mission “We simplify the lives of web professionals.”
  • 42. Jan Löffler CTO Plesk ● @jlsoft2 ● jan@plesk.com ● http://www.slideshare.net/jlsoft/ ● https://about.me/jan.loeffler
  • 43. code.talks 2016, Hamburg Keynote: “High traffic sites with WordPress, Docker & AWS” How to auto-scale WordPress on AWS and make it fly! Stay tuned! Jan Löffler Marko Heijnen
  • 47. We b D e v e l o p m e n t Ke y To o l s – w h a t w e b d e v e l o p e rs n e e d a n d u s e 47 26,6% of all websites worldwide 2,7% 2,2% (high traffic sites) 70% of developers use git as primary source management solution Increasing usage by web agencies 38% of all online stores worldwide runs on top of WordPress as plugin developed by automattic used by 30% of IT companies increased from 13% to 30% in 12 months further 35% plan introduction Sources: w3techs.com, Rightscale, StackOverflow Survey 2015, 2016, Netcraft 311% growth 17.2% usage 26.8% growth 17.9% usage 14.9% growth 16% of all webservers 22% of all active sites continuously growing, while Apache is shrinking
  • 48. WordPress Management Free SSL everywhere http2 50+ extensions CLI Automatic Updates Site Migration Free support 30+ languages nginx Server Security DNS
  • 49. ✔ Plesk Onyx: Continuous Delivery Deployment Pipeline (sample) 49 Jenkins runs as Docker container managed by Plesk Plesk Multi Server Extension installs three environments Apps managed by Plesk via Docker

Editor's Notes

  • #2: Title: AutoScaling WordPress with Docker & AWS Title long: WordPress Meetup Karlsruhe Plesk 2016 - AutoScaling WordPress with Docker & AWS - by Jan Lö̈ffler Keywords: plesk, docker, web development, aws, immutable infrastructure, immutable servers, phoenix servers, autoscaling, wordpress, cms, cloud service provider, jan loeffler plesk, plesk container days, plesk, webops Abstract: 26,6% of all websites worldwide are running on WordPress! Now that’s a lot of sites! For those of you who thought WordPress was still a CMS relegated to bloggers, think again.  38% of all online stores worldwide run wooCommerce (WordPress’ eCommerce plugin) on top of WordPress, yowzers!  But how do you scale WordPress for high traffic peaks? In this talk, Jan Löffler (CTO at Plesk) will demonstrate how to scale WordPress on AWS and Docker using AutoScaling to make your apps and websites fly high!
  • #3: WordPress – der beliebteste Website-Baukasten der Welt! Hat 2003 erstmals das Licht der Welt erblickt und ist in den letzten 13 Jahren zum iPod der Webseitenerstellung geworden.
  • #4: Hier könnt ihr das Wachstum sehen. Das krasse dabei ist, dass WordPress inzwischen 60% Marktanteil bei CMS-Webseiten hat und 26,6% bei allen Webseiten – weltweit. Jetzt müsste man nur noch wissen, wie viele Webseiten es überhaupt gibt auf der Welt. Weiß es noch jemand?
  • #5: Bamm, über 1 Mrd Webseiten gibt es zur Zeit. Davon sind allerdings ettliche statisch und nicht regelmäßig gepflegt. Z.B. gibt es nur ca. 325 Mio TLDs. Dennoch heiß dies, dass jede vierte Webseite der Welt mit WordPres läuft.
  • #6: Übrigens auch 38% aller E-Shops laufen auf WordPress zusammen mit dem WooCommerce als Plugin.
  • #7: Allerdings gibt es nicht nur WordPress, sondern auch Alternativen wie Joomla! Mit 2,7% aller Webseiten weltweit und 5,9% aller CMS basierten Websiten die klare Nummer 2! Gefolgt von Drupal auf Platz 3 (2,2% und 4,9%), Magento auf Platz 4 (1,3% und 2,8%) und Blogger auf Platz 5 (1,2%).
  • #8: Bei High Traffic Sites sieht es allerdings anders aus und Drupal führt mit großem Abstand das Feld an. Die Frage ist nun: Wie bekommen wir WordPress super schnell?
  • #9: Wie bekommen wir WordPress super schnell? Die Antwort – das geht nur mit mehr Hardware – wie bei Drupal auch.
  • #10: Die Antwort – das geht nur mit mehr Hardware – wie bei Drupal auch.
  • #11: WordPress auf mehrere Server verteilen? Wie geht das denn? Wer von euch hat das schon mal gemacht?
  • #12: Wir brauchen also mehrere Server, auf denen WordPress laufen soll, einen load-balancer, der die Last auf diese Server verteilt und eine gemeinsame Datenbank.
  • #13: Noch besser wird es aber, wenn der ganze statische Content direkt von super schnellen Storage Systemen ausgeliefert wird, und gar nicht erst vom Webserver. Außerdem sparen wir so massiv Speicherplatz und somit Kosten –bei gleichzeitig höherer Leistung.
  • #14: Und noch schneller wird es, wenn man die Dateien möglichst nah an die Kunden ranbringt, um die Latenz zu verringern. Heißt ein CDN (Content-Delivery-Network) muss her. Und auch die Datenbank kann man noch clustern.
  • #16: Die nächste Frage ist nun: wollen wir das alles von Hand installieren? Wie sieht denn das Deployment aus?
  • #17: Und dafür nutzen wir Docker. Wer weiß nicht was Docker ist? Docker hat für uns den großen Vorteil, dass es reproduzierbar ist, d.h. ich baue mir einmal ein Docker Image und kann beliebig viele Instanzen davon erzeugen.
  • #18: Wie beliebt und verbreite Docker ist, zeigt folgende Grafik: Docker wurde 2014 veröffentlicht, hat aus dem Stand eine Nutzung von 13% erreicht und anschließend sogar innerhalb eines Jahres erneut verdoppelt. D.h. dass Anfang diesen Jahres 30% der weltweiten Software-Entwickler verwendet haben und weitere 35% den Einsatz von Docker planen. Aber warum ist Docker eigentlich so erfolgreich. Was genau wird damit anders als bisher?
  • #19: Ok, wir packen also WordPress in einen Docker Container – und weiter?
  • #20: Jetzt wird’s spannend – ein kleines bisschen Theorie bevor wir in die Praxis abtauchen…
  • #21: Ein absoluter Trend ist aktuell „Immutable Infrastructure“ oder auch „Immutable Server“ genannt. Aber was ist „Immutable Infrastructure“ überhaupt? Immutable bedeutet „unveränderlich“. Und bezogen auf Infrastruktur bedeutet dies, dass sie sich nicht mehr ändert nachdem sie einmal Online gestellt wurde. Die Frage ist: „wie werden dann Patches und Security-Updates installiert, geschweige denn neue Versionen“? Gar nicht – zumindest nicht in der gleichen Instanz meiner Software! Wenn ich meine Software aktualisieren möchte – ob wegen eines Security Updates der SSL Library oder nur ein Bugfix meiner Software selbst – dann nehme ich einfach einen neuen Server. Warum wir das tun sollten? Das wäre ein ganz eigener Vortrag und ich erläutere Details gerne im Nachgang. Für jetzt gibt es nur einen kleinen Vorgeschmack über die vielen Vorteile und Möglichkeiten. Wie das geht zeigt [next slide] folgendes Schaubild.
  • #22: Als Infrastruktur nehme ich jetzt mal AWS, da die am weitesten verbreitet sein.
  • #23: Es geht aber auch mit diesen Hostern – nur die APIs sind leider nicht standardisiert. D.h. jeder Hoster hat seine eigene API und die muss man erst mal lernen. Gut, nun zu Immutable Infrastructure...
  • #24: Wie das geht zeigt folgendes Schaubild. Wir sehen eine Web Applikation die unter app.example.org erreichbar ist. Deployed ist diese App in der Version „myapp-v1“ als Docker Container auf 3 Servern von AWS (EC2 genannt). Die Last wird vom Elastic Loadbalancer gleich auf die 3 Instanzen verteilt. Diese Instanzen sind selbst „stateless“, d.h. sie speichern ihre Daten in einem zentralen Storage wie z.B. einer Datenbank. Wenn wir nun unsere Applikation aktualisieren wollen oder es ein Systemupdate benötigt [next slide]
  • #25: … dann stellen wir einfach eine neue Version inkl. des benötigten Serverstacks (also Betriebsystem, php runtime, etc.) zusätzlich online und routen etwas Traffic auf den neuen Url-Endpunkt. Und dann können wir, wenn alles zuverlässig läuft, den gesamten Traffic auf die neue Version leiten und ... [next slide]
  • #26: ... die alten Instanzen löschen, damit die Hosting Rechnung nicht zu hoch wird.
  • #27: Um ausreichend Flexibilität bei gleichzeitig starker Sicherheit zu gewährleisten, kommt hier ein mehrschichtiges Modell zum Einsatz. Ausgangsbasis ist die Virtuelle Maschine und das Basis Image mit dem Betriebssystem (bei AWS reden wir vom AMI). Direkt beim Start einer neuen EC2 Instanz lassen wir direkt unser gewünschtes Docker Image – welches unsere Applikation in der gewünschten Version enthält – von der Docker Registry laden und starten den Container. Darin startet der Webserver z.B. nginx oder Apache oder beide und alles was unsere App benötigt.
  • #28: Der Wunsch – der Entwickler ruft einfach die API auf und dann erstellt AWS die VMs, holt sich das aktuelle Docker Image mit unserem WordPress und fertig.
  • #29: Die Realität sieht leider anders aus.
  • #30: Alleine die EC2 API hat 210 calls parat – und leider braucht man auch ettliche von denen, um etwas automatisiert zu deployen. Aber EC2 ist nicht alles.
  • #31: AWS hat noch viel mehr APIs - und das hier sind nur die, die wir wirklich alle brauchen. Und jede API hat wiederum sehr viele calls, bei denen man erst mal wissen muss, was sie tun. Und von den vielen Parametern rede ich am besten gar nicht. Doch es gibt Abhilfe – der Plesk WordPress AWS Scaler!
  • #32: Der Plesk WordPress AWS Scaler – und der ist Open Source und zwar hier.
  • #33: Der Plesk WordPress AWS Scaler – und der ist Open Source und zwar hier. Und damit wird’s zum Kinderspiel 
  • #34: Ihr klont euch einfach das Git Repo, installiert die AWS CLI von der AWS Webseite und ruft manage-wordpress.sh auf. So leicht ist das!
  • #42: War das nicht einfach? Bei Plesk haben wir uns zum Ziel gesetzt, Web Professionals das Leben zu erleichtern, indem wir deren Prozesse vereinfachen und automatisieren. Falls ihr zu dem Projekt habt und wissen wollt, wie ich das alles genau gemacht habe, dann ...
  • #43: Falls ihr zu dem Projekt habt und wissen wollt, wie ich das alles genau gemacht habe, dann schiest los 
  • #46: http://www.infragistics.com/community/blogs/mobileman/archive/2015/01/14/building-a-better-web-a-brief-history-of-web-development.aspx http://www.evolutionoftheweb.com/
  • #48: http://w3techs.com/technologies/overview/content_management/all http://stackoverflow.com/research/developer-survey-2016 http://news.netcraft.com/archives/category/web-server-survey/ https://hostingfacts.com/internet-facts-stats-2016/ https://managewp.com/14-surprising-statistics-about-wordpress-usage
  • #49: If you asked yourself what Plesk has to do with the whole talk? Plesk is the leading Web Development platform and control panel to run, automate and grow applications, websites and hosting businesses.