Installatie webserver (2018)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Dit artikel is geschreven nav. de installatie van een TransIP-VPS in de lente van 2018. Daarnaast bevat het vrijwel alle informatie omtrent eerdere installaties, in zoverre die nu nog relevant is.

  • De betreffende VPS is een LAMP-webserver met virtuele hosts. Er wordt geen email gehost
  • Primaire handleiding: https://www.linode.com/docs/getting-started#ubuntu--debian-1
  • Deze handleiding kan lineair doorlopen worden, maar ik vond het handiger om het als referentie te gebruiken. Bv. eerst een basis-Apache-server, gevolgd door MySQL en PHP, en daarna pas diverse finishing touches, waaronder diverse Apache-instellingen.

Basis-installatie

Systeemeisen

Configuratie:

  • 4GB geheugen
  • 2 XEON-processors

Zo ver ik kan nagaan, is dat voldoende voor deze toepassing. Wat gebeugen betreft: Deze handleiding geeft aan dat je de configuratie van Apache moet aanpassen als 1GB of 2GB geheugen hebt. Daarboven wordt niet genoemd, plus dat ik de huidige servers met free -g de indruk heb, dat 4GB meer dan genoeg is.

OS

Software selection: Alleen Ubuntu Basic Server (experimenteel). Ik doe zo veel mogelijk handmatig
  • Operating system: Ubuntu 18.04 - Net een dag uit!
  • Installatietaal: Engels
  • Location: Europe » Netherlands
  • Locales: De keuze voor Engels in combinatie met Nederland, levert een probleem op: Er is geen combinatie bekend van Engels + Nederland. Oplossing: en_US.utf8. Zie ook Locale verderop in dit hoofdstuk
  • Keyboard-configuratie: Handmatig: Country of origin: English (US) » English (US) - English (US, euro on 5) - Nogal irrelevant, want dit is een server zonder eigen toetsenbord
  • Hostname: Deze wordt gevraagd tijdens installatie. Later kun je deze aanpassen middels sudo vim /etc/hostname. Bekijk je hostname middels hostname
  • Geen HTTP proxy-server
  • Gebruikers-accounts: Vermoedelijk zullen meerdere mensen deze server bedienen en onderhouden. Waarschijnlijk zullen ze dat allemaal vanuit een eigen account-met-admin-rechten doen
  • Partitionering: Guided - use entire disk
  • Install security updates automatically: Voor de eerste keer dit geactiveerd: Problemen die ontstaan door zero-day hacks zouden voor mij veel moeilijker zijn om op te lossen, dan eventuele problemen die onstaan door fouten met updates. Plus dat ik nog nooit heb meegemaakt dat ik een update weiger, omdat ik de inhoud niet vertrouw. Zie ook [1][2]
  • Software selection: Alleen Ubuntu Basic Server. Zie afbeelding
  • Installatie Grub (uiteraard).

SSH-toegang

Zie SSH

Hosts-file-alias aanmaken

Ik refereer liever aan een computer met een code dan met een IP-nummer. Daarom op m'n werkstation aan bestand /etc/hosts een regel toevoegen zoals

148.210.167.215 dvb2

Nu kan ik inloggen met alleen

ssh dvb2

omdat de inlognaam op m'n werkstation hetzelfde is als op deze server.

Inlog-alias aanmaken

Maar het kan nóg mooier, met deze toevoeging aan .bashrc:

alias dvb2="ssh dvb2"

SSH key pair-authenticatie

In plaats van in te loggen met een inlognaam en wachtwoord, wil ik gebruik maken van key pair authentication. Implementatie:

Sleutelpaar aanmaken

Indien je nog geen SSH-sleutelpaar hebt: Maak deze op je werkstation aan middels ssh-keygen. Deze sleutels staan in de map ~/.ssh, met:

  • id_rsa - Privésleutel
  • id_rsa.pub - Publieke sleutel.

Publieke sleutel uploaden

Eenvoudig:

ssh-copy-id example_user@203.0.113.10

SSHd configureren

Toegevoegd aan /etc/ssh/sshd_config:

# Strompf - April 2018
#################################
#
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

en daarna sshd herstart middels

sudo service ssh restart

Test

Login middels

ssh inlognaam@ip-adres

of middels de eerder gedefineerde alias:

dvb2

Locale bijwerken

Time-zone instellen

[3]:

Specificeer de timezone met deze routine:

sudo dpkg-reconfigure tzdata

Controleer het resultaat:

date

Firewall

In het verleden gebruikte ik UFW, en dat blijkt nog altijd een prima keuze te zijn. Je installeert 'm middels [4]:

sudo apt-get install ufw

en hij bleek al geïnstalleerd te zijn.

Configuratie

  • Al het uitgaande verkeer is toegestaan
  • Alleen specifiek inkomend verkeer is toegestaan
  • Dit betreft een webserver, dus inkomend verkeer op poort 80 moeten open staan
  • Geen mailserver
  • Websites functionereen regelmatig als SMTP-client, maar daarvoor hoeft er niet geconfigureerd te worden qua binnenkomend verkeer.

Ik vermoed dat dit een aardige configuratie is:

sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow 22/tcp              # ssh
sudo ufw allow 80/tcp              # http
sudo ufw enable

Test

sudo ufw status geeft:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)          

Merk op

  • De regels worden automatisch voor ipv4 en ipv6 toegevoegd
  • Ik kan nog steeds inloggen via ssh :)

IPv6 addresses & binding

Standaard krijg ik 2^64 IP-adressen bij een VPS. Via DHCP wordt daarvan echter maar eentje toegewezen aan de VPS. Op Ubuntu 18.04 gaat de configuratie van netwerkinterfaces mbv. YAML. Ik heb het vermoeden dat dit script de complete reeks associëert met de VPS:

network:
        version: 2
        renderer: networkd
        ethernets:
                ens3:
                        dhcp4: yes
                        dhcp6: no
                        addresses: ['2a01:7c8:aab3:2aa::/64']
                        gateway6: 2a01:7c8:aab3::1

Bronnen: [5] & [6]

Eigen scripts

  • Eigen scripts plaats ik in /usr/local/bin. Deze map hoeft niet schrijfbaar voor mij te zijn. De script-bestanden moeten uiteraard wel executeerbaar zijn. Zie installatie Drush als voorbeeld. /usr/local/bin is doorgaans al opgenomen in $PATH. Scripts liever niet in submappen onderbrengen ivm. gedoe met $PATH
  • Op een dag hoop ik hier Git voor te gebruiken.

sudo timeout

Zie Sudo voor het aanpassen van de sudo timeout - Graag!

su

Ehm, su activeer ik toch maar niet op servers. Voor achtergrondinfo: Su.

Eigen inmappen

Gebruik ik als tijdelijke locaties voor heen- en weerfietsen van data naar en van de server:

mkdir ~/in1
mkdir ~/in2

Backup-time!

Zo vlak voor het installeren van Apache, is een mooi moment om via de TransIP-console een snapshot te maken.

Apache

  • Dit betreft een installatie met virtuele hosts
  • Websites worden geserveerd vanuit /var/www. Da's weinig schokkend, want het is één van de standaardlocaties. Standaardinstellingen voor deze locatie vind je in het Apache configuratiebestand (/etc/apache2/apache2.conf, zie ook verderop). Daarnaast kun je per virtuele host de locatie + instellingen opgeven
  • Deze map + submappen moet voor mij leesbaar en schrijfbaar zijn: Ik word helemaal tureluurs als ik eindeloos met wachtwoorden moet stoeien
  • Eén centraal logbestand. Géén aparte logbestanden of -mappen per domein!

Installatie

  • 'Handmatige' installatie ipv. gebruik Tasksel
  • Installatie Apache: sudo apt-get install apache2

Configuratie - apache2.conf

Alle aanpassingen stop ik in één stuk dat ik toevoeg aan /etc/apache2/apache2.conf. Eerdere verwijzingen in dit bestand verwijder ik:

###########################################################################################
# Strompf - All changes in one place
###########################################################################################
#
# ServerName
################################
#
# * Gebruik het adres van een domeinnaam die daadwerkelijk gehost wordt op deze server.
#   Zo snel ik zo'n domeinnaam heb: hier invullen!
# * Alternatief: Gebruik de TransIP-servernaam. Die zie je met apachectl -S
# * http://wiki.devliegendebrigade.nl/Could_not_reliably_determine_..._domain_name_(Apache)
# 
# Voorbeeld:
#
# ServerName example.com

# Make directories non-browseable
#################################
#
# * Important!
# * http://wiki.devliegendebrigade.nl/Apache_-_Mappen_niet_browsable_maken
#
<Directory /var/www/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

# KeepAlive Directive
#####################
#
# Actually already active by default
#
# See also: 
#
# * https://httpd.apache.org/docs/2.4/mod/core.html#keepalive and
# * https://www.linode.com/docs/web-servers/lamp/install-lamp-stack-on-ubuntu-16-04/
# * http://wiki.devliegendebrigade.nl/Installatie_webserver#Apache
#
KeepAlive on
MaxKeepAliveRequests 50
KeepAliveTimeout 5

Configuratie - mpm_prefork.conf

Toegevoegd aan mods-available/mpm_prefork.conf [7]:

# Strompf - April 2018
##########################################################
#
# * Optimized for 4GB internal memory
# * Source: https://www.linode.com/docs/web-servers/lamp/install-lamp-stack-on-ubuntu-16-04/
#
<IfModule mpm_prefork_module>
        StartServers            8
        MinSpareServers         6
        MaxSpareServers         40
        MaxRequestWorkers       200
        MaxConnectionsPerChild  10000
</IfModule>

Configuratie - Modules aan- & uitzetten

[8] + eigen toevoegingen

sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo a2enmod rewrite

sudo systemctl restart apache2

Firewall bijwerken

Na bijwerken van de firewall en installie Lynx: De standaard vangpagina van Apache doet 't op de server zelf...
...En ook vanaf m'n werkstation

Digital Ocean behandelt hier nog effe ufw. Interessant.

Bekijk de ufw app list met sudo ufw app list. Ik krijg

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Bekijk de inhoud van Apache Full met sudo ufw app info "Apache Full". Output:

Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.

