/
Server Optimization

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

Related content

PHP & MySQL Performance Tweaks
PHP & MySQL Performance Tweaks
More like this
High Performance LAMP based Wordpress on DigitalOcean
High Performance LAMP based Wordpress on DigitalOcean
More like this
PHP 8.x Upgrade Considerations
PHP 8.x Upgrade Considerations
More like this
Redis cache configuration on Pantheon
Redis cache configuration on Pantheon
More like this
Configuring settings.php on Pantheon
Configuring settings.php on Pantheon
More like this
Coding Standards
Coding Standards
More like this