Nginx Example Configurations

This page covers example Nginx configurations to use with running an Nextcloud server. Note that Nginx is not officially supported, and this page is community-maintained. (Thank you, contributors!)

  • You need to insert the following code into your Nginx configuration file.
  • The configuration assumes that Nextcloud is installed in /var/www/nextcloud and that it is accessed via http(s)://cloud.example.com.
  • Adjust server_name, root, ssl_certificate and ssl_certificate_key to suit your needs.
  • Make sure your SSL certificates are readable by the server (see nginx HTTP SSL Module documentation).
  • add_header statements are only taken from the current level and are not cascaded from or to a different level. All necessary add_header statements must be defined in each level needed. For better readability it is possible to move common add header statements into a separate file and include that file wherever necessary. However, each add_header statement must be written in a single line to prevent connection problems with sync clients.

Example Configurations

You can use Nextcloud over plain http, but we strongly encourage you to use SSL/TLS to encrypt all of your server traffic, and to protect user’s logins and data in transit.

  • Remove the server block containing the redirect
  • Change listen 443 ssl to listen 80;
  • Remove ssl_certificate and ssl_certificate_key.
  • Remove fastcgi_params HTTPS on;

Suppressing Log Messages

If you’re seeing meaningless messages in your logfile, for example client denied by server configuration: /var/www/data/htaccesstest.txt, add this section to your nginx configuration to suppress them:

location = /data/htaccesstest.txt {
  allow all;
  log_not_found off;
  access_log off;
}

JavaScript (.js) or CSS (.css) files not served properly

A common issue with custom nginx configs is that JavaScript (.js) or CSS (.css) files are not served properly leading to a 404 (File not found) error on those files and a broken webinterface.

This could be caused by the:

location ~* \.(?:css|js)$ {

block shown above not located below the:

location ~ \.php(?:$|/) {

block. Other custom configurations like caching JavaScript (.js) or CSS (.css) files via gzip could also cause such issues.

Performance Tuning

nginx (<1.9.5) <ngx_http_spdy_module nginx (+1.9.5) <ngx_http_http2_module

To use http_v2 for nginx you have to check two things:

1.) be aware that this module is not built in by default due to a dependency to the openssl version used on your system. It will be enabled with the --with-http_v2_module configuration parameter during compilation. The dependency should be checked automatically. You can check the presence of http_v2 with nginx -V 2>&1 | grep http_v2 -o. An example of how to compile nginx can be found in section “Configure nginx with the nginx-cache-purge module” below.

2.) When you have used SPDY before, the nginx config has to be changed from listen 443 ssl spdy; to listen 443 ssl http2;

nginx module check

As a first step, it is necessary to check if your nginx installation has the nginx cache purge module compiled in:

nginx -V 2>&1 | grep ngx_cache_purge -o

If your output contains ngx_cache_purge, you can continue with the configuration, otherwise you need to manually compile nginx with the module needed.

Compile nginx with the nginx-cache-purge module

  1. Preparation:
cd /opt
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
sudo vi /etc/apt/sources.list.d/nginx.list

Add the following lines (if different, replace {trusty} by your distribution name):

deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb -src http://nginx.org/packages/mainline/ubuntu/ trusty nginx

Then run sudo apt-get update

Note

If you’re not overly cautious and wish to install the latest and greatest nginx packages and features, you may have to install nginx from its mainline repository. From the nginx homepage: “In general, you should deploy nginx from its mainline branch at all times.” If you would like to use standard nginx from the latest mainline branch but without compiling in any additional modules, just run sudo apt-get install nginx.

  1. Download the nginx source from the ppa repository
cd /opt
sudo apt-get build-dep nginx
sudo apt-get source nginx
  1. Download module(s) to be compiled in and configure compiler arguments
ls -la

Please replace {release} with the release downloaded:

cd /opt/nginx-{release}/debian

If folder “modules” is not present, do:

