Monter un serveur sous Frugalware
Cela fait un moment que ce blog est resté inactif. Je vais lui redonner un peu de vie en vous décrivant ma première expérience pour monter un serveur «at home». Je vais commencer par vous décrire l'installation de base de l'ordinateur, pour ensuite décrire la configuration du serveur Web et des services indispensables. Ce premier essai peut motiver certains à se lancer dans l'hébergement maison et ainsi contrôler intégralement leurs publications.
Installation de la base
Pour servir de base à mon beau serveur, j'ai décidé d'installer Frugalware, une distribution légère, stable et que je commence à connaître. Pour apporter une petite touche de fun et parce que j'ai toute confiance en Fw, mon serveur sera en Current ! La première étape est de graver un cd avec la version 1.3 (la version 1.4 Nexon est bientôt disponible).
L'installation d'un serveur ne demande pas beaucoup de choses. À l'étape du choix des catégories, je ne laisse que "base", je complète l'installation en modifiant le compte root et en ajoutant un utilisateur (moi) puis je reboote la machine.
Au redémarrage, la première chose à faire est d'installer Vim et de passer en current en décommentant la ligne qui va bien:
pacman -S vim vim /etc/pacman-g2.conf
Ensuite une petite mise à jour du système (grosse en fait) et un redémarrage va nous permettre d'aborder ensuite une partie plus intéressante.
pacman -Syu reboot
En attendant la suite, on va se pencher sur une étape importante : l'adresse Ip, où comment montrer son beau serveur.
Adresse IP et Noms de domaines
Une adresse Ip est un élément indispensable pour un serveur : c'est l'adresse où les gens pourront aller le visiter. À ne pas confondre avec l'adresse interne de votre réseau (commençant en général par 192.168.). Étant sur Free, la configuration initiale vous donne accès à une adresse Ip dynamique : elle change régulièrement et ce n'est donc pas le top. Si vous avez la possibilité comme moi de fixer cette adresse (chez Free, c'est dans votre compte Free, n'hésitez pas, tout est beaucoup plus simple comme ça.
En ce qui concerne l'Ip interne, mon réseau utilise l'adressage dynamique. Pour être sur que le serveur ait toujours la même, j'ai attribué une adresse Ip à la MAC adresse de sa carte réseau (visible en tapant ifconfig). Pour passer au travers des sécurités de Free, j'ai attribué cette même adresse Ip le statut "DMZ" qui signifie «Démilitarisé». Ce sera mon firewall qui se chargera de gérer les ports. Mon serveur a donc une Ip interne qui ne changera pas : 192.168.0.50
Faisons un tour chez le registrar de mon nom de domaine, Gandi. Je compte utiliser le Ndd "Wolf.am" pour pointer sur le serveur. En premier lieu, il faut que Gandi gère les serveurs de noms (de base si vous n'avez rien changé). Ensuite, il faut aller dans l'interface "Gérer les zones" pour envoyer le Ndd chez vous. Voici ce que ça donne chez moi, avec ce qui va bien pour le serveur web et XMPP :
_xmpp-client._tcp 3600 IN SRV 0 0 5222 wolf.am. # pour prosody _xmpp-server._tcp 3600 IN SRV 0 0 5269 wolf.am. # pour prosody drine 10800 IN A 62.147.206.154 # un sous domaine de test @ 10800 IN A 62.147.206.154 # le domaine principal envoie vers l'Ip public du serveur * 10800 IN A 62.147.206.154 # Tous les sous domaines renvoient vers le serveur
En complément, il est nécessaire de modifier /etc/hosts du serveur pour l'informer que "wolf.am" c'est lui :
127.0.0.1 localhost 127.0.0.1 wolf.am
et celui de votre poste de travail pour lui indiquer que le serveur (Ip interne) se fait appeler "wolf.am" (sinon, vous verrez rien !)
192.168.0.50 wolf.am
Dyndns et Ip publique dynamique
Si votre FAI ne vous propose pas d'Ip publique fixe, il est nécessaire de passer par un intermédiaire comme dyndns.com qui vous permettra de diriger votre nom de domaine chez vous. Comme votre Ip va changer, il peut être intéressant d'installer une application qui se chargera de mettre à jour votre Ip publique sur votre compte Dyndns. Sur Frugalware, il existe Ddclient qui se lance en service et qui s'occupe de tout
pacman -S ddclient service ddclient add service ddclient start
La configuration se fait en éditant le fichier **/etc/ddclient et ressemble à ça :
# Basic configuration file for ddclient # # /etc/ddclient.conf daemon=600 cache=/tmp/ddclient.cache pid=/var/run/ddclient.pid use=web, web=checkip.dyndns.com/, web-skip='IP Address' login=your-username password=your-password protocol=dyndns2 server=members.dyndns.org wildcard=YES example.dyndns.org # votre adresse dyndns custom=yes, example.com # votre ndd
OpenSSH et Iptables
Une fois la base du serveur installé, il est temps de pouvoir prendre le contrôle de la bête à distance et de sécuriser un peu les ports du serveur. Les outils utilisés sont OpenSSH et Ufw,une interface simple à IpTables que j'ai découvert sur le blog de Lenezir. Pour installer ces deux applications, présentes dans les dépôts de Frugalware :
pacman -S openssh ufw
Le protocole SSH permet de se connecter à distance et de manière sécurisée. Je vous laisse le soin de découvrir cette petite merveille si vous ne connaissez pas, mais c'est un truc énorme ! Et cela permet donc d'administrer le serveur sans être devant. La configuration d'OpenSSH se fait par l'édition du fichier /etc/ssh/sshd_config. Les points à modifier (à décommenter souvent) sont :
port 22 # C'est le port par défaut et il est préférable de le modifier PermitRootLogin no # interdit au compte root de se logguer (c'est mieux) PasswordAuthentication no # oblige l'utilisation des clés privées HostKey /etc/ssh/ssh_host_rsa_key # chemin des clés rsa HostKey /etc/ssh/ssh_host_dsa_key # chemin des clés dsa PubkeyAuthentication yes # On autorise les connexions via les clés publiques AuthorizedKeysFile .ssh/authorized_keys # Fichiers des clés publiques autorisées
Il faut bien sur ajouter votre clé public dans le fichier /home/user/.ssh/authorized_keys du serveur. Après cela, vous êtes capables de vous connecter au serveur depuis votre pc avec cette commande :
ssh -p 4200 user@host # où 4200 est le port réservé à SSH (si vous laissez le port 22 par défaut, c'est optionnel, sinon obligatoire).
Mais avant de vous connecter par SSH, il faut configurer le pare-feu. Outil indispensable pour éviter que tout le web se sente chez lui ! Pour configurer Ufw, je me suis basé sur l'article de Lenezir cité plus haut, en ajoutant les règles pour le protocole Xmpp, car je souhaite mettre en place un serveur Prosody, et de MySql dont j'aurais aussi besoin.
ufw enable ufw deny all # de base, on bloque tout ufw allow 80 # on autorise le trafic internet ufw allow 22 # on autorise le SSH (modifier selon le port choisi) ufw allow 5222 # pour prosody ufw allow 5269 # pour prosody ufw allow 5280 # pour prosody ufw allow 3306 # pour le serveur Mysql
Et on active le démarrage de ufw au boot en ajoutant ufw enable
à /etc/rc.d/rc.local.
Serveur Prosody
C'était une de mes motivation pour monter mon serveur : avoir mon compte Jabber indépendant (JabberFR est dans les choux souvent et j'ai envie de gérer cet aspect). Alors, Kooda m'avait affirmé qu'avec Prosody, c'était un jeu d'enfant. Et effectivement, c'est même trop simple. Pour l'installer :
pacman -S prosody service prosody add service prosody start
Et on édite le fichier /etc/prosody.cfg.lua. On indique les JID administrateurs :
admins = {"botchchikii@wolf.am"}
On autorise l'enregistrement des nouveaux comptes (ou pas…)
allow_registration = true;
On configure le domaine :
VirtualHost "wolf.am"
Et si vous le souhaitez (c'est mieux), vous mettez en place le SSL en suivant ce tutoriel
ssl = { key = "/path/to/prosody.key"; certificate = "/path/to/prosody.cert"; }
Pour le fun et pour avoir accès à des salons (MUC), il suffit de décommenter une ligne et de choisir un sous domaine :
-- Set up a MUC (multi-user chat) room server on conference.example.com: Component "conference.example.com" "muc"
Et pour finir, on relance le service :
service prosody restart
Il ne reste plus qu'à attendre que Gandi propage vos CNAMES que vous avez modifié auparavant (voir la section plus haut) et enregistrer votre compte avec Gajim ou un autre. Non, y'a rien de plus à faire !
Serveur Lighttpd
Bon, tant qu'à avoir un serveur, autant qu'il affiche des pages web… Il existe plusieurs serveurs web, dont le plus connu est Apache. Pour ma part, je vais me tourner sur Lighttpd, réputé plus léger que son illustre confrère. Pour l'installer, c'est toujours aussi facile :
pacman -S lighttpd service lighttpd add service lighttpd start
Pour Le configurer, un seul fichier : /etc/lighttpd/lighttpd.conf. On active quelques modules utiles (je vais avoir besoin du php, sinon les modules "cgi" et "fastcgi" ne sont pas utiles):
# server.modules = ( "mod_rewrite", "mod_redirect", "mod_alias", "mod_access", "mod_fastcgi", "mod_cgi", "mod_accesslog" )
On définit la page par défaut du serveur :
server.document-root = "/srv/www/wolf.am/"
On définit quelques VirtualHosts (domaines ou sous domaines) :
$HTTP["host"] == "wolf.am" { server.document-root = "/srv/www/wolf.am" } $HTTP["host"] =~ "(^|\\.)botchchikii\\.com$" { server.document-root = "/srv/www/nb" } $HTTP["host"] == "drine.wolf.am" { server.document-root = "/srv/www/drine/drine.info" server.error-handler-404 = "/index.php?error=404" url.rewrite = ( "^/(wp-.+).*/?" => "$0", "^/(sitemap.xml)" => "$0", "^/(xmlrpc.php)" => "$0", "^/(.+)/?$" => "/index.php/$1" ) }
On peut ajouter des logs d'accès et d'erreur pour chaque domaine. "url.rewrite" permet de compenser l'absence de .htaccess comme sur Apache. Dans cet exemple, c'est pour le Wordpress de Drine et cela marche impeccable.
Avec Cela et après avoir relancer le service lighttpd, vous pouvez déjà afficher des pages statiques, comme ce blog par exemple (il tourne d'ailleurs dessus ). Maintenant, abordons la partie la moins sympa : le php et MySql.
Php et MySql
Php en lui même, ça ne pose pas de souci :
pacman -S php php-cgi
Il faut modifier /etc/php.ini pour lighttpd et ajouter la ligne :
cgi.fix_pathinfo = 1
N'oubliez pas d'inclure vos répértoires web dans la ligne :
open_basedir = /home/:/tmp/:/usr/share/pear/:/srv/www
Dans /etc/lighttpd/lighttpd.conf, il faut activer le module "fastcgi" et décommenter la section concernée (adaptez le chemin vers php-cgi) :
#### fastcgi module ## read fastcgi.txt for more info ## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini fastcgi.server = ( ".php" => ( "localhost" => ( "socket" => "/tmp/php-fastcgi.socket", "bin-path" => "/usr/bin/php-cgi" ) ) ) fastcgi.debug = 1 fastcgi.map-extensions = (".php3" => ".php")
À ce niveau là, vous pouvez vérifier que le php est bien interprété en créant un fichier test dans votre espace web, par exemple test.php avec:
<?PHP phpinfo(); ?>
En visitant cette page, vous devriez avoir une pleine page d'info sur votre installation de Php. Je ne vais pas rentrer dans les détails de cette configuration, principalement parce que je ne m'y suis pas encore penché
Au tour de MySql, qui m'a particulièrement gonflé… L'installation est banale :
pacman -S mysql service mysqld add service mysqld start
Il est conseillé de lancer le script d'installation pour sécuriser un minimum le service :
mysql_secure_installation
La configuration se fait par l'édition du fichier /etc/my.cnf. Les informations importantes sont dans la section Mysqld :
# The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /var/lib/mysql/mysql.sock # The MySQL server [mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock datadir = /var/lib/mysql skip-external-locking key_buffer = 16M max_allowed_packet = 1M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K myisam_sort_buffer_size = 8M character-set-server=utf8 skip-character-set-client-handshake
Les deux dernières lignes permettent de basculer en UTF-8. Vous aurez peut-être comme moi le fameux souci au redémarrage du service (qui ne voudra pas se lancer…) :
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Un sacré casse-tête qui m'a bloqué plusieurs jours. J'ai erré sur le net en recherche de solution, réinstallé le bouzin, réussi à me connecter une fois (pas deux à la suite)… et les logs d'erreurs restaient vides. Sauf que je ne regardais pas le bon log Donc, si cela vous arrive, zieutez du coté de /var/lib/mysql/serveur.err ! Il m'a donné l'erreur suivante :
Failed to open log (file './serveur-bin.000015'
Ce qui m'a permis de trouver la solution ici. Et depuis ça marche bien :/
La page Ubuntu de MySql vous apportera les informations de base pour administrer les votres (de bases). Il est possible aussi d'installer PhpMyAdmin pour faire ça depuis le web, mais je me suis contenté de la console pour le moment.
Le résultat
Et bien, Wolf.am est en ligne et bien opérationnel ! Ce blog est hébergé dessus, ainsi que le blog de Drine. Le serveur Jabber tourne impeccable et au niveau vitesse et réactivité, ça semble très honorable. Je pense ainsi me défaire de mon hébergement chez Lautre.net et rapatrier un second blog WP si tout va bien. (Bob, prépare toi !).
Je dois bien sur m'instruire dans plusieurs domaines, comme le monitoring et les sauvegardes, et optimiser la partie Php/Mysql qui m'est encore bien étrangère. J'attends maintenant Kooda de pied ferme pour peaufiner mon installation et l'améliorer. D'ailleurs, il m'a promis d'attaquer ce sujet très intéressant sur son blog suite à ce billet !
Sinon, je me suis surtout lancé dans cette aventure pour m'attaquer à ce thème qui m'intéresse. En effet, la perspective de pouvoir gérer soi-même son serveur est très stimulante et me permet d'en apprendre un peu plus sur Gnu/Linux et le fonctionnement d'un ordinateur.