Nextcloud installeren met Nginx en PHP 7.3 op CentOS 8

Nextcloud is een gratis (open bron) dropbox-achtige software, een vork van het ownCloud project. Nextcloud is geschreven in PHP en JavaScript, het ondersteunt vele databasesystemen zoals MySQL/MariaDB, PostgreSQL, Oracle database en SQLite.

Om je bestanden synchroon te houden tussen desktop en server, biedt Nextcloud toepassingen voor Windows, Linux en Mac desktops en een mobiele toepassing voor Android en iOS.

In deze zelfstudie laten we je zien hoe je Nextcloud 17 installeert met de Nginx webserver, PHP 7.3 en MariaDB database op een CentOS 8 server. We installeren Nextcloud en beveiligen het met een gratis Let’s Encrypt SSL certificaat.

Voorwaarde

Voor deze gids installeren we Nextcloud op de CentOS 8 server met 2GB RAM, 25GB vrije ruimte, en 2CPUs.

Wat we zullen doen:

  • Installeer Nginx webserver
  • Installeer PHP-FPM 7.3
  • Configureer PHP-FPM 7.3
  • Installeer en configureer de MariaDB Database
  • Genereer SSL Letsencrypt
  • Download Nextcloud 17
  • Instellen Nginx Virtualhost voor Nextcloud
  • Instelling SELinux voor Nextcloud
  • Nextcloud Post-Installatie

Stap 1 – Nginx installeren

Eerst installeren we de Nginx webserver op de CentOS 8 server en openen de HTTP en HTTPS poort op de firewalld.

Installeer Nginx uit de AppStream repository met het onderstaande dnf commando.

sudo dnf install nginx

Als de installatie voltooid is, start je de nginx service en voeg je hem toe aan het systeem opstarten.

systemctl start nginx
systemctl enable nginx

Controleer nu de status van de nginx service met het onderstaande commando.

systemctl status nginx

Je krijgt dat de nginx dienst draait op de CentOS 8 server.

Start Nginx met systemd

Vervolgens voegen we de HTTP en HTTPS diensten aan de firewalld toe.

Voeg de HTTP en HTTPS diensten aan de firewalld toe met het onderstaande firewall-cmd commando.

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent

Herlaad daarna de firewalld diensten.

firewall-cmd --reload

Als resultaat heb je met succes de Nginx webserver geïnstalleerd en de HTTP en HTTPS poorten geopend op de CentOS 8 server.

Configureer de firewall

Stap 2 – Installeer PHP-FPM

Volgens de systeemeisen van Nextcloud is het aan te bevelen om voor de installatie PHP 7.2 of PHP 7.3 te gebruiken.

Voor deze gids zullen we de PHP 7.3 gebruiken die uit de REMI repository geïnstalleerd kan worden.

Voor we verder gaan, schakelen we de ‘PowerTools’ repository in en voegen de EPEL en REMI repositories voor de CentOS 8 server toe.

Voer het onderstaande dnf commando uit.

sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Controleer nu alle beschikbare repository’s op het systeem.

dnf repolist

En je krijgt het resultaat als hieronder.

Controleer DNF Repositories

Je hebt de ‘PowerTools’ repository ingeschakeld en de EPEL en REMI repositories voor CentOS 8 toegevoegd.

Vervolgens schakelen we de PHP 7.3 REMI repository in.

Controleer alle beschikbare modules voor PHP pakketten.

dnf module list php

Schakel nu de module van de PHP 7.3 REMI repository in.

dnf module enable php:remi-7.3

Remi repository toevoegen in CentOS 8

Installeer daarna PHP en PHP-FPM 7.3 pakketten voor Nextcloud met het onderstaande dnf commando.

sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip

En je hebt PHP en PHP-FPM 7.3 op het CentOS 8 systeem geïnstalleerd.

Stap 3 – Configureer PHP-FPM 7.3

In deze stap stellen we de PHP-FPM voor Nextcloud inzet in.

Bewerk de ‘php.ini’ configuratie met het volgende commando.

vim /etc/php.ini

Haal het commentaar weg en verander de configuratie zoals hieronder.

memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0

Bewaar en sluit.

