WordPress vor Ihrer Nextcloud

WordPress & Nextcloud (nginx Reverse Proxy)

Um WordPress vor Ihrer Nextcloud nutzen zu können und somit Nextcloud in einem Unterverzeichnis
zu betreiben, fungieren wir den Webserver nginx in einen sogenannten Reverse Proxy um.
Wechseln Sie dafür in den privilegierten Benutzermodus, legen das WordPress-Verzeichnis an,
konfigurieren nginx um und installieren WordPress:

sudo -s
sudo -u www-data mkdir -p /var/www/wordpress

Passen Sie nun die NGINX-Konfiguration an:

nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
proxy_headers_hash_bucket_size 128;
server_names_hash_bucket_size 64;
upstream php-handler {
server unix:/run/php/php7.3-fpm.sock;
}
set_real_ip_from 127.0.0.1;
#set_real_ip_from 192.168.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/mime.types;
include /etc/nginx/ssl.conf;
include /etc/nginx/optimization.conf;
#include /etc/nginx/proxy.conf;
#include /etc/nginx/header.conf;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 127.0.0.53 valid=30s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
}

Erzeugen Sie einen neuen virtuellen Host (vhost), der die Anfragen an Ihre Domäne entsprechend verteilt und die SSL Zertifikate verwaltet. Passen Sie die roten Parameter entsprechend Ihre Umgebung an:

nano /etc/nginx/conf.d/gateway.conf
####################################################
# your.dedyn.io extern       port 80/443 http/https
# LetsEncrypt   intern       port 81     http
# WordPress     intern       port 82     http
# Nextcloud     intern       port 83     http
####################################################
server {
 server_name your.dedyn.io;
 listen 80 default_server;
 listen [::]:80 default_server;
 location ^~ /.well-known/acme-challenge {
 proxy_pass http://127.0.0.1:81;
 proxy_set_header Host $host;
 }
 location / {
 return 301 https://$host$request_uri;
 }
 }
server {
 server_name your.dedyn.io;
 listen 443 ssl http2 default_server;
 listen [::]:443 ssl http2 default_server;
 root /var/www/;
 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }
 ### WordPress ###
 location  ^~ / {
 include /etc/nginx/proxy.conf;
 include /etc/nginx/header.conf;
 client_max_body_size 1024M;
 proxy_buffering off;
 proxy_max_temp_file_size 1024M;
 proxy_pass http://127.0.0.1:82;
 proxy_redirect off;
 proxy_request_buffering off;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 send_timeout 3600;
 ### Nextcloud ###
 location ^~ /nextcloud/ {
 include /etc/nginx/proxy.conf;
 include /etc/nginx/header.conf;
 client_max_body_size 10240M;
 send_timeout 3600;
 proxy_buffering off;
 proxy_request_buffering off;
 proxy_max_temp_file_size 10240m;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_pass http://127.0.0.1:83;
 proxy_redirect off;
 }
 location = /.well-known/carddav {
 return 301 $scheme://$host/nextcloud/remote.php/dav;
 }
 location = /.well-known/caldav {
 return 301 $scheme://$host/nextcloud/remote.php/dav;
 }
 location ~ /(ocm-provider|ocs-provider)/ {
 return 301 $scheme://$host/nextcloud/$1/;
 }
 }

Erzeugen Sie die vhost-Datei für WordPress:

nano /etc/nginx/conf.d/wordpress.conf
server {
server_name 127.0.0.1;
listen 127.0.0.1:82;
root /var/www/wordpress/;
location ^~ /{
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ \.php$ {
try_files $uri =404;
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_pass php-handler;
fastcgi_connect_timeout 60;
fastcgi_index index.php;
fastcgi_param REMOTE_ADDR $http_x_real_ip;
}
location ~* /\.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location /wp-admin {
auth_basic "Adminbereich";
auth_basic_user_file /etc/nginx/wordpress-access;
}
location ~* /(?:uploads|files)/.*.(html|htm|shtml|php|js|swf)$ {
deny all;
}
}
}

Kopieren Sie die Originale Nextcloud-Konfiguration und erzeugen eine neue vhost-Datei für Nextcloud:

mv /etc/nginx/conf.d/nextcloud.conf /etc/nginx/conf.d/nextcloud.conf.original  
nano /etc/nginx/conf.d/nextcloud.conf
server {
 listen 127.0.0.1:83;
 server_name 127.0.0.1;
 root /var/www/;
 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }
 location = /.well-known/carddav {
 return 301 $scheme://$host/nextcloud/remote.php/dav;
 }
 location = /.well-known/caldav {
 return 301 $scheme://$host/nextcloud/remote.php/dav;
 }
 client_max_body_size 10240M;
 location /nextcloud/ {
 rewrite ^ /nextcloud/index.php;
 }
 location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
 deny all;
 }
 location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) {
 deny all;
 }
 location ^~ /nextcloud/apps/rainloop/app/data {
 deny all;
 }
 location ~ \.(?:flv|mp4|mov|m4a)$ {
 mp4;
 mp4_buffer_size 100M;
 mp4_max_buffer_size 1024M;
 fastcgi_split_path_info ^(.+?.php)(\/.*|)$;
 set $path_info $fastcgi_path_info;
 try_files $fastcgi_script_name =404;
 include fastcgi_params;
 include php_optimization.conf;
 }
 location ~ ^\/nextcloud/(?: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;
 include php_optimization.conf;
 }
 location ~ ^\/nextcloud/(?:updater|oc[ms]-provider)(?:$|\/) {
 try_files $uri/ =404;
 index index.php;
 }
 location ~ .(?:css|js|woff2?|svg|gif|map|png|html|ttf|ico|jpg|jpeg)$ {
 try_files $uri /nextcloud/index.php$request_uri;
 access_log off;
 expires 360d;
 }
 }

