Mon install d'un serveur web sous Debian
Ç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/