Bewerk nu de PHP opcache configuratie ‘/etc/php.d/10-opcache.ini’.

vim /etc/php.d/10-opcache.ini

Verander de configuratie als hieronder.

opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Bewaar en sluit.

Bewerk nu de PHP-FPM configuratie ‘/etc/php-fpm.d/www.conf’.

vim /etc/php-fpm.d/www.conf

Verander de ‘user’ en ‘group’ in ‘nginx’.

user = nginx
group = nginx

Verander de ‘listen’ configuratie in het sock bestand zoals hieronder.

listen = /run/php-fpm/www.sock

Haal het commentaar weg op de PHP omgevingsvariabele hieronder.

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Haal het commentaar weg bij de opcache configuratie op de laatste regel.

php_value[opcache.file_cache] = /var/lib/php/opcache

Bewaar en sluit.

Maak nu een nieuwe directory voor PHP sessie en opcache, verander dan de eigenaar van die directories in ‘nginx’ gebruiker en groep.

mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}

En je hebt de PHP-FPM configuratie voor de Nextcloud installatie voltooid.

Start de PHP-FPM dienst en voeg hem toe aan het systeem opstarten.

systemctl enable php-fpm
systemctl start php-fpm

Configureer PHP 7.3

Controleer nu het PHP-FPM sock bestand en de status van de dienst.

netstat -pl | grep php
systemctl status php-fpm

En je krijgt het resultaat als hieronder.

Configureer PHP-FPM

Als resultaat is de PHP-FPM up and running onder het sock bestand ‘/run/php-fpm/www.sock’.

Stap 4 – Installeer en configureer MariaDB

In deze stap installeren we de MariaDB databaseserver, stellen we de authenticatie van het root wachtwoord in, en maken we een nieuwe database en gebruiker voor Nextcloud.

Installeer de MariaDB databank met het onderstaande dnf commando.

sudo dnf install mariadb mariadb-server

Als de installatie klaar is, start je de MariaDB dienst en voeg je hem toe aan het systeem opstarten.

systemctl start mariadb
systemctl enable mariadb

En de MariaDB dienst is up and running.

MariaDB configureren

Vervolgens stellen we de authenticatie van het root wachtwoord in met het ‘mysql_secure_installation’ commando hieronder.

mysql_secure_installation

Typ je root wachtwoord en typ ‘Y’ voor de restconfiguratie.

Set a root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

En het MariaDB root wachtwoord is ingesteld.

Log nu in op de MySQL shell met het onderstaande mysql commando.

mysql -u root -p
TYPE YOUR ROOT PASSWORD

Maak nu een nieuwe database ‘nextcloud_db’ en maak een nieuwe gebruiker ‘nextclouduser’ met het wachtwoord ‘nextcloudpassdb’ met de onderstaande query’s.

create database nextcloud_db;
create user [email protected] identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to [email protected] identified by 'nextcloudpassdb';
flush privileges;

En je hebt de database en gebruiker voor de Nextcloud installatie aangemaakt.

Stel de Nextcloud database in

Stap 4 – Genereer SSL Letsencrypt

In deze stap genereren we de SSL letsencrypt met de ‘certbot’. De SSL certificaten zullen gebruikt worden om Nextcloud toegang te beveiligen.

Installeer certbot uit de EPEL repository met het onderstaande dnf commando.

sudo dnf install certbot

Als de installatie voltooid is, genereer je de SSL certificaten voor de Nextcloud domeinnaam met het onderstaande commando en zorg ervoor dat je de domeinnaam en het e-mailadres met je eigen adres verandert.

certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io

Als de installatie voltooid is, staan alle gegenereerde SSL certificaten in de map ‘/etc/letsencrypt/live/cloud.hakase-labs.io’.

Controleer het met het volgende commando.

ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/

En je hebt de SSL letsencrypt gegenereerd met het certbot gereedschap.

Stap 5 – Download en installeer Nextcloud

In deze stap downloaden we de nieuwste versie van Nextcloud 17.

Voordat je de broncode van nextcloud downloadt, installeer je het zip pakket op het systeem.

sudo dnf install unzip

Ga nu naar de ‘/var/www/’ directory en download de Nextcloud broncode met het wget commando zoals hieronder.

cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip

Pak de Nextcloud broncode uit met het onderstaande commando.

unzip nextcloud-17.0.2.zip

En je krijgt een nieuwe directory met de naam ‘nextcloud’.

Maak nu een nieuwe ‘data’ map voor Nextcloud. De ‘data’ directory zal gebruikt worden om gebruikersgegevens op te slaan.

mkdir -p /var/www/nextcloud/data/

Verander daarna de eigenaar van de ‘nextcloud’ directory in de ‘nginx’ gebruiker en groep.

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

En je hebt de nieuwste Nextcloud 17 gedownload naar de ‘/var/www’ directory.

Download NextCloud

Stap 6 – Stel Nginx Virtuele Host voor Nextcloud in

Na het downloaden van de Nextcloud broncode, gaan we de Nginx virtuele host voor Nextcloud instellen.

Ga naar de ‘/etc/nginx/conf.d’ directory en maak een nieuwe configuratie ‘nextcloud.conf’.

cd /etc/nginx/conf.d/
vim nextcloud.conf

Verander nu de domeinnaam en het SSL certificaat pad met je eigen en plak er de volgende configuratie in.

upstream php-handler {
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;
}

server {
listen 80;
listen [::]:80;
server_name cloud.hakase-labs.io;
# enforce https
return 301 https://$server_name:443$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.hakase-labs.io;

# Use Mozilla's guidelines for SSL/TLS settings
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
# NOTE: some settings below might be redundant
ssl_certificate /etc/ssl/nginx/fullchain.pem;
ssl_certificate_key /etc/ssl/nginx/privkey.pem;

# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;

# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;

# Path to the root of your installation
root /var/www/nextcloud;

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

# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

# The following rule is only needed for the Social app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}

# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;

# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

# Uncomment if your server is built with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;

location / {
rewrite ^ /index.php;
}

location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
deny all;
}
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
# Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
# Enable pretty urls
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}

location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri/ =404;
index index.php;
}

# Adding the cache control header for js, css and map files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;

# Optional: Don't log access to assets
access_log off;
}

location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
try_files $uri /index.php$request_uri;
# Optional: Don't log access to other assets
access_log off;
}
}

Bewaar en sluit.

Test daarna de nginx configuratie en start de Nginx dienst opnieuw. En controleer of er geen fout optreedt.

nginx -t
systemctl restart nginx

Nu opent de Nginx dienst een nieuwe HTTPS poort op het systeem, controleer dat met het volgende commando.

netstat -plntu

En je krijgt het resultaat zoals hieronder.

Configureer Nginx voor Nextcloud

Het resultaat is dat je de Nginx virtuele host configuratie voor Nextcloud hebt toegevoegd en er de veilige HTTPS bovenop hebt ingeschakeld.

Stap 7 – Stel SELinux in voor Nextcloud

Voor deze zelfstudie gebruiken we SELinux op de ‘enforcing’ modus. En we zullen de SELinux voor Nextcloud installatie instellen.

Installeer het SELinux beheerprogramma met het onderstaande dnf commando.

sudo dnf install policycoreutils-python-utils

Voer nu het volgende commando uit als root op je server.

semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/assets(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'

restorecon -Rv '/var/www/nextcloud/'

En de SELinux configuratie voor Nextcloud is voltooid.

Configureer SELinux voor Nextcloud

Stap 8 – Nextcloud installatiewizard

Open nu je webbrowser en typ je Nextcloud domeinnaam in de adresbalk.

https://cloud.hakase-labs.io/

Nu krijg je de Nextcloud installatiepagina zoals hieronder.

Nextcloud web-installatieprogramma

Typ je admin gebruiker en wachtwoord, kies dan de ‘MySQL/MariaDB’ als je database en typ bovenaan details over de database die je gemaakt hebt.

Klik nu op de ‘Finish Setup’ knop en de installatie begint.

Als de installatie voltooid is, krijg je het Nextcloud dashboard zoals hieronder.

NextCloud op CentOS 8

Het resultaat is dat je met succes de nieuwste Nextcloud 17 met de Nginx webserver, PHP-FPM 7.3, en MariaDB database op de CentOS 8 server hebt geïnstalleerd.

Referentie