Server Optimization

APCu

This is a data storing mechanism.  It is a rebuild of APC for php7.x+

To install just run this:

sudo apt-get install php-apcu


OpCache

This is a opcode storing mechanism.

These settings are for php7.x.  In your php-fpm/php.ini just replace the opcache code with the following:

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=128

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=8

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=32531

; The maximum percentage of "wasted" memory until a restart is scheduled.
opcache.max_wasted_percentage=5

; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
opcache.use_cwd=1

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=2

; Enables or disables file search in include_path optimization
opcache.revalidate_path=0

; If disabled, all PHPDoc comments are dropped from the code to reduce the
; size of the optimized code.
opcache.save_comments=1

; If enabled, a fast shutdown sequence is used for the accelerated code
opcache.fast_shutdown=1

; Allow file existence override (file_exists, etc.) performance feature.
opcache.enable_file_override=0

; A bitmask, where each bit enables or disables the appropriate OPcache
; passes
opcache.optimization_level=0x7FFFBFFF

opcache.inherited_hack=1
opcache.dups_fix=0

; The location of the OPcache blacklist file (wildcards allowed).
; Each OPcache blacklist file is a text file that holds the names of files
; that should not be accelerated. The file format is to add each filename
; to a new line. The filename may be a full path or just a file prefix
; (i.e., /var/www/x  blacklists all the files and directories in /var/www
; that start with 'x'). Line starting with a ; are ignored (comments).
;opcache.blacklist_filename=

; Allows exclusion of large files from being cached. By default all files
; are cached.
opcache.max_file_size=0

; Check the cache checksum each N requests.
; The default value of "0" means that the checks are disabled.
opcache.consistency_checks=0

; How long to wait (in seconds) for a scheduled restart to begin if the cache
; is not being accessed.
opcache.force_restart_timeout=180

; OPcache error_log file name. Empty string assumes "stderr".
opcache.error_log=

; All OPcache errors go to the Web server log.
; By default, only fatal errors (level 0) or errors (level 1) are logged.
; You can also enable warnings (level 2), info messages (level 3) or
; debug messages (level 4).
opcache.log_verbosity_level=1

; Preferred Shared Memory back-end. Leave empty and let the system decide.
;opcache.preferred_memory_model=

; Protect the shared memory from unexpected writing during script execution.
; Useful for internal debugging only.
opcache.protect_memory=0

; Allows calling OPcache API functions only from PHP scripts which path is
; started from specified string. The default "" means no restriction
;opcache.restrict_api=

; Mapping base of shared memory segments (for Windows only). All the PHP
; processes have to map shared memory into the same address space. This
; directive allows to manually fix the "Unable to reattach to base address"
; errors.
;opcache.mmap_base=

; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching.
;opcache.file_cache=

; Enables or disables opcode caching in shared memory.
opcache.file_cache_only=0

; Enables or disables checksum validation when script loaded from file cache.
opcache.file_cache_consistency_checks=1

; Implies opcache.file_cache_only=1 for a certain process that failed to
; reattach to the shared memory (for Windows only). Explicitly enabled file
; cache is required.
;opcache.file_cache_fallback=1

; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
; This should improve performance, but requires appropriate OS configuration.
opcache.huge_code_pages=0

; Validate cached file permissions.
; opcache.validate_permission=0

; Prevent name collisions in chroot'ed environment.
; opcache.validate_root=0

opcache.file_update_protection=2
opcache.lockfile_path=/tmp



Redis

Redis is an open source Database, in-memory data structure store.

  1. Being by installing the following:

    sudo apt-get install redis-server php-redis
  2. Edit the Redis config with this:

    sudo nano /etc/redis/redis.conf
  3. Search for the bind command and add your IP to the end of it:

    bind 127.0.0.1 YOUR_IP_ADDRESS
  4. Add this at the end of the file

    maxmemory 256mb
    maxmemory-policy allkeys-lru
  5. Open your php.ini, find and replace the following line with:

    session.save_handler = redis
  6. In the php.ini also uncomment and replace this line:

    session.save_path = "tcp://YOUR_IP_ADDRESS:6379"
  7. Drupal 8
    1. Grab the Redis module, enable it on your instance
    1. Make sure the Redis module is enabled before you add these settings into your settings.php in, it will cause a WSOD if you don't
       

      // Redis Settings
      $settings['redis.connection']['interface'] = 'PhpRedis';
      $settings['redis.connection']['host']      = '127.0.0.1';
      $settings['cache']['default'] = 'cache.backend.redis';
      $settings['cache']['bins']['bootstrap'] = 'cache.backend.chainedfast';
      $settings['cache']['bins']['discovery'] = 'cache.backend.chainedfast';
      $settings['cache']['bins']['config'] = 'cache.backend.chainedfast';
      $settings['container_yamls'][] = 'modules/contrib/redis/example.services.yml';
      
      
  8. Wordpress
    1. Install the WP Redis plugin
    2. Create a file wp-content/object-cache.php and put this in it:

      1. https://gist.github.com/labboy0276/92b91b9cae164da26bc13bdaec69d9b2

    3. Verify by going to wp-admin/plugins.php?plugin_status=dropins , you should see the object-cache.php file in there.

Varnish

Varnish is an HTTP accelerator designed for content-heavy dynamic web sites.

  1. Run these commands

    sudo apt-get install apt-transport-https
    curl http://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add -
    sudo sh -c 'echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list'
    sudo apt-get update
    sudo apt-get install varnish
  2. Now edit the varnish setup

    sudo nano /etc/default/varnish
    1. Change the line DAEMON_OPTS="-a :6081 \  
      1. to DAEMON_OPTS="-a :80 \

  3. LEMP + Drupal

    1. Edit the default vcl

      sudo nano /etc/varnish/default.vcl
      1. Copy this file into it: https://gist.github.com/labboy0276/cae7f121e1abe2321926cdf699702cd0

    2. Edit your hosts file

      sudo nano /etc/nginx/sites-available/drupal
      1. Change the listen port from 80 to 8008

  4. LEMP + Wordpress

    1. Edit the default vcl

      sudo nano /etc/varnish/default.vcl
      1. Copy this file into it: https://gist.github.com/labboy0276/51a4f12e7db556133824baee7e060cc6

    2. Edit your hosts file

      sudo nano /etc/nginx/sites-available/digitalocean
      1. Change the listen port from 80 to 8008

  5. LAMP + Wordpress
    1. Edit the default vcl

      sudo nano /etc/varnish/default.vcl
      1. Copy this file into it: https://gist.github.com/labboy0276/4ab90d2f1a3b1b4c82942048cc3ed1d1

    2. Edit the config:

      sudo nano /etc/apache2/ports.conf
      1. Change the Listen port to 8008

    3. Edit your hosts file:

      sudo nano /etc/apache2/sites-available/000-default.conf
    4. Change the listen port from 80 to 8008

  6. reboot the server