Ports:
  80,443/tcp

Voeg de regels uit dit profiel toe aan ufw: sudo ufw allow in "Apache Full". Ik vermoed dat dit effectief al het geval was, maar het geeft een goed gevoel voor de materie. De nieuwe status van ufw (sudo ufw status) wordt hiermee:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)      

MySQL

Installatie

Als vanouds:

sudo apt install mysql-server

Zie Versies (MySQL) als je je afvraagt of je dan wel een voldoende moderne versie krijgt.

Configuratie

  • Doorloop het security hardening script (sudo mysql_secure_installation) - Spreekt voor zich
  • Problemen met inloggen na een verse installatie? Probeer sudo mysql. BTW: De root-loginnaam is echt root. Zie verder Gebruikers & inloggen (MySQL)
  • Maak een gewoon MySQL-account aan Gebruikers & inloggen
  • Geen zin om steeds je wachtwoord in te tikken? Daar is een hele goede oplossing voor.

PHP

Impressie van de PHP-onderdelen die nog missen voor een Drupal 7-site op een webserver die vers is geïnstalleerd (lente 2018)

Backup!

Installatie PHP is lastiger dan de onderdelen hiervoor. Daarom is dit een uitgelezen moment om een backup te maken. Sterker nog: tijdens het doorlopen van deze procedure in de lente van 2018, besloot ik om twee servers te deployen. Eén met PHP 5.6 en één met PHP 7.2. Daardoor kwam het héél handig uit, dat ik net een backup had gemaakt (TransIP snapshot om precies te zijn).

Compatibiliteitsproblemen

Drupal 7-sites kunnen niet zondermeer overweg met PHP 7.2: Tijdens een snelle test (lente 2018) kreeg ik fatal errors. Vermoedelijk zouden de betreffende modules gepatached moeten worden. Daar zit ik niet op te wachten. Ik verwacht dat dit voor Drupal 6-sites nog erger is.

Twee voorbeelden van waarschuwingen die ik kreeg van een Drupal 7-site ivm. PHP 7.2 - Dit was nog vóórdat ik fatal errors kreeg:

  • Warning: count(): Parameter must be an array or an object that implements Countable in FacetapiDependencyFacet->getDefaultSettings() (regel 139 van /var/www/example.com/sites/all/modules/facetapi_bonus/plugins/facetapi/dependency_facet.inc)
  • PHP Fatal error: Declaration of RulesRuleUI::form(&$form, &$form_state, $options = Array) must be compatible with RulesActionContainerUI::form(&$form, &$form_state, $options = Array, $iterator = NULL) in /var/www/example.com/sites/all/modules/rules/ui/ui.plugins.inc on line 0

Oplossing:

  • Twee aparte VPS'en gebruiken: Eén met PHP 5.6 en één met PHP 7.2
  • Niet relevant om te hobbyen met tussenliggende PHP-versies (7.0 & 7.1).

PHP 5.6 - Installatie

PHP 5.6 kun je niet zondermeer installeren op actuele versies van Ubuntu. Dat kan wel als je gebruik maakt van onderstaande PPA's van ondrej [9]:

sudo add-apt-repository ppa:ondrej/php
sudo add-apt-repository ppa:ondrej/apache2

sudo apt install php5.6
sudo apt install libapache2-mod-php5.6
sudo apt install php5.6-mysql
sudo apt install php5.6-curl
sudo apt install php5.6-xml
sudo apt install php5.6-gd
sudo apt install php5.6-mbstring

Vergeet niet naderhand om Apache te herstarten:

systemctl reload apache2

PHP 7.2 - Installatie

In de lente van 2018 op Ubuntu 18.04, werd automatisch PHP 7.2 gekozen, als ik de betreffende onderdelen insalleerde zonder versienummers mee te geven:

sudo apt install php libapache2-mod-php php-mysql php-curl php-xml php-gd php-mbstring

Overig

Let's Encrypt

Werkt super! zie Let's Encrypt voor details.

Drush

Installeer drush- De Drupal Shell in /usr/local/bin. Zie Drush 8 installatie voor details.

wp-cli

Installeer de Wordpress Command Line Interface in /usr/local/bin.Zie WP-CLI (algemeen) voor details.

In gebruik

  • Sites worden geserveerd vanuit /var/www/.

Virtual host-bestand

Inclusief uitleg:

<VirtualHost *:80>

ServerName example.com

# ServerAlias
####################################################
#
# Also handy for redirecting websites to another URL
#
ServerAlias www.example.com

# DirectoryIndex
####################################################
#
# Prevent folders from being browsable by visitors
#
DirectoryIndex index.php index.html
DocumentRoot /var/www/example.com

<Directory /var/www/example.com>

   AllowOverride All
   Require all granted
   RewriteEngine on
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

</Directory>

# About logs
####################################################
#
# * Use 2 central logs. Don't use separate logs for
#   each virtual hosts: Very inconvenient!
#
LogLevel warn
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log vhost_combined

</VirtualHost>

Zie ook

Bronnen

Primaire bronnen

Installatie OS

Fail2Ban

PHP