Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WordCamp Cologne - WordPress auf SPEED

406 views

Published on

Habt ihr euch mal gefragt, wie man eine Webseite baut, die über 1 Million Aufrufe pro Tag standhalten muss? Geht das überhaupt mit WordPress? Amazon sagt, dass 100 ms längere Seitenladezeit zu 1% Umsatzeinbußen führt. Ein Online Shop, der 100.000 € am Tag macht kann somit leicht über 2.5 Millionen € im Jahr verlieren.
Ich würde euch gerne die Formel 1 des WordPress Hosting zeigen und was ihr ganz einfach daraus selbst umsetzen könnt.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

WordCamp Cologne - WordPress auf SPEED

  1. 1. WordPress auf SPEED WordCamp Cologne, November 18th 2017 Jan Löffler, CTO Plesk
  2. 2. Sebastian Vettel
  3. 3. Kann WordPress auch schnell?
  4. 4. Usain Bolt Katy Perry Snoop Dogg LL Cool J Kim Kardashian The Rolling Stones Sylvester Stallone Mötley Crüe Beyoncé Justin Bieber Justin Timberlake Alanis Morissette
  5. 5. Usain Bolt Katy Perry Snoop Dogg LL Cool J Kim Kardashian The Rolling Stones Sylvester Stallone Mötley Crüe Beyoncé Alanis MorissetteJustin Bieber
  6. 6. TechCrunch Metro The New Yorker BBC America MTV News The Official Star Wars Blog Sony Music Facebook Newsroom Time.com CNN UPS Mozilla Blog
  7. 7. High Traffic Sites???
  8. 8. #SPEE D
  9. 9. NEED FOR SPEED
  10. 10. jan-loeffler.de
  11. 11. jan-loeffler.de MYSQL Server Load- Balancer
  12. 12. jan-loeffler.de MYSQL Server Load- Balancer File Storage
  13. 13. jan-loeffler.de MYSQL Server Load- Balancer File Storage CDN MYSQL Server
  14. 14. Easy-peasy, oder?
  15. 15. DEPLOYMEN T
  16. 16. doubled to 30% http://www.rightscale.com/blog/cloud-industry-insights/cloud-computing-trends-2016-state-cloud-survey
  17. 17. jan-loeffler.de
  18. 18. Modern Web-Development 2017
  19. 19. IMMUTABLE INFRASTRUCTUR E
  20. 20. IMMUTABLE STACKS ELB myapp-v1 jan-loeffler.de EC2 + Docker EC2 + Docker EC2 + Docker 100%
  21. 21. IMMUTABLE STACKS ELB myapp-v1 EC2 + Docker EC2 + Docker EC2 + Docker ELB myapp-v2 EC2 + Docker EC2 + Docker jan-loeffler.de 90% 10%
  22. 22. IMMUTABLE STACKS ELB myapp-v1 EC2 + Docker EC2 + Docker EC2 + Docker ELB myapp-v2 EC2 + Docker EC2 + Docker jan-loeffler.de 0% 100%
  23. 23. 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 Website
  24. 24. AWS API Docker Registry docker pull docker push AMI THE WISH
  25. 25. THE REALITY
  26. 26. $ 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
  27. 27. $ 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 ELB RDS CloudFrontCloudWatch AutoScaling Route53 Events IAM S3api SNS
  28. 28. PLESK WORDPRESS AWS
  29. 29. https://github.com/plesk/wordpress-aws-scaler
  30. 30. AWS manage- wordpress.sh Docker Registry docker pull docker push AMI
  31. 31. PLESK WORDPRESS AWS SCALER
  32. 32. manage-wordpress.sh create
  33. 33. 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:0.1 . $ docker push janloeffler/wordpress-aws-scaler:0.1
  34. 34. FROM debian:testing # PHP RUN apt-get update && apt-get -y install php7.0 ... # nginx site conf COPY docker/nginx.conf /etc/nginx/nginx.conf # Install WP-CLI from GitHub ... # Download WordPress from wordpress.org RUN wp core download --path=/usr/src/wordpress --allow-root # Integrate user data COPY content /usr/src/wordpress/wp-content COPY docker/php-opcache.ini /etc/php/7.0/fpm/conf.d/10-opcache.ini VOLUME ['/usr/src/wordpress/wp-content'] EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
  35. 35. 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
  36. 36. 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
  37. 37. 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:0.1 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:0.1 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 --
  38. 38. 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" }, […]
  39. 39. #SPEE D
  40. 40. #SPEE D
  41. 41. CACHING
  42. 42. docker run -d --link web-app:backend-host --volumes-from web-app --env 'VCL_CONFIG=/data/path/to/varnish.vcl' million12/varnish Create new Varnish Cache Server as Docker Container
  43. 43. PERFORMANCE TESTING blitz.io StormForger.com JMeter bees with machine guns Loadstorm.com
  44. 44. 250 users → 3 sec 420 users → crash!!! Overheating a Fiat Uno without Turbo (Varnish)
  45. 45. 500 users → <2,5 sec Overheating a Fiat Uno with Turbo (Varnish)
  46. 46. “There are only two hard things in Computer Science: cache invalidation and naming things.” https://martinfowler.com/bliki/TwoHardThings.html Martin Fowler
  47. 47. Jan Löffler CTO Plesk ● @jlsoft2 ● jan@plesk.com ● http://www.slideshare.net/jlsoft/ ● https://www.jan-loeffler.de
  48. 48. BUILD SECUR E RUN
  49. 49. 377.000+ SERVERS 11.000.000+ DOMAINS 19.000.000+ MAILBOXES 2.500+ HOSTERS
  50. 50. WordPress Management Free SSL everywhere http2 80+ extensions CLI Automatic Updates Site Migration Free support 32+ languages Server Security DNS
  51. 51. MESSAGE?
  52. 52. “When you walk through your website architecture and you wonder who could be so stupid to test it with 20.000 parallel requests per second. But if you want to be successful and play in the first league, it is important to think about it before your traffic increases” Jan Löffler @jlsoft2
  53. 53. https://github.com/plesk/wordpress-aws-scaler

×