Mon install d'un serveur web sous Debian

2010-04-16

Ça faisait longtemps que je voulais le faire. J’ai enfin “publié” ma procédure de base pour installer un serveur web sous Debian avec plein de petites choses dedans.

  • Git (et consignes pour versionner /etc)
  • Bind (dans un chroot)
  • MySQL + mysqltuner
  • Apache + PHP
  • Ruby + Rubygems + Passenger + Rails
  • Munin
  • Monit
  • BackupNinja
  • et divers autres outils

Evidemment, il manque plein de choses : je n’ai pas installé de firewall, pas de serveur de mail… mais si vous voyez des corrections et/ou améliorations, n’hésitez pas à me le faire savoir.

Vérifier que le partitionnement convient

Avant de se lancer, rien de tel que revoir le partitionnement, car après, c’est un peu plus dur.

Changer le mot de passe root

$ passwd

Ouvrir une nouvelle fenêtre SSH et tester le nouveau mot de passe.

Reconfiguration des locales (pour mettre en UTF8 par défaut)

$ dpkg-reconfigure locales

Configuration de debconf

Par défaut debconf est en mode élevé pour le niveau de configuration des paquets installés. Sur un serveur important, il est nécessaire de passer en mode intermédiare.

$ dpkg-reconfigure debconf

Mise à jour des paquets via aptitude

$ aptitude update && aptitude safe-upgrade

Install des compilateurs, …

$ aptitude install build-essential

Install de Git

Il faut installer quelques dépendances :

$ aptitude install python gettext zlib1g zlib1g-dev libcurl3-gnutls libdigest-sha1-perl liberror-perl libexpat1

Puis on récupère et installe les sources de Git

$ mkdir -p /usr/local/src/
$ cd !$
$ wget http://kernel.org/pub/software/scm/git/git-1.7.0.5.tar.gz
$ tar xzf git-1.7.0.5.tar.gz
$ cd git-1.7.0.5
$ ./configure
$ make
$ make install

On crée ensuite un repo pour /etc

$ cd /etc
$ git init && git add . && git commit -m "Ajout de tous les fichiers présents"

Bind doit être chrooté

On utilise l’excellent script de Grégory Colpart qui va bien nous faciliter le travail :

$ mkdir -p /usr/local/src
$ cd /usr/local/src
$ git clone git://git.evolix.org/git/evolinux/chroot-bind.git
$ cp /usr/local/src/chroot-bind/chroot-bind.sh /usr/local/bin/chroot-bind.sh
$ chmod 744 /usr/local/bin/chroot-bind.sh
$ /usr/local/bin/chroot-bind.sh

Il faut aussi indiquer à Bind qu’il doit démarer dans un chroot, ça se fait dans /etc/default/bind9 :

OPTIONS="-u bind -t /var/chroot-bind"

Puis on (re)démarre Bind

$ /etc/init.d/bind9 (re)start

Attention : après chaque mise à jour de Bind ou d’une dépendance de Bind, il faut penser à relancer ce script.

Installation de MySQL

$ aptitude install mysql-server mysql-client libmysqlclient15-dev

On met les nouvelles bases en UTF8 par défaut dans le fichier /etc/mysql/my.cnf

[mysqld]
[…]
default-character-set=utf8
[…]

On installe aussi mysqltuner.pl pour aider à optimiser la config

$ cd /usr/local/bin
$ wget http://mysqltuner.pl
$ chmod 755 mysqltuner.pl

Installation de Apache

$ aptitude install apache2 apache2-mpm-prefork apache2-prefork-dev phpmyadmin

On active quelques modules :

$ a2enmod ssl rewrite include

On active le site default-ssl :

$ a2ensite default-ssl

On force le renvoi vers https dans sites-available/default :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/server-status
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 2

On relance Apache :

$ /etc/init.d/apache2 restart

Installation de PHP5

Si on a besoin de plus que ce que l’install de phpMyAdmin installe par dépendance, on peut faire

$ aptitude install php-pear php5 php5-common php5-curl php5-dev php5-gd php5-idn php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Éventuellement on modifie la taille maximale d’upload via PHP (16Mo par exemple), dans le fichier /etc/php5/apache2/php.ini

Installation de Ruby et Rubygems

$ aptitude install ruby-full rake

$ cd /usr/local/src/
$ wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
$ tar xzf rubygems-1.3.6.tgz
$ cd rubygems-1.3.6
$ ruby setup.rb
$ cd /usr/bin
$ ln -s gem1.8 gem

