Hej världen!

Att det ska vara så jobbigt.

Jag har nu, peppar, peppar, ta i trä, äntligen lyckats med att få till WordPress multisite bakom Nginx Reverse Proxy med fungerande subdomäner och tillhörande certifikat. Tidigare försök har lett till långa svarstider och timeouts, vilket nästan fick mig att ge upp idén. Men så idag djupdök jag ännu en gång i vansinnet och började med lite terminal-fu.

Under tidigare försök har jag installerat pluginnen Fastest Cache, vilket har tillfredsställt WordPress rekommendation att nyttja sid- och objektcachening, allt i en och samma plugin. Problemet med detta är att den lägger in en hel del omdirigeringar i .htaccess och jag misstänker att detta ledde till den långa svarstiderna på sidor och API.

Och eftersom det säkert finns fler som behöver en sådan här uppsättning, så tänkte jag dela med mig av mina inställningar.

Först och främst behöver vi en Nginx-konfiguration för den domän/subdomän som skall nås, denna kommer även att förse sidorna med deras certifikat:

server {
server_name chuggybumba.com;

listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/chuggybumba.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chuggybumba.com/privkey.pem;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://[INTERN IP-ADRESS]:443/;
}
}

server {
if ($host = chuggybumba.com) {
return 301 https://$host$request_uri;
}

server_name chuggybumba.com;
listen 80;
return 404;
}

Som ni ser, så är LetsEncrypt redan konfigurerat här. För att enklast komma igång med LetsEncrypt med denna konfiguration, sätt upp en virtual host som endast lyssnar på port 80, och låt sedan CertBot ta hand om konfigureringen. När den är klar, justera med ovan inställningar. Notera att det är absolut viktigt att ha en slash ( / ) efter portnumret i proxy_pass kommandot!

Vi kör proxy direkt mot port 443 på den interna servern, detta för att WordPress API ska leka snällt och inte behöva genomgå en massa omdirigeringar.

Nästa konfiguration är den lokala Apache-servern (men kan lika gärna vara Nginx här också, men jag kör på WordPress rekommenderade installation, så Apache it is!)

<VirtualHost *:443>
ServerAdmin admin@chuggybumba.com

ServerName chuggybumba.com
DocumentRoot /var/www/wordpress

SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

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

<Directory /var/www/wordpress>
Options FollowSymLinks
AllowOverride Limit Options FileInfo
DirectoryIndex index.php
Require all granted
</Directory>

<Directory /var/www/wordpress/wp-content>
Options FollowSymLinks
Require all granted
</Directory>
</VirtualHost>

I Apache-konfigurationen behöver vi inte sätta upp några subdomäns-virtualhosts, eftersom dessa sköts av reverse-proxyn på Nginx-maskinen. Inte heller behöver vi nyttja något giltigt certifikat, utan här har vi installerat ett snake-oil-cert så att vi kan leverera krypterad trafik till reverse-proxyn.

Efter detta är det bara att installera multisite-konfiguration enligt WordPress egna instruktioner.

När allt är uppe och rullar, se till att inte nyttja plugins som lägger till egna omdirigeringar i .htaccess, som t.ex. Fastest Cache, då detta bara kommer leda till tårar. Istället rekommenderar jag att man installerar WP Super Cache för sidcachening och Memcached för objektcache-lagring.