sudo mkdir modules
cd modules
sudo git clone https://github.com/FRiCKLE/ngx_cache_purge.git
sudo vi /opt/nginx-{release}/debian/rules

If not present, add the following line at the top under:

#export DH_VERBOSE=1:
MODULESDIR = $(CURDIR)/debian/modules

And at the end of every configure command add:

--add-module=$(MODULESDIR)/ngx_cache_purge

Don’t forget to escape preceding lines with a backslash \. The parameters may now look like:

--with-cc-opt="$(CFLAGS)" \
--with-ld-opt="$(LDFLAGS)" \
--with-ipv6 \
--add-module=$(MODULESDIR)/ngx_cache_purge
  1. Compile and install nginx
cd /opt/nginx-{release}
sudo dpkg-buildpackage -uc -b
ls -la /opt
sudo dpkg --install /opt/nginx_{release}~{distribution}_amd64.deb
  1. Check if the compilation and installation of the ngx_cache_purge module was successful
nginx -V 2>&1 | grep ngx_cache_purge -o

It should now show: ngx_cache_purge

Show nginx version including all features compiled and installed:

nginx -V 2>&1 | sed s/" --"/"\n\t--"/g
  1. Mark nginx to be blocked from further updates via apt-get
sudo dpkg --get-selections | grep nginx

For every nginx component listed run sudo apt-mark hold <component>

  1. Regular checks for nginx updates

Do a regular visit on the nginx news page and proceed in case of updates with items 2 to 5.

Configure nginx with the nginx-cache-purge module

  1. Preparation Create a directory where nginx will save the cached thumbnails. Use any path that fits to your environment. Replace {path} in this example with your path created:
sudo mkdir -p /usr/local/tmp/cache
  1. Configuration
sudo vi /etc/nginx/sites-enabled/{your-nextcloud-nginx-config-file}

Add at the beginning, but outside the server{} block:

# cache_purge
fastcgi_cache_path {path} levels=1:2 keys_zone=NEXTCLOUD:100m inactive=60m;
map $request_uri $skip_cache {
     default 1;
     ~*/thumbnail.php 0;
     ~*/apps/galleryplus/ 0;
     ~*/apps/gallery/ 0;
}

Note

Please adopt or delete any regex line in the map block according your needs and the Nextcloud version used. As an alternative to mapping, you can use as many if statements in your server block as necessary:

set $skip_cache 1;
if ($request_uri ~* "thumbnail.php")      { set $skip_cache 0; }
if ($request_uri ~* "/apps/galleryplus/") { set $skip_cache 0; }
if ($request_uri ~* "/apps/gallery/")     { set $skip_cache 0; }

Add inside the server{} block, as an example of a configuration:

# cache_purge (with $http_cookies we have unique keys for the user)
fastcgi_cache_key $http_cookie$request_method$host$request_uri;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

location ~ \.php(?:$/) {
      fastcgi_split_path_info ^(.+\.php)(/.*)$;

      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_pass php-handler;

      # cache_purge
      fastcgi_cache_bypass $skip_cache;
      fastcgi_no_cache $skip_cache;
      fastcgi_cache NEXTCLOUD;
      fastcgi_cache_valid  60m;
      fastcgi_cache_methods GET HEAD;
      }

Note

Note regarding the fastcgi_pass parameter: Use whatever fits your configuration. In the example above, an upstream was defined in an nginx global configuration file. This may look like:

upstream php-handler {
    server unix:/var/run/php5-fpm.sock;
    # or
    # server 127.0.0.1:9000;
  }
  1. Test the configuration
sudo nginx -s reload
  • Open your browser and clear your cache.
  • Logon to your Nextcloud instance, open the gallery app, move through your folders and watch while the thumbnails are generated for the first time.
  • You may also watch with eg. htop your system load while the thumbnails are processed.
  • Go to another app or logout and relogon.
  • Open the gallery app again and browse to the folders you accessed before. Your thumbnails should appear more or less immediately.
  • htop will not show up additional load while processing, compared to the high load before.