Raspberry

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Raspberry Pi (Raspbian/Debian ARM) — préparation carte SD, serveur LEMP léger
Commande raspi-config
Contexte Raspbian squeeze/wheezy (armel puis armhf) — installation initiale et

serveur web nginx + PHP-FPM + MariaDB sur matériel contraint

Voir aussi Chkconfig (équivalent update-rc.d sous Debian)

Aide-mémoire pour préparer une carte SD Raspbian et monter dessus un serveur web léger (nginx + PHP-FPM + MariaDB), adapté aux ressources limitées du Raspberry Pi. Les premières générations de Raspbian existaient en armel (squeeze et wheezy) puis en armhf (wheezy uniquement, plus performant grâce au FPU matériel).

Préparation de la carte SD

Écriture de l'image sur la carte et vérification du partitionnement :

dd bs=4M if=2014-01-07-wheezy-raspbian.img of=/dev/mmcblk0
sync
parted -l

Au premier démarrage, configuration de base puis mise à jour complète :

sudo raspi-config

sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade
sudo passwd root

Configuration système

Réduire les écritures sur la carte SD

La carte SD s'use avec les écritures répétées : on retarde et regroupe les commit du système de fichiers racine. Dans /boot/cmdline.txt :

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=120,data=writeback,commit=120 elevator=deadline rootwait

Et dans /etc/fstab :

/dev/mmcblk0p2  /  ext4  defaults,noatime,commit=120,data=writeback  0  1

Retirer l'environnement graphique

Sur un Raspberry Pi utilisé comme serveur (pas de bureau), on purge X11/LXDE pour libérer de la mémoire et de l'espace :

aptitude purge xserver-xorg xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev \
  xserver-xorg-input-synaptics xserver-xorg-video-fbdev xserver-common xpdf xinit x11-common \
  x11-utils x11-xkb-utils xarchiver screen pcmanfm penguinspuzzle lxde-common lxappearance \
  lxde-icon-theme lxinput lxmenu-data lxpanel lxpolkit lxrandr lxsession lxsession-edit \
  lxshortcut lxtask lxterminal leafpad dillo galculator gnome-icon-theme gnome-themes-standard \
  gnome-themes-standard-data gpicview hicolor-icon-theme

# nettoyer les dépendances devenues orphelines
aptitude purge ~c

Penser ensuite à localepurge pour supprimer les locales inutilisées et gagner encore de la place sur la carte SD.

Serveur web léger : nginx + PHP-FPM

nginx

nginx est préféré à Apache sur Raspberry Pi car nettement plus léger en RAM :

apt-get install nginx
service nginx start

Un site se déclare dans sites-available puis s'active par lien symbolique dans sites-enabled :

mkdir -p /var/www/monsite.fr/htdocs
chown -R www-data:www-data /var/www

cd /etc/nginx/sites-available
cp default monsite.fr
cd ../sites-enabled/
ln -s ../sites-available/monsite.fr

nginx -t   # valider la configuration avant de recharger

Bloc serveur type pour du PHP en FastCGI (socket Unix vers PHP-FPM) :

server {
    listen 80;
    server_name monsite.fr;

    root /var/www/monsite.fr/htdocs;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/monsite.fr/htdocs;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

PHP-FPM

apt-get install php5 php5-fpm php5-mysql
apt-get install php5-gd php-pear php5-imagick php5-mcrypt php5-cli php5-curl php5-common php5-cgi

Dans /etc/php5/fpm/php.ini, décommenter et désactiver la résolution approximative des chemins de script (faille de sécurité classique si activée) :

cgi.fix_pathinfo=0
service php5-fpm restart

Le pool par défaut se configure dans /etc/php5/fpm/pool.d/www.conf.

Alternative historique (spawn-fcgi + lighttpd) — avant la généralisation de PHP-FPM, le FastCGI pouvait être lancé manuellement avec spawn-fcgi :

apt-get install lighttpd
update-rc.d -f lighttpd remove   # équivalent Debian de chkconfig --del

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

Cette commande doit alors être ajoutée à /etc/rc.local pour survivre à un redémarrage.

Cache PHP (APC)

APC (Alternative PHP Cache) accélère l'exécution en mettant en cache l'opcode PHP compilé — remplacé depuis par OPcache en PHP 5.5+, mais toujours d'actualité sur les anciennes versions embarquées sur Raspbian wheezy :

apt-get install php-apc
; /etc/php5/fpm/conf.d/20-apc.ini
extension=apc.so

apc.enabled=1
apc.shm_size=128M
apc.ttl=3600
apc.user_ttl=7200
apc.gc_ttl=3600
apc.max_file_size=1M

MariaDB

MariaDB partage le même nom de service que MySQL sur ces systèmes (service mysql status) et s'installe comme un remplacement direct :

apt-get purge mysql*
apt-get autoremove

apt-get install python-software-properties
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb http://<miroir>/repo/5.5/debian wheezy main'
# obtenir l'URL du miroir adapté (version/distribution/architecture) sur mariadb.org/repo/

apt-get update
apt-get install mariadb-server mariadb-client

Compilation depuis les sources

Sur les architectures ARM non couvertes par les paquets binaires officiels (armel notamment), MariaDB doit être recompilé à la main :

wget -O mariadb-5.5.25.tar.gz "http://downloads.mariadb.org/f/mariadb-5.5.25/kvm-tarbake-jaunty-x86/mariadb-5.5.25.tar.gz/from/http:/download.nus.edu.sg/mirror/mariadb"
tar -xvzf mariadb-5.5.25.tar.gz
mv mariadb-5.5.25 maria

cd maria/BUILD
./autorun.sh
cd ..
aptitude install cmake libncurses5-dev bison
./configure
make
make install

adduser mysql
chown -R mysql /usr/local/mysql
cd /usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysqld

scripts/mysql_install_db --user=mysql --basedir="/usr/local/mysql"

Adapter basedir dans /etc/mysql/my.cnf :

basedir = /usr/local/mysql

Puis copier les messages d'erreur (absents sinon du basedir personnalisé) et démarrer :

cp -r maria/ /usr/share/mysql/
chown -R mysql /usr/share/mysql
cp /usr/share/mysql/sql/share/english/errmsg.sys /usr/share/mysql/errmsg.sys

/etc/init.d/mysqld start
./bin/mysql_secure_installation

Voir aussi

  • Chkconfig — gestion des services au démarrage, équivalent RHEL de update-rc.d