Nginx: Difference between revisions

From MoodleDocs
No edit summary
Line 18: Line 18:


=== Nginx ===
=== Nginx ===
==== fcig_params ====
The standard [http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param fastcgi_params] file included in Nginx is not compatible with moodle; save a new fastcgi_params file with the following parameters,
<pre>
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
</pre>


==== server configuration ====
==== server configuration ====
Line 57: Line 27:
     # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
     # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
     fastcgi_split_path_info  ^(.+\.php)(/.+)$;
     fastcgi_split_path_info  ^(.+\.php)(/.+)$;
    fastcgi_index            index.php;
    fastcgi_pass            127.0.0.1:9000 (or your php-fpm socket);
     include                  fastcgi_params;
     include                  fastcgi_params;
     fastcgi_index            index.php;
     fastcgi_param  PATH_INFO      $fastcgi_path_info;
     fastcgi_pass            127.0.0.1:9000;
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
 
}
}
</pre>
</pre>

Revision as of 15:22, 28 May 2015

Nginx [engine x] is an HTTP and reverse proxy server, as well as a mail proxy server, written by Igor Sysoev. The nginx project started with a strong focus on high concurrency, high performance and low memory usage. It is licensed under the 2-clause BSD-like license and it runs on Linux, BSD variants, Mac OS X, Solaris, AIX, HP-UX, as well as on other *nix flavors. It also has a proof of concept port for Microsoft Windows.

The following is community-contributed documentation on Nginx configuration. Amendmends and additions are welcome.

Nginx configuration

PHP-FPM

Nginx is usually configured to interface with PHP via php-fpm. This is both fast and robust.

php.ini

Typically the php-fpm daemon with have it's own php.ini e.g. in debian it is /etc/php5/fpm/php.ini. The following setting is required,

php.ini

cgi.fix_pathinfo=0

Nginx

server configuration

Add the following 'slash arguments' compatible (see Using slash arguments) 'location' block to your vhosts 'server' configuration in your nginx configuration.

nginx.conf location:

location ~ [^/]\.php(/|$) {
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    fastcgi_split_path_info  ^(.+\.php)(/.+)$;
    fastcgi_index            index.php;
    fastcgi_pass             127.0.0.1:9000 (or your php-fpm socket);
    include                  fastcgi_params;
    fastcgi_param   PATH_INFO       $fastcgi_path_info;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;

}

XSendfile aka X-Accel-Redirect

Setting Moodle and Nginx to use XSendfile functionality is a big win as it frees PHP from delivering files allowing Nginx to do what it does best, i.e. deliver files.

Enable xsendfile for Nginx in Moodles config.php, this is documented in the config-dist.php, a minimal configuration look like this,

$CFG->xsendfile = 'X-Accel-Redirect';
$CFG->xsendfilealiases = array(
    '/dataroot/' => $CFG->dataroot
);

Accompany this with a matching 'location' block in your nginx server configuration.

location /dataroot/ {
    internal;
    alias <full_moodledata_path>;
}

The definition of 'internal' here is important as it prevents client access to your dataroot.

See also