Set up NextCloud Server on Ubuntu 16.04 with Apache, MariaDB and PHP7

NextCloud 11 is out! It’s a drop-in replacement for ownCloud. In this tutorial, we are going to look at how to set up NextCloud personal cloud storage on a Ubuntu 16.04 VPS with Apache, MariaDB and PHP7.

Differences between NextCloud and ownCloud

NextCloud is a fork of the open source ownCloud. Major differences are:

  • It is 100% open source. All features including the enterprise part is open source. NextCloud charges fees for support rather than selling enterprise product.
  • It values the community more than ownCloud does.


To follow this tutorial, you will need:

Once the above prerequisites are fulfilled, come back here and read on.

Step 1: Install NextCloud 11 Server on Ubuntu 16.04

Download the NextCloud server zip archive onto your server. The latest stable version is 11.0.1 at the time of this writing. You may need to change the version number. Go to and click the download button to check out the latest version.


Extract it.

sudo apt install unzip


A new directory named nextcloud will be created in the current working directory. Copy the new directory and all of its content to the document root of Apache server.

sudo cp -r nextcloud /var/www/

Then you also need to give the Apache user (www-data) write permission.

sudo chown www-data:www-data /var/www/nextcloud/ -R

Step 2: Create a Database and User in MariaDB

Log into MariaDB database server with the following command:

mysql -u root -p

Then create a database for Nextcloud. This tutorial name the database nextcloud. You can use whatever name you like.

create database nextcloud;

Create the database user. Again, you can use your preferred name for this user. Replace your-password with your preferred password.

create user nextclouduser@localhost identified by 'your-password';

Grant this user all privileges on the nextcloud database.

grant all privileges on nextcloud.* to nextclouduser@localhost identified by 'your-password';

Flush privileges and exit.

flush privileges;


Step 3: Enable Binary Logging in MariaDB

Edit the mysqld configuration file.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Add the following three lines in [mysqld] section.

log-bin        = /var/log/mysql/mariadb-bin
log-bin-index  = /var/log/mysql/mariadb-bin.index
binlog_format  = mixed

The format of binary log must be mixed. Save and close the file. Then restart MariaDB service.

sudo systemctl restart mysql

Now binary log is enabled in MariaDB.

Step 4: Create an Apache Virtual Host File for Nextcloud

We will create a nextcloud.conf in /etc/apache2/sites-available directory.

sudo nano /etc/apache2/sites-available/nextcloud.conf

Copy and paste the following lines in the file. Replace the red text with your actual domain name. You also need to point your domain name to the IP address of your Ubuntu server in DNS.

<VirtualHost *:80>
 DocumentRoot "/var/www/nextcloud"

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory /var/www/nextcloud/>
 Options +FollowSymlinks
 AllowOverride All

 <IfModule mod_dav.c>
 Dav off

 SetEnv HOME /var/www/nextcloud
 SetEnv HTTP_HOME /var/www/nextcloud
 Satisfy Any



Save and close the file. Then create a symbolic link to /etc/apache2/sites-enabled/

sudo ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf

Enable the following Apache modules.

sudo a2enmod rewrite headers env dir mime setenvif ssl

Install needed PHP modules

sudo apt install php7.0-common php7.0-gd php7.0-json php7.0-curl  php7.0-zip php7.0-xml php7.0-mbstring

Restart Apache so that the above Apache and PHP modules are loaded.

sudo systemctl restart apache2

Step 5: Finish the Installation in your Web Browser

Now in your web browser, type your domain name. For instance

You will be asked to create an admin account. The data folder is where user’s files are stored. For security, it’s better to place the data directory outside of Nextcloud web root, such as /var/www/nextcloud-data. which can be created with the following command:

sudo mkdir /var/www/nextcloud-data/

Then make sure the Apache user (www-data) has write permission to the data directory.

sudo chown www-data:www-data /var/www/nextcloud-data -R

If you are concerned with username and password sniffing, then you can first enable HTTPS (see the steps below) and then enter username, password and database details.

install nextcloud on ubuntu 16.04 16.10

Then enter the database username, database name and password you created earlier to connect Nextcloud to MariaDB database.

nextcloud ubuntu 16.04

Once it’s done, you will see the Web interface of Nextcloud. Congrats! You can now start using it as your private cloud storage.

Nextcloud LAMP

Secure it with HTTPS

Skip this step if you installed nextCloud on your local computer.

HTTPS helps us prevent man-in-the-middle attack and password sniffing. We can obtain a free TLS/SSL certificate from Let’s Encrypt CA. First Let’s install the certbot client. The client is still named letsnecrypt in Ubuntu repository. The following command will install the client and apache plugin.

