Deployment



Mako works well with all major webservers but we suggest using Nginx along with php-fpm for optimal performance.


Server configuration

Nginx

Basic Nginx configuration that you can build upon:

server
{
	listen 80;
	server_name example.org;
	root /srv/www/mako/htdocs/public;
	index index.php;

	access_log /srv/www/mako/logs/access.log;
	error_log  /srv/www/mako/logs/error.log;

	location /
	{
		try_files $uri $uri/ /index.php?$query_string;
	}

	location = /favicon.ico { access_log off; log_not_found off; }
	location = /robots.txt { access_log off; log_not_found off; }

	location ~* \.php$
	{
		try_files       $uri =404;
		include         fastcgi_params;
		fastcgi_pass    127.0.0.1:9000;
		fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
}

You can also use php-fpm over a unix socket instead of tcp. Just make sure that the rlimit_files value is lower or equal to the file descriptor limit at the OS level.


Optimize Composer autoloading

You should consider running the following command as part of your deployment process as it will generate an optimized class autoloader.

composer dump-autoload --optimize --no-dev --classmap-authoritative

Configure PHP for performance

OPcache

You should make sure that your production server has the OPcache extension installed and enabled. OPcache will improve PHP performance by storing your application as compiled bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

The following OPcache settings have been known to work well with a Mako application in production:

opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.fast_shutdown=1

Cachetool can be used to check the OPcache status. This is useful if you want to see if you need to tweak some of the configuration values.

Note that setting validate_timestamps to 0 tells OPcache to never check PHP files for changes. This is great for performance but it means that you'll have to clear the bytecode cache after each deployment to ensure that your files are recompiled.

This can be done by reloading or restarting the php-fpm process, by calling opcache_reset() (this must be done via php-fpm and not php-cli) or by using cachetool.