Visualiser une révision

[Tuto/HowTo] [Debian/Ubuntu] Créer manuellement un Cluster Web

voxdemonix : révision n°20 (26 novembre 2018 21:25:59)

**Difficulté de ce tutoriel :** Bidouilleur confirmé n'ayant pas peur de la ligne de commande.

![Alice upload une musique sur son Nextcloud.](https://www.0rion.netlib.re/forum4/download/file.php?id=1077)


Introduction
============

Un cluster est un ensemble d'ordinateurs physique travaillant pour une tâche commune, augmentant ainsi la puissance de calcul et évitant la fin de service lorsque l'une d'elles tombe en panne.
Le désavantage est un coûts en énergie, en consommation réseau et en ressources machines. Ainsi dans le cas présent, par exemple, syncthing devra vérifier très régulièrement les modifications des fichiers du serveur web, et partager toutes modifications avec les autres membres de la grappe.
Chaque Frontend devra aussi, et de façon régulière, vérifier la présence en ligne de tout les nœuds se qui a aussi un couts.
Ainsi pour un unique utilisateur n'ayant pas besoin d'une forte puissance de calcul ni de Haut Disponibilité, le cluster gaspillera beaucoup plus d'énergie qu'un serveur fonctionnant de manière esseulé.
L'utilisation d'un Cluster n'est requise que si vous avez besoin de Haute Disponibilité (Hight Availability) et/ou de scalabilité (adapter la puissance machine en fonction de la demande).
**Note :** Je pars du principe que vous avez déjà un serveur de base de données installé sur une autre machine.
**Note de la rédaction :** L'automatisation sera traitée dans un autre article [[lien_temporaire_en_attendant](https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=816&p=1903#p1906)]


Logiciels utilisés : 
-----------

* [PHP](https://fr.wikipedia.org/wiki/PHP)
* [apache2](https://doc.ubuntu-fr.org/apache2) ([serveur web](https://fr.wikipedia.org/wiki/Serveur_web))
* [syncthing](https://fr.wikipedia.org/wiki/Syncthing) (synchronisation fichiers via [F2F](https://fr.wikipedia.org/wiki/F2F))

Installer un Node
=================

Les Nœuds ou Node en anglais d'un cluster web sont des serveurs web recevant des requêtes HTTP(s), exécutant des scripts et émettant des réponses.

1. Installer les pré-requis :
**Note :** ici on installe se qui est généralement pré-requis pour les [CMS](https://fr.wikipedia.org/wiki/Content_management_system), certains paquets pourraient donc vous être inutile 

```
( apt update ; apt-get install -y apache2 php php-fpm php-gd php-curl php-mysql openssl php-redis libapache2-mod-php php-mbstring php-zip php-dom php-ldap php-apcu libapache2-mod-rpaf php-imagick php-dev libsystemd-dev ; a2enmod headers rewrite rpaf ssl env dir mime cgi )
```

1. Installez et configurez syncthing en suivant le tuto : [Partager le dossier /var/www/html entre vos différents serveur web apache2 (via syncthing)](https://linuxfr.org/wiki/tuto-howto-partager-le-dossier-var-www-entre-vos-differents-serveur-web-apache2-via-syncthing) ([src](https://www.0rion.netlib.re/forum4/viewtopic.php?f=107&t=661&p=1603#p1603))

1. Configurez les permissions de _www-data_ et _apache2_ :

 *  Ajoutez la ligne _umask 0007_ à la fin de _/etc/apache2/envvars_

```
echo "umask 0007" >> /etc/apache2/envvars
```

 *  Ajoutez la ligne _umask 0007_ au début de _/etc/init.d/apache2_ juste après _### END INIT INFO_

```
sudo nano /etc/init.d/apache2
```


 *  Ajoutez la ligne _umask 0007_ à la fin de _/etc/profile_
**Note :** ces changements ne seront pris en compte qu'après redémarrage de la session de chaque utilisateurs (dans le cas de www-data => après reboot)

```
echo "umask 0007" >> /etc/profile
```

1. Placez vos vhsot apache2 dans _/etc/apache2/sites-available/_ et activez les via 

```
a2ensite chacun_de_vos_fichiers.conf
```

1. Redémarrez la machine

```
( systemctl daemon-reload ; reboot )
```

##Sécurisation##

Les serveurs peuvent fournir des informations compromettantes via divers outils de diagnostiques/maintenance incorporé. On citera entre-autre [server-status](http://www.blog.florian-bogey.fr/activer-et-configurer-le-server-status-apache-mod_status.html) d'apache2 ([exemple](https://www.0rion.netlib.re/forum4/download/file.php?id=79)) qui ouvre un trou de sécurité. Ces informations sont utilisées par les pirates et agences malveillantes afin de dés-anonymiser des serveurs, en vue de les référencer avant d'éventuelles attaques. Il est fortement conseillé de supprimer l'accès à ses informations.

###**Faire taire [server-status](http://www.blog.florian-bogey.fr/activer-et-configurer-le-server-status-apache-mod_status.html) d'apache2 :###**

```
sudo a2dismod status
sudo service apache2 restart
```

  * Entrez ensuite l'[hostname](https://fr.wikipedia.org/wiki/Nom_d%27h%C3%B4te) de votre web service suivis de /server-status. Le serveur doit vous retourner une erreur 404 page not found.


###**Faire taire [serverTokens](https://httpd.apache.org/docs/2.2/fr/mod/core.html#servertokens) :###**
**Ajoutez dans _/etc/apache2/apache2.conf_**

```
ServerTokens Prod
```

###**Faire taire [ServerSignature](https://httpd.apache.org/docs/2.2/fr/mod/core.html#serversignature) :###**
**Ajoutez dans _/etc/apache2/apache2.conf_**

```
ServerSignature Off
```

Partager un dossier sur un Stockage Distant (Remote Storage)
============================================================

Coté serveur
------------

1. Si plusieurs utilisateurs systèmes vont utiliser le dossier, adaptez le umask des utilisateurs ssh
 * Éditez _/etc/ssh/sshd_config _

```
sudo nano /etc/ssh/sshd_config
```

 * Cherchez (_CTRL+W_) "_Subsystem sftp /usr/lib/openssh/sftp-server_" et ajoutez -u 007 à la ligne comme suit :

```
Subsystem sftp /usr/lib/openssh/sftp-server -u 007
```

1. Ajoutez _umask 0007_ dans _/etc/profile_ et dans _/home/userCommunSFTP/.profile_ (adaptez le dernier path au nom de votre ou vos utilisateurs)

1. Redémarrez le serveur openssh

```
sudo service sshd restart
```

1.  Si vous (ré-)installez le serveur alors à ce stade sur tout les clients qui utilisent votre serveur, démontez puis remontez le(s) stockage(s) SSHSF.

Coté client
-----------

1. Effectuer un montage SSHFS : [[Tuto/HowTo] Configurer et monter SSHFS sécurisé via utilisateur dédié côté server](https://www.0rion.netlib.re/forum4/viewtopic.php?f=106&t=339&p=847#p847)

1. Une fois monté, accorder les permissions sur le dossier.

```
chmod 7760 -R /media/mon_storage
```

Installer un Frontend
=====================

Les frontends sont chargé de recevoir les requêtes des clients et de les transmettre aux serveurs web (dit Backends) le moins occupé. Ce sont des proxys (intermédiaires) qui servent de porte d'accès entre "Internet" et votre cluster.

1. Mettez en place HaProxy : [[Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy](https://www.0rion.netlib.re/forum4/viewtopic.php?f=113&t=684)

1. Insérez chacun de vos Nodes dans votre ou vos sections _Backends_ de HaProxy. Voici un exemple de config simplifiée ( _/etc/haproxy/haproxy.cfg_ ) avec 2 _Frontends_ et un _Backend_ :

```
global
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon
	max-spread-checks 100	# delais du premier health check (si non attends le delais pour chaque)

	# Default SSL material locations
#	ca-base /etc/ssl/certs
#	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3
	tune.ssl.default-dh-param 2048

defaults
	log	global
	option	httplog
	option	dontlognull
        timeout connect 15000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http


listen stats
	bind *:1936
	mode http
	stats enable
	stats uri /
	stats hide-version
	stats auth your_user:your_password

frontend Frontend_Tor_HTTP
        bind 127.0.0.1:81
        tcp-request inspect-delay 5s
        mode http
        option httpclose
        option forwardfor
        reqadd X-Forwarded-Proto:\ http
	http-response set-header Referrer-Policy no-referrer # use no-referer or same-origin ;  check https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin
#        default_backend grappe_cluster_web

                # www.mon_premier_domaine.com via tor
        acl host_tor_www.mon_premier_domaine.com hdr(host) -i blablablablabla.onion
        use_backend grappe_cluster_web if host_tor_www.mon_premier_domaine.com

frontend Frontend_HTTP
	bind *:80 v4v6
	bind *:443 v4v6 ssl crt /etc/haproxy/certs/www.mon_premier_domaine.com.pem crt /etc/haproxy/certs/www.mon_second_domaine.com.pem crt /etc/haproxy/certs/www.mon_troisieme_domaine.com.pem
        tcp-request inspect-delay 2s
	mode http
	option httpclose
	option forwardfor
	reqadd X-Forwarded-Proto:\ https
	http-response set-header Referrer-Policy no-referrer # use no-referer or same-origin ;  check https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin
		# gestion des logs
#	log /dev/log local0 info
#	http-request add-header X-CLIENT-IP %[src]
 		# Décommentez la ligne suivante si vous souhaitez renvoyer vers un backend quand un client joint un domaine inexistant.
#	default_backend grappe_cluster_web
        # Define hosts
	acl host_www.mon_premier_domaine.com hdr(host) -i www.mon_premier_domaine.com
        use_backend grappe_cluster_web if host_www.mon_premier_domaine.com



backend grappe_cluster_web
        mode http
        balance leastconn
	option allbackups
	http-request add-header X-Forwarded-Proto https if { ssl_fc }
        option forwardfor
	http-check expect ! rstatus ^5
        option httpchk GET http://www.mon_premier_domaine.com/haproxytest.php HTTP/1.0
        cookie SERVERID insert indirect nocache
	default-server inter 10s fastinter 500 fall 2 rise 2
                #on force https
	acl http      ssl_fc,not
	http-request redirect scheme https if http


                # une machine qu'on joint en http (conseillé sur réseau deja chiffre)
	server Machine1.http Machine1.VPN:80 weight 1 check cookie Machine1.VPN

                # une machine qu'on joint en https SANS vérification du certificats TLS (désonseillé)
	server Machine1.https.SANS.verif Machine1.COM:443 weight 1 check cookie Machine1 ssl verify none

                # une machine qu'on joint en https AVEC vérification du certificats TLS (conseillé si non vpn)
        server Machine1.https.AVEC.verif Machine1.COM:443 weight 2 check cookie Machine1 ssl verify required ca-file /etc/haproxy/certs_ssl_backend/ssl-cert-Machine1.pem

                # une seconde machine type
	server Machine2 Machine2:443 weight 2 check cookie Machine2 ssl verify required ca-file /etc/haproxy/certs_ssl_backend/ssl-cert-Machine2.pem
	server Machine2.VPN Machine2.VPN:80 weight 1 check cookie Machine2.VPN backup
```


Screenshots
===========


Photos
======


Farm Link
=========

* [[Tuto/HowTo] [Debian/Ubuntu] Créer un Cluster Web](https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=816) (article originale)
* [[Tuto/HowTo] Configurer et monter SSHFS sécurisé via utilisateur dédié côté server](https://www.0rion.netlib.re/forum4/viewtopic.php?f=106&t=339&p=847)
* [[Tuto/HowTo] [GNU/Linux] Load Balancing - redirection vers plusieurs vhost avec HaProxy](https://linuxfr.org/forums/linux-general/posts/tuto-howto-ubuntu-debian-load-balancing-redirection-vers-plusieurs-vhost-avec-haproxy)
* [[Tuto/HowTo] Ajouter des Tor Hidden Service a vos frontends HaProxy](https://linuxfr.org/wiki/tuto-howto-ajouter-des-tor-hidden-service-a-vos-frontends-haproxy)
* [[script] Mettre à jours les certificats TLS Let's Encrypt sur un frontend HaProxy/Apache2](https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=734)
* [Partager le dossier /var/www/html entre vos différents serveur web apache2](https://linuxfr.org/wiki/tuto-howto-partager-le-dossier-var-www-entre-vos-differents-serveur-web-apache2-via-syncthing)
* [Présentation et installation de l'Odroid XU4](https://linuxfr.org/wiki/presentation-odroid-xu4-et-installation-ubuntu-16-04)
* [Documentation - Starting Syncthing Automatically](https://docs.syncthing.net/users/autostart.html)