sudo apt install letsencrypt python-letsencrypt-apache

Now issue the following command to obtain a free TLS/SSL certificate. Replace the red-colored text with your actual data.

sudo letsencrypt --apache --agree-tos --email your-email-address -d

You will be asked to choose easy or secure. It’s recommended to choose secure so that all http requests will be redirected to https.

let's encrypt apache

Once you hit the OK button, a free TLS/SSL certificate is obtained and installed on your Apache server.

let's encrypt apache auto

Now visit your Nextcloud site again. You will see that it’s automatically redirected to https.

By default, the Apache SSL configuration did not add HSTS security header. To add HSTS header, edit the SSL config file.

sudo nano /etc/apache2/sites-available/nextcloud-le-ssl.conf

Paste the following lines in the file after SSLCertificateKeyFile line.

<IfModule mod_headers.c>
     Header always set Strict-Transport-Security "max-age=15768000; preload"

Save and close the file. Then reload Apache.

sudo systemctl reload apache2

Linux Desktop Client

You can install NextCloud desktop client on Ubuntu 16.04/Ubuntu 17.10 from official PPA by using the following commands.

sudo add-apt-repository ppa:nextcloud-devs/client

sudo apt update

sudo apt install nextcloud-client

If you are using Gnome desktop environment, then simply go to Settings > Online account > NextCloud (ownCloud) to set it up. You can also easily access your Nextcloud files via WebDAV.

Configuring Redis Cache for nextCloud

Note: Redis cache is optional. You can safely skip this part.

If you go to your nextCloud admin page, you might see the following warning:

No memory cache has been configured. To enhance your performance please configure a memcache if available.

We will enable memory caching for nextCloud by using Redis. Install Redis server from Ubuntu 16.04 repository.

sudo apt install redis-server

You can check the version with:

redis-server -v

Sample output:

Redis server v=3.0.6 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=687a2a319020fa42

Now we can check if redis server is running.

systemctl status redis


From the above screenshot, we can see that it’s running and auto-start is enabled. If for any reason it’s not running, execute the following command:

sudo systemctl start redis-server

And if auto-start at boot time is not enabled, you can use the following command to enable it:

sudo systemctl enable redis-server

Now let’s configure Redis as a cache for nextCloud. Install the PHP extension for interfacing with Redis.

sudo apt install php-redis

Check if the extension is enabled or not.

php --ri redis

ubuntu 16.04 php7 redis extension

We can see that Redis extension is enabled and the version is 2.2.8 which is higher than the required 2.2.5+ by nextCloud. You may need to manually enable Redis extension either by restarting Apache

sudo systemctl restart apache2

or by running the following commmand:

sudo phpenmod redis

Next, edit nextCloud configuration file.

sudo nano /var/www/nextcloud/config/config.php

Add the following lines above the ); line.

'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
     'host' => 'localhost',
     'port' => 6379,

ubuntu 16.04 redis cache nextcloud

Save and close the file. Now go to nextCloud admin page again, the warning about memory caching should be gone.

Congrats! You have successfully set up NextCloud personal cloud storage on a Ubuntu 16.04 VPS with Apache, MariaDB and PHP7.

Comments, questions or suggestions are always welcome. As always, if you found this post useful, then subscribe to our free newsletter. You can also follow us on Google+Twitter or like our Facebook page.

Rate this tutorial
[Total: 91 Average: 4.3]