Ihr Webserver ist nun bereits als Reverse Proxy konfiguriert. Härten Sie nun den späteren WordPress-Administrationsbereich durch eine Passwortabfrage ab:

apt install apache2-utils -y

Generieren Sie den Benutzer und das dazugehörige Passwort:

htpasswd -c /etc/nginx/wordpress-access Ihr.Name

Nach einem NGINX Neustart ist der wp-admin Bereich bereits durch ein Passwort geschützt und wird von Fauil2Ban überwacht (nginx-http-auth).

service nginx restart

Laden Sie nun das aktuelle WordPress Release in ein Arbeitsverzeichnis (/usr/local/src) herunter und entpacken es nach /var/www/wordpress:

cd /usr/local/src
wget https://wordpress.org/latest.tar.gz
tar xfvz latest.tar.gz && mv wordpress /var/www/

Setzen Sie die richtigen Berechtigungen:

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

Erzeugen Sie die WordPress Datenbank – ersetzen Sie dabei bitte das Beispielpasswort ‚wordpressDBpassword‚ durch ein von Ihnen frei wählbares Passwort:

mysql -uroot -p
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER wordpress@localhost identified by 'wordpressDBpassword';
GRANT ALL PRIVILEGES on wordpress.* to wordpress@localhost;
flush privileges;
quit;

Erzeugen Sie nun die WordPress Konfigurationsdatei (wp-config.php) mit den Werten Ihrer zukünftigen WordPress-Seite und :

sudo -u www-data nano /var/www/wordpress/wp-config.php
<?php
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
    $_SERVER['HTTPS']='on';
if(isset($_SERVER['HTTP_X_FORWARDED_HOST']))
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
define('WP_HOME', 'https://your.dedyn.io');
define('WP_SITEURL', 'https://your.dedyn.io');
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpressDBpassword');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
define('AUTH_KEY',         'from the url below');
define('SECURE_AUTH_KEY',  'from the url below');
define('LOGGED_IN_KEY',    'from the url below');
define('NONCE_KEY',        'from the url below');
define('AUTH_SALT',        'from the url below');
define('SECURE_AUTH_SALT', 'from the url below');
define('LOGGED_IN_SALT',   'from the url below');
define('NONCE_SALT',       'from the url below');
$table_prefix = 'ncblog_';
define('WP_DEBUG', false);
if ( !defined('ABSPATH') )
 define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');

Um die obigen Werte generieren zu lassen, rufen Sie einfach die nachfolgende URL auf:
https://api.wordpress.org/secret-key/1.1/salt/
und fügen diese 1:1 (anstatt der define … from the url below Zeilen) in die Datei ein.

Richten Sie dann die WordPress-Instanz im Browser ein – rufen Sie dazu die URL
https://your.dedyn.io
auf und folgen dem Wizard wie in den Bildern exemplarisch beschrieben:

Wählen Sie sich nach der Einrichtung in Ihre Nextcloud ein und wechseln in die Admineinstellungen. Dort gehen Sie zu den „Externen Seiten / External Sites“ und tragen die WordPress Instanz ein:

Neuer Eintrag: https://your.dedyn.io

Dadurch erscheint Ihre WordPress Instant innerhalb ihrer Nextcloud als App-Link:

Aus Sicherheitsgründen sollte die wp-config.php aus dem Webverzeichnis verschoben werden. Erzeugen SIe dafür eine neue new wp-config.php, die auf die verschobene Datei ausserhalb des Webverzeichnisses verweist:

cd /var/www/wordpress
mv wp-config.php /etc/nginx
nano wp-config.php

Tragen Sie diese Zeilen in die leere Datei ein:

<?php
include('/etc/nginx/wp-config.php');

Setzen Sie die notwendigen Berechtigungen:

chown www-data:www-data /etc/nginx/wp-config.php /var/www/wordpress/wp-config.php
chmod 400 /var/www/wordpress/wp-config.php

Zu guter letzt härten Sie WordPress noch durch das PlugIn GoogleAuthenticator:

Hinweis:
Google Authenticator von Ivan Kruchkoff

Aktivieren Sie dieses Plugin und richten Ihren 2. Faktor für WordPress ein:

Hinweis:
Vergessen Sie nicht den abschließenden Slash beim Aufruf der wp-admin-Seite:
https://your.dedyn.io/wp-admin/
Die Seite bleibt sonst leer/blank!

Es wird dringend empfohlen sich einen dedizierten udn neuen Administrator einzurichten, sich mit diesem anzumelden und den 2. Faktor zu aktivieren:

Der Standard-Administrator sollte im Anschluß deaktiviert oder entfernt werden!

Glückwunsch, das war es schon! Über eine Spende würden sich meine Frau, meine Zwillinge und ich sehr freuen!

© Carsten Rieger IT-Services

Carsten Rieger

Carsten Rieger ist ein angestellter Senior IT-Systemengineer und zudem auch als Kleinunternehmer (Freelancer) aktiv. Er arbeitet seit mehr als 15 Jahren im Linux- und Microsoftumfeld, ist ein Open Source Enthusiast und hoch motiviert, Linux Installationen und Troubleshooting durchzuführen. Dabei arbeitet er vorrangig mit Debian und Ubuntu Linux, Nginx und Apache Webservern, MariaDB/MySQL/PostgreSQL, PHP, Cloud Infrastrukturen (bspw. Nextcloud) und auch vielen anderen Open Source Projekten (bspw. Roundcube). Zudem engagiert er sich ehrenamtlich für die Dr. Michael & Angela Jacobi Stiftung - und das schon seit mehr als 7 Jahren.