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é :D

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 :D 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.

Vus : 1076
Publié par botchchikii : 30