65 Responses to “Set up NextCloud Server on Ubuntu 16.04 with Apache, MariaDB and PHP7

  • Ryan Berkeley
    8 years ago

    I seem to be facing an issue with pointing the domain name to the IP address. Could you give some more information on this? I have created an A record for my domain i.e. that points to my IP address.

    • Xiao Guoan
      8 years ago

      For this nextcloud setup, you only need an A record that points your domain name to the IP address of your server.

      • Ryan Berkeley
        8 years ago

        So let’s say that my domain is I have create an “A record” that says which points to the IP address of my server. You’re telling me this should work? Or shall I simply make an A record of “” which points to my IP address?

        • Xiao Guoan
          8 years ago

          Normally you want to use to host a website and use to host your nextcloud storage.

          In this tutorial, we configured an Apache virtual host for So to access your Nextcloud storage via in the browser address bar, you need to set an “A record” that says which points to the IP address of your server.


          If you configure another Apache virtual host for to host a website, then you need to set an “A record” that says which points to the IP address of your server.


          This tutorial didn’t show you how to host a website, so you don’t need to set this A record.

          You can of course create two virtual hosts on the same server. In that case, you need to set A record for each of your virtual hosts and the two A records points to the same IP address.


        • Ryan Berkeley
          8 years ago

          So it looks like I was doing it right. However it wasn’t picking it up. I ended up doing for the setup which worked.

        • Xiao Guoan
          8 years ago

          For security, try to access it via domain name and install a free TLS/SSL certificate from Let’s Encrypt. You can’t get a cert with IP address.

        • Ryan Berkeley
          8 years ago

          @xiao_guoan:disqus I actually figured it out. So in my A records, I was adding instead of just “subdomain” and the pointing it to the IP. I think I will retry this installation.

        • Xiao Guo-An (Admin)
          8 years ago

          Yes, you only need to enter the subdomain in DNS settings. If the subdomain is blank (, just enter @.

        • Yoel Gutierrez
          8 years ago

          Hello I have a weird problem, I set up everything and is working good. But, the thing is if I access my cloud thru my domain, ( out of my local network, work perfectly. Now the problem is when I get home I cant do it that way. if I open the browser and type it never get to the nextcloud but If I type my local ip address in the address bar of the NextCloud Server it opens perfectly. witch it like anoying everytime I get home remove the domain name and login with my local ip address.

          Please HELP I am frustrated

        • Hi Yoel, look for a configuration in your internet router. I suppose you did a Port NAT in the router and the NextCloud is in an internal PC/RPi, etc. It seems that the connection from an internal IP (ie is not permitted to the port forwarding in the public IP.

  • M M Arif
    8 years ago

    Few things are missing/need correction in this post, other than that good job.
    – Need to run for letsencrypt to work: a2enmod ssl
    – As a security measure the data dir should be outside the web server path(maybe here): /var/www/data OR /var/data

    • Xiao Guoan
      8 years ago

      sites-available contains the actual config files. sites-enabled contains the symlink.
      The 1st argument of ln -s command should be the actual file, the 2nd argument should be the name of the symlink.

      • M M Arif
        8 years ago

        Sorry, my bad overlooked that part. I thought it was enabled.
        Edit: removed that part to not confuse users.

    • Xiao Guo-An (Admin)
      8 years ago

      Oh, yes, the data directory should be outside the web root. I’ve added this recommendation in step 5. Thanks !

      • Could you please provide the command to give the apache user write permissions to the data folder?

        • Xiao Guo-An (Admin)
          8 years ago

          First create the data directory.

          sudo mkdir /var/www/data

          Then make Apache as the owner of this directory.

          sudo chown www-data:www-data /var/www/data -R

        • Thank you for the quick reply and the excellent instructions.

    • Xiao Guo-An (Admin)
      8 years ago

      The SSL module will automatically be enabled when you run the letsencrypt command. Anyway, I will add this command in my tutorial.

      • M M Arif
        8 years ago

        For some reasons it did not for me, and the process died half way while some files were created. Dig a bit about it and found that ssl issue. Afterwards it worked.

        • Xiao Guoan
          8 years ago

          Then I must add it in this post. Thanks for this info.

      • Do you know the best way to set up auto renewal of the SSL Cert?

        • Xiao Guoan
          8 years ago

          You can set up a cron job.

          sudo crontab -e

          Then put the following line at the end of the file.

          @weekly letsencrypt renew

          The renew command will run once a week.

  • Ralphael Johnson
    8 years ago

    followed your guide but when i get to the step to type in my domain name to finish the last step of the nextcloud setup (step 5) i get the below error any ideas?? I can get to just fine but when i try to access or neither works

    Not Found

    The requested URL /nextcloud was not found on this server.

    Apache/2.4.18 (Ubuntu) Server at Port 80

    • Xiao Guo-An (Admin)
      8 years ago

      Hi, it seems that you are installing nextcloud in your own network, not on a public server, as indicated by which is a private IP address.

      You can edit the hosts file of your OS to set pointing to
      On Linux, the hosts file is /etc/hosts. So you can edit it by running

      sudo nano /etc/hosts

      And add a record like this: localhost

      Note that you can’t obtain TLS/SSL certificate from Let’s Encrypt if you install Nextcloud in your own network and you don’t need to.

      • zakarra zakarra
        8 years ago

        thanks for the guide!
        i followed your guide, my ubuntu server is only local in virtualbox to test, in the step 4, what name i put for the domain??? any name??? for example “”???
        Then in point 5, i type in the browser but find internet address, not my nextcloud server instance.
        Any ideas??? (sorry my bad english)

  • BHSPitMonkey
    8 years ago

    In the HTTPS section, the article says to edit an Apache config file that was never created in the previous steps (nextcloud-le-ssl.conf). Where did it come from?

    • Xiao Guo-An (Admin)
      8 years ago

      Hi, nextcloud-le-ssl.conf will be automatically created after you get the TLS certificate from Let’s Encrypt.

  • jenkinsm74
    8 years ago

    Hey. You should include a tutorial on installing the redis caching for nextcloud

    • Xiao Guoan
      8 years ago

      Hi, I updated my tutorial to include the instructions of configuring Redis cache for nextCloud. 🙂

  • MrAdminus
    8 years ago

    Been running many different servers, Owncloud is just one of them. Landed here when looking for news about the forked version(Nextcloud)..
    Just wanted to say that you have created a really nice tutorial!

  • Jensens Ideal
    8 years ago

    You should secure your domain with https before nextcloud setup because otherwise you submit your admin and database password unencrypted in the web installer.

  • Followed this guide to a Tee but got hung up on the Redis server part. I’m getting this error now when trying to access my website:
    Memcache OCMemcacheRedis not available for local cache Is the matching PHP module installed and enabled?

    any thoughts?

    • I’m getting the same exact error message. Did you ever resolve it?

      • M M Arif
        8 years ago

        Restart apache.
        systemctl restart apache2

        • Funny thing is, I did try that a couple of times, and it didn’t work.

          However, after a full reboot of my server, Nextcloud was successfully using the memory caching.

  • Hello. All process failed for me at the end of point 4, when I must restart apache2. I received error “Job for apache2.service failed because the control process exited with error code. See “systemctl status apache2.service” and “journalctl -xe” for details”

    Before the apache server was running ok, but after point 4, server goes down… I uninstall apache 2, and reinstall, and the server start again. Proceed with point 4, and the same error when restarting..

    When edit netcloud.conf, I change red text for, because I’m installing nextcloud in local PC Mint-KDE, and the apache server is running on… (before goes down..)

    First of all, I follow previous guide and all was OK.

    And now I’m try to follow this guide, but cant pass point 4.

    Thanks for help 🙂 (Sorry bad English..)

    • Xiao Guo-An (Admin)
      8 years ago

      Hi, I tested this tutorial on my local Mint 18 computer and it worked like a charm with no errors at all.

      You can issue sudo journalctl -xe command to see if any errors are recorded. Also checking out the Apache error log file /var/log/apache2/error.log can also help.

      • I have this error…

        apache2_reload: apache2: Syntax error on line 219 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/sites-enabled/nextcloud.conf: /etc/apache2/sites-enabled/nextcloud.conf:1:

        And the line 219 is “IncludeOptional sites-enabled/*.conf”

        So, I navigate to etc/apache2/sites-enabled/ and there is only a nexcloud.conf

        I supose there is something wrong in nextcloud.conf, like the error that mention “line 1” in this file, so this is what I have..

        DocumentRoot “/var/www/nextcloud”

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        Options +FollowSymlinks
        AllowOverride All

        Dav off

        SetEnv HOME /var/www/nextcloud
        SetEnv HTTP_HOME /var/www/nextcloud
        Satisfy Any

        Is there somenthing wrong in Line 1??


        • xlman
          8 years ago

          I found the solution….

          I need to close the tag by adding the line

          to the end of nextcloud.conf file

          It was not closed!!! :-O

          SOLVED!! Next step… 5 🙂

  • Michael B
    8 years ago

    followed your instructions with no errors but in step 5 I am getting only the Apache2 Ubuntu Default Page
    any advise?

    /etc/apache2/sites-available# ll
    total 16K
    -rw-r–r– 1 root root 1.4K Sep 21 20:37 000-default.conf
    -rw-r–r– 1 root root 6.2K Apr 5 23:15 default-ssl.conf
    -rw-r–r– 1 root root 409 Sep 21 20:49 nextcloud.conf

    • Xiao Guoan
      8 years ago

      Are you installing it on your local machine?

      • Michael B
        8 years ago

        no, on virtual machine
        root@nextcloud:~# lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description: Ubuntu 16.04.1 LTS
        Release: 16.04
        Codename: xenial
        root@nextcloud:~# uname -a
        Linux nextcloud 4.4.0-38-generic #57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

        • Xiao Guoan
          8 years ago

          What did you type in browser address bar?

  • Alex Tupeck
    8 years ago

    I followed your tutorial (AWESOME BY THE WAY!) However, web browsers connect just fine but using the Android App I get Malformed Server Configuration. Any ideas on how to fix that?

  • marioandluigi879
    8 years ago

    I keep getting a problem loading page, reloading in 5 secs everytime think this could be fixed?

  • Awesome tutorial! What needs to be changed for this to work on Nginx?

  • Have you by chance looked into creating a tutorial on how to install the Collabora version of LibreOffice on a NextCloud server?

  • Jamie Lanniste
    8 years ago

    Good tutorial. I’m stuck on step 5 tho. I did everything to the T and everything in stalled. I have a website name and I tryed using that and nothing came up. So I did a redo on step 4 with my local ip and nothing. And when I run -ls s it says there is a file so I deleted that file in enabled but still nothing. I bought a dns from go daddy. Will that work with this?

    • Xiao Guo-An (Admin)
      8 years ago

      Any domain name with a correct A record will work.

  • Sean Villani
    8 years ago

    I couldn’t get redis working until i ran:
    sudo phpenmod redis

  • Nenad Krstić
    3 weeks ago

    Great tutorial, really useful and works like charm 🙂
    What you could add is how to add Certbot ( letsnecrypt ) in cron so it will automatically renew cert after 90 days.

  • Brian Goodacre
    3 weeks ago

    Excellent tutorial to get up and running. Thank you!

  • Derek Curry
    3 weeks ago

    Shouldn’t the first screen shot under step 5 have

    /var/www/nextcloud-data for the data directory instead of /var/www/nextcloud/data

  • ed obrien
    3 weeks ago

    When running sudo systemctl enable redis I get the following error Failed to execute operation: Too many levels of symbolic links. I don’t understand it, this is the second time using your tutorial and it worked perfectly last time on an older server.

  • Aaron Paluzzi
    3 weeks ago

    Worked my way through this and got nextcloud working! Thank you for the tutorial. I did run into a few hiccups though.

    For the life of me I couldn’t get this working with nextcloud located at /var/www/nextcloud/. I relocated the directory under /var/www/html/nextcloud/ and updated the config files accordingly and it’s working. Not sure why this is

    The issue I’m having now is I’ve tied a dynamic dns to my system. When I load the url in a web browser I’m pointed at nextcloud. I get a error page stating that nextcloud doesn’t recognize the url (even though I entered it in the config above) and asks if I would like to add it. I click add and my browser forwards to my internal IP address which fails as I’m on an external network.

    Has anyone seen this error?

  • Joshua Shourds
    3 weeks ago

    Author – I am stuck on step 5. When I go to my url, I am directed to the Apache2 Ubuntu Default Page.

    Please help!

  • IT Tech
    3 weeks ago

    @xiao_guoan:disqus Thanks ! Its works !! Yeahhhhhhhhhh
    I’m running on Ubuntu 16.04
    NextCloud 12.02

  • Aron Heck
    3 weeks ago

    Everything is perfect except, that letsencrypt is down due to security issues, but everything works fine with certbot

  • I have a Apache Tomcat 8.5.4 already installed in ubuntu and it is pointed to my domain and my application is running in tomcat, now I want it to serve the NextCloud as well, so, can anyone help me how to do this?

  • loreddi
    3 weeks ago

    One of the best Nextcloud-Tutorials I’ve ever read.
    Thank you so much for the great work!

  • jkronos
    3 weeks ago

    @xiao_guoan:disqus Dude, thank you so much!!!! I been watching youtube videos for the past few days triying to setup the perfect nextcloud instance on exsi host and could not get it to work the way I wanted. After reading your blog I was up and running in a few minutes with SSL enabled and everything!!!! So right now my ubuntu VM is running from my own rack with gigabit connection and 15TB local storage on NAS with SSL. My family no longer needs google services on all our devices. Do you have a bitcoin or litecoin wallet where I can send you some gratitude for beer?

  • Thank you for your extremely good tutorials. I have as a dummy followed them and got things running. Now after updating Nextcloud and whole linux 16.04 to 18.xx I endup to get this while renewing certs

    “Attempting to renew cert (zz.zzz.zz) from /etc/letsencrypt/renewal/zz.zzz.zz.conf produced an unexpected error: Failed authorization procedure. zz.zzz.zz (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://zz.zzz.zz/.well-known/acme-challenge/F9HNk9OzxfovMZ0FrMBNaqbZsi6GFp7v3eru9tzXtJk []: “404 Not Found\n<404 Not Found\n\nThe requested URL was not fo". Skipping."

    • Xiao Guo An (Admin)
      5 years ago

      This a common problem in certbot. You can try using other ACME challenges like DNS-01, instead of using the default http-01 challenge.

Leave a Comment

  • Comments with links are moderated by admin before published.
  • Your email address will not be published.
  • Use <pre> ... </pre> HTML tag to quote the output from your terminal/console.
  • Please use the community ( for questions unrelated to this article.
  • I don't have time to answer every question. Making a donation would incentivize me to spend more time answering questions.

The maximum upload file size: 2 MB. You can upload: image. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here