On installe Gemcutter pour faciliter l’installation de gems supplémentaires

$ gem install gemcutter

Pour bz2 :

$ aptitude install libbz2-dev

Pour curb :

$ aptitude install curl libcurl3-dev

Pour libxml-ruby, roxml et nokogiri :

$ aptitude install libxml2-dev libexpat1-dev libxslt-dev

Pour Rmagick :

$ aptitude install imagemagick libmagick9 libmagick9-dev

Maintenant on peut installer les gems

$ gem install --no-ri --no-rdoc rails passenger activewarehouse-etl adapter_extensions amatch authlogic bz2 calendar_date_select compass compass-960-plugin chronic colored compass compass-960-plugin curb daemons fastercsv fastthread g gemcutter geokit ghazel-daemons git_remote_branch haml handsoap hashie hoe hpricot json_pure libxml-ruby mime-types mysql net-scp net-ssh nokogiri paperclip rest-client rmagick roxml rspec rspec-rails ruby-growl rubyzip sprockets syntax factory_girl vestal_versions whenever will_paginate

Install de Phusion Passenger

$ passenger-install-apache2-module

On colle bien la config pour Passenger dans /etc/apache/conf.d/passenger.conf

On peut y ajouter des éléments de config mais il faut les vérifier et ajuster selon les besoins :

PassengerMaxPoolSize 35
PassengerMaxInstancesPerApp 20
PassengerUseGlobalQueue on
PassengerDefaultUser deploy
# RailsFrameworkSpawnerIdleTime 0
RailsAppSpawnerIdleTime 60

Install d’outils divers

$ aptitude install iftop htop apachetop dnstop
$ aptitude install tree
$ aptitude install ntp
$ aptitude install apticron
$ aptitude install denyhosts
$ aptitude install webalizer

Install de Munin

$ aptitude install munin munin-node libwww-perl
$ cd /etc/munin/plugins
$ ln -s /usr/share/munin/plugins/apache_accesses ./
$ ln -s /usr/share/munin/plugins/apache_processes ./
$ ln -s /usr/share/munin/plugins/apache_volume ./
$ ln -s /usr/share/munin/plugins/apt_all ./
$ ln -s /usr/share/munin/plugins/uptime ./
$ ln -s /usr/share/munin/plugins/ntp_offset ./
$ invoke-rc.d munin-node restart

Il faut penser à activer le mod_status (en mode étendu) dans Apache. Je l’ai fait en créant un fichier /etc/apache2/conf.d/status dans lequel j’ai mis :

<IfModule mod_status.c>
  ExtendedStatus On
  <Location /server-status>
    SetHandler server-status
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
  </Location>
</IfModule>

Install de Monit

$ aptitude install monit

Monit n’est pas activé par défaut, il faut mettre “startup=1” dans le fichier /etc/default/monit

Install de BackupNinja

$ aptitude install backupninja

Il faut cependant créer ses stratégies de backup, rien n’est fourni de fonctionnel par défaut, juste des exemples.

À la suite, j’ai mis 3 stratégies que j’utilise :

05-system.sys : sauvegarde du hardware en général, des disques en particulier et des paquets

when = weekly

10-alldatabases.mysql : un dump de toutes les bases hébergées

databases   = all
backupdir   = /var/backups/mysql
hotcopy     = no
sqldump     = yes
compress    = yes

80-general.rdiff : une sauvegarde sélective par rdiff-backup

when = everyday at 06:00
when = everyday at 20:00

[source]
label = localhost
type = local
keep = 30

include = /var/spool/
include = /var/backups
include = /etc
include = /root
include = /home
include = /usr/local/bin
include = /usr/local/sbin
include = /var/backups
include = /var/chroot-bind
include = /var/lib
include = /var/log

exclude = /home/backups

[dest]
type = local
directory = /home/backups

NB: les fichiers mis en exemple ici n’ont plus leurs commentaires d’explication. On peut retrouver les exemples d’origine dans /usr/share/doc/backupninja/examples/.

Création d’un user administrateur non “root”

$ adduser new_user

Le programe demande d’abord le mot de passe, puis le nom complet, …

Installation de sudo

$ aptitude install sudo

Ensuite ajouter le user précédent

$ visudo

Ajouter la ligne

new_user ALL=(ALL) ALL

Création d’un user deploy pour les applis Rails

$ adduser deploy --home /var/apps/