
Aujourd’hui, je dois migrer mon site (hébergé chez 1&1) vers un VPS Cloud SSD chez OVH… car autant profiter des avantages du Cloud 🙂
Le “truc”, c’est que dans l’offre VPS Cloud d’#OVH, je me retrouve avec un système “nu”. Ceci dit & comme d’habitude, OVH fait les choses bien et me propose tout un tas d’OS : centos, fedora, debian…
Premier travail : choix de l’OS et installation. Perso, je pars sur un CentOs 7 par habitude.
OVH me propose d’installer lui-même ma clé SSH si je lui indique dans Mon Compte… allez, chouette, à bas les mots de passe 🙂
Ensuite, pour migrer mon site, je pars sur :
- nginx
- mariadb (fork de MySQL)
- php-fpm (FastCGI Process Manager) : permet d’invoquer PHP en mode multi-threadé
Installation de MariaDB
Alors me direz-vous: “Mais pourquoi prendre du MariaDB plutôt que de MySQL ?”
Parce que c’est passé dans le domaine open-source et que j’ai eu quelques mésaventure avec MySQL (souci de clés étrangères/primary key désynchronisées… ouaip, on le rencontre pas tous les jours, faut une certaine charge sur le serveur). Après, j’aime bien ce qu’ils font avec le clustering.
Donc, commençons par installer le package MariaDB :
[code lang=”bash”]yum install mariadb-server[/code]Puis, il va falloir définir le mot de passe “root”
[code lang=”bash”]/usr/bin/mysql_secure_installationNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we’ll need the current
password for the root user. If you’ve just installed MariaDB, and
you haven’t set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on…
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
… Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] Y
… Success!
Normally, root should only be allowed to connect from ‘localhost’. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] Y
… Success!
By default, MariaDB comes with a database named ‘test’ that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
– Dropping test database…
… Success!
– Removing privileges on test database…
… Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
… Success!
Cleaning up…
All done! If you’ve completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
[/code]Voilà, MariaDB est disponible. On peut, si on le souhaite installer un phpMyAdmin pour administrer la base à distance (perso, je préfère la ligne de commandes).
Installation de nginx
Maintenant, il s’agit de mettre en place le serveur web. Alors là encore, on pourra me demander pourquoi nginx plutôt que apache ?! Parce que je le trouve plus léger, même si j’aime beaucoup apache !
[code lang=”bash”]yum install nginx[/code]Puis on le lance :
[code lang=”bash”]systemctl start nginx[/code]Petite vérification du bon fonctionnement :
[code lang=”bash”]netstat -nla | grep :80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
[/code]
A ce niveau, on peut servir du HTML, du CSS et du jpg, png… ouais, enfin moi ce qui m’intéresse, c’est de servir du php !
Installation de php-fpm
Le plus élégant pour lier php avec nginx est de passer par un “serveur” php. En gros, on va lancer un processus interne multithreadé qui va prendre un script, l’exécuter et renvoyer le résultat à l’appelant.
Ce “serveur” s’appelle php-fpm.
[code lang=”bash”]yum install php-fpm php-mysql[/code]On va devoir quelques petites modifications à la conf de PHP
[code lang=”bash”]vi /etc/php.ini[/code]Faut trouver la ligne cgi.fix_pathinfo=1 et mettre 0 à la place du 1 :
[code lang=”bash”]cgi.fix_pathinfo=0[/code]A quoi ça sert ce changement ? Et bien si on garde la valeur à 1, l’interpréteur PHP va essayer de “faire de son mieux” pour résoudre le chemin du script à exécuter… ouaip, beh ça veut dire que potentiellement, on pourrait exécuter un autre script et donc ouvrir une potentielle faille.
Donc on le passe à 0 pour lui dire de prendre exactement le path qu’on va lui passer.
Maintenant, on va indiquer à notre serveur nginx qu’il faut “parler” avec php-fpm pour interprêter du PHP.
Déjà, on met en place un upstream pour faciliter la conf. Pour cela, on crée un fichier php-fpm.conf dans le répertoire conf.d de nginx :
[code lang=”bash”]upstream php-fpm-sock{server unix:/var/run/php-fpm/php-fpm.sock;
}[/code]
Puis, on le lie dans la conf par défaut :
[code lang=”bash”]vi /etc/nginx/nginx.conf[/code]J’ajoute ça dans la section server :
[code lang=”bash”] location ~\.php$ {try_files $uri =404;
fastcgi_split_path_info ^(.+?\.php)(/.+)$;
fastcgi_pass php-fpm-sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
[/code]
Enfin, comme on passe par des sockets unix (parce qu’on est en local… sinon, on peut faire pareil, avec du localhost:9000) il faut indique à php-fpm d’utiliser le même utilisateur qu’nginx pour éviter des problèmes de droit (user/group nginx) et lui donner le chemin de la socket unix (/var/run/php-fpm/php-fpm.sock) :
[code lang=”bash”]vi /etc/php-fpm.d/www.conf[/code] [code lang=”bash”] […] ; The address on which to accept FastCGI requests.; Valid syntaxes are:
; ‘ip.add.re.ss:port’ – to listen on a TCP socket to a specific address on
; a specific port;
; ‘port’ – to listen on a TCP socket to all addresses on a
; specific port;
; ‘/path/to/unix/socket’ – to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:9000
listen=/var/run/php-fpm/php-fpm.sock […] ; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
[…] [/code]
Reste plus qu’à redémarrer le serveur php-fpm :
[code lang=”bash”]systemctl restart php-fpm[/code]Ca y est, je suis chaud bouillant et je fais mon premier script !!!
Dans le root path de mon serveur, je crée un fichier coucou.php :
[code lang=”php”] <?php echo "Coucou !"; ?>[/code]
… et là, quand je l’appelle, c’est le drame :
Ce site est inaccessible
http://ts-services.ovh/coucou.php est inaccessible.
Firewalld
C’est la nouveauté de CentOS 7 (entre autres…) : on a un nouveau firewall( qui passe par iptables)
Alors, commençons par la commande de base, à savoir quel est l’état de mon firewall :
[code]firewall-cmd –state[/code] [code]running[/code]Ensuite, regardons la liste de services ouverts :
[code]firewall-cmd –list-all[/code] [code] public (active)target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules: [/code]
=> C’est ça, on n’autorise que le ssh & le dhcpv6-client
Donc, on va modifier ça pour laisser passer le http et le https (car je vous le rappelle : depuis le 23 octobre 2017, Google privilégie les sites en https).
[code]firewall-cmd –get-default-zonepublic[/code]
Donc ma zone s’appelle “public” : on lui ajoute les services voulus :
[code]firewall-cmd –zone=public –add-service=http –permanent
success
[code] firewall-cmd –zone=public –add-service=https –permanent
success [/code]
Et enfin, on vérifie le bon ajout :
[code] firewall-cmd –list-allpublic (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules: [/code]
Et bien sûr, on active le tout !!!
[code] firewall-cmd –reload[/code]
C’est bon, on peut maintenant retester et vérifier que ô magie, ça remarche !
Maintenant, reste plus qu’à migrer mon site… mais ça, on le traitera dans un autre billet 🙂
Activation des services au démarrage
On va éviter de perdre l’accès à notre site si le serveur venait à redémarrer :
[code]</pre><p class="p1"><span class="s1">$ sudo systemctl enable mariadb</span></p>
<p class="p1"><span class="s1">Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.</span></p>
<p class="p1"><span class="s1">$ sudo systemctl enable nginx</span></p>
<p class="p1"><span class="s1">Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.</span></p>
<p class="p1"><span class="s1">$ sudo systemctl enable php-fpm</span></p>
<p class="p1"><span class="s1">Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.</span></p>
<pre>[/code]