Installation d'un serveur web en production sur Debian 8 Jessie

Je partage à chaud un petit tuto codé à chaud étape par étape pour la mise en place d'un serveur de prod sur debian 8, il est brut et n'est pas accompagné d'explications très détaillées, libre à vous d'approfondir, de poser des question ou de m'aider à étayer l'article car je n'ai pas trops le temps de m'y consacrer à fond...

Server setup for Debian 8 Jessie

#add our sudo/admin users
adduser jo sudo
adduser jeff sudo

#add our www manager user
adduser enterprise

#add mariadb-repo
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://fr.mirror.babylon.network/mariadb/repo/10.1/debian jessie main'

#add php7 repo
echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt update

#install libs
apt-get install sudo apache2 php mariadb-server redis-server php7.0-redis php-simplexml php-mysql php-mbstring php-zip php-intl php-gd php-curl curl git vsftpd libpam-pwdfile glances aptitude locate

#install PHPUnit
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/local/bin/phpunit

#install wkhtml2pdf
wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb
sudo dpkg -i wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb
sudo apt-get install -f

#enable modules
sudo phpenmod pdo
sudo a2enmod rewrite include headers deflate alias auth_digest

#set permissive umask
echo umask 000 >> /etc/apache2/envvars

#enable .htaccess
/etc/apache2/apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
#AllowOverride None
AllowOverride All
Require all granted
</Directory>

#add .htpasswd file
cd /var/www
htdigest -c .htpasswd "Who are you ?" enterprise
sudo chmod 644 .htpasswd

#add admin tools
mkdir /var/www/adminer
mkdir /var/www/redis-adminer
chmod a+rwX /var/www/adminer
chmod a+rwX /var/www/redis-adminer

#in /var/www/adminer/.htaccess and /var/www/redis-adminer/.htaccess
AuthType Digest
AuthName "Who are you ?"
AuthUserFile /var/www/.htpasswd
Require valid-user

#install our admin tools
cd /var/www/adminer
wget https://github.com/vrana/adminer/releases/download/v4.2.5/adminer-4.2.5.php
mv adminer-4.2.5.php index.php
cd /var/www/redis-adminer
composer create-project erik-dubbelboer/php-redis-admin .

#add our alias to admin tools
/etc/apache2/site-available/000-default.conf
<VirtualHost *:80>
#...
Alias /adminer /var/www/adminer
Alias /redis-adminer /var/www/redis-adminer
#...
</VirtualHost>

#give full access to our www manager to www folder
sudo chown enterprise:enterprise /var/www

#install composer
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

#FTP
#config pam

#backup origin
sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

#enable ftpd.passwd file
/etc/pam.d/vsftpd
auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

#add vsftpd user
sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

#create ftp ssl certificate
sudo openssl req -new -x509 -days 365 -nodes -out /etc/ssl/private/vsftpd.cert.pem -keyout /etc/ssl/private/vsftpd.key.pem
sudo chown root:root /etc/ssl/private/vsftpd.cert.pem
sudo chown root:root /etc/ssl/private/vsftpd.key.pem
sudo chmod 600 /etc/ssl/private/vsftpd.cert.pem
sudo chmod 600 /etc/ssl/private/vsftpd.key.pem

#in /etc/vsftpd.conf
https://gist.githubusercontent.com/surikat/de2986504f8165fba212e1e2655e2760/raw/a7fc0251345e7da6e88fb8e402ccc5cd7e6c799e/vsftpd.conf

#in /usr/bin/vsftpd-user
https://gist.githubusercontent.com/surikat/de2986504f8165fba212e1e2655e2760/raw/a7fc0251345e7da6e88fb8e402ccc5cd7e6c799e/vsftpd-user

#config mariadb/mysql
#in /etc/mysql/my.cnf (if file is about mariadb else) /etc/my.cnf
innodb_flush_log_at_trx_commit=2
max_allowed_packet=512M

#in /etc/ssh/sshd_config
#...
Port 25565
AuthorizedKeysFile      %h/.ssh/authorized_keys
PermitRootLogin no
#...

ssh -p 25565 enterprise@myproject.com
ssh-keygen -t rsa -b 4096 -C "myproject@surikat.pro"
#you have to copy ~/.ssh/id_rsa.pub in github ssh key
cd /var/www/html
git clone git@github.com:surikat/enterprise-myproject .

#in /etc/php/7.0/apache2/php.ini
#...
memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 120M
opcache.enable=1
#...

#restart apache2
sudo /etc/init.d/apache2 restart

#restart our ftp server
sudo /etc/init.d/vsftpd restart

#restart our mysql server
sudo /etc/init.d/mysql restart

#restart our ssh server
sudo /etc/init.d/sshd restart

Firefox Developer Edition !

Mozilla a sorti une version de firefox spécialement pour nous les développeurs,

Pour l'installer sur Linux Mint/Ubuntu voilà une procédure facile:

Télécharger l'archive sur la page https://www.mozilla.org/fr/firefox/developer/

Extraire l'archive dans un dossier pour l'installation, une bonne pratique est de l'installer dans /opt/firefox_dev

Ensuite il ne vous reste plus qu'à créer le raccourci en créant le fichier ~/.local/share/applications/firefox_dev.desktop qui contiendra

[Desktop Entry]
Name=Firefox Developer 
GenericName=Firefox Developer Edition
Exec=/opt/firefox_dev/firefox
Terminal=false
Icon=/opt/firefox_dev/browser/icons/mozicon128.png
Type=Application
Categories=Application;Network;X-Developer;
Comment=Firefox Developer Edition Web Browser.

Et voilà !

VirtualHosts dynamiques - tuto complet

Prérequis

Linux debian/mint/ubuntu

Apache2

 

Procédure

 

Étape 1: Configuration d'apache

Tout d'abord on va activer les modules apaches nécéssaires:

sudo a2enmod alias vhost_alias

Ensuite on va rajouter notre définition de virtual host dynamique dans les sites apache

sudo nano /etc/apache2/sites-available/dev.conf

ou en mode graphique

gksudo geany /etc/apache2/sites-available/dev.conf

et ensuite on va y mettre

<VirtualHost *:80>
  ServerName root
  DocumentRoot /var/www/localhost
  ErrorLog /var/www/error.log
  CustomLog /var/www/access.log combined
  <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
<VirtualHost *:80>
  UseCanonicalName Off
  ServerName dev
  ServerAlias *.dev
  VirtualDocumentRoot /var/www/%0
  VirtualScriptAlias  /var/www/%0/cgi-bin
  ErrorLog /var/www/error.log
  CustomLog /var/www/access.log combined
  <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

ensuite on désactive le site par défaut et on active celui que l'on vient définir:

sudo a2dissite 000-default
sudo a2ensite dev

ensuite on n'oublie pas de créer le dossier sur lequel localhost pointera désormais:

mkdir /var/www/localhost

puis il ne reste qu'à redémarrer

sudo service apache2 restart

et voilà, à partir de maintenant tout dossier dont le suffix sera .dev dans /var/www par exemple /var/www/monsite.dev sera pointé par un host monsite.dev, mais à ce stade, si on s'arrétait à cette étape, il faudrait encore définir le pointage des hôtes manuellement sur 127.0.0.1 dans /etc/hosts et ce pour chaque site

note: cette étape, si on adapte les chemins vers les dossiers et fichiers, peut fonctionner également sur windows.

 

Étape 2: Wildcard dnsmasq

Cette étape consiste à installer un service de gestion de dns appelé dnsmasq et à le configurer pour qu'il capture automatiquement tous les domaines en .dev et les redirige sur la machine local: 127.0.0.1, tout d'abord il faut l'installer 🙂

sudo apt-get install dnsmasq

ensuite il faut ouvrir /etc/dnsmasq.conf

sudo nano /etc/dnsmasq.conf

et y ajouter ces deux lignes:

address=/dev/127.0.0.1
listen-address=127.0.0.1

puis redémarrer le service

sudo service dnsmasq restart

ensuite il faut dire au gestionnaire de réseau d'utiliser ce service pour résoudre les dns, pour ce faire on se rend dans le fichier /etc/NetworkManager/NetworkManager.conf

sudo nano /etc/NetworkManager/NetworkManager.conf

et on rajoute ou on remplace dans la section [main] la ligne

dns=dnsmasq

puis on redémarre le gestionnaire de réseau

sudo service network-manager restart

Ensuite il faut aussi configurer le dhclient

sudo nano /etc/dhcp/dhclient.conf

et on rajoute ou on décommente cette ligne

prepend domain-name-servers 127.0.0.1;

puis il faut également le redémarrer

sudo dhclient -r

ensuite il faut configurer le name service switch

sudo nano /etc/nsswitch.conf

et la ligne définissant le host doit ressembler à ceci, on peut l'adapter à nos besoins mais l'important est que le dns soit présent, dans le doute on commente celle existante et on ajoute celle ci

hosts:          files dns mdns4_minimal [NOTFOUND=return] mdns4

Et voilà pour l'étape 2, si on s'arrête ici, les virtual host dynamiques fonctionnent de manière automatique, il suffit de créer un dossier /var/www/monsupersite.dev et on peut y accéder directement en tapant http://monsupersite.dev dans la barre d'adresse du navigateur. Mais il reste une lacune, il faut une interface réseau connectée pour que cela fonctionne, si on est débranché d'internet ou au moins d'un réseau local, on n'accédera plus à nos virtual host dynamiques. C'est pourquoi il faut passer à l'étape 3.

 

Étape 3: Virtual Interface

Cette étape consiste à créer une interface virtuelle qui ramène en loopback sur la machine, c'est un genre de leurre pour dire à la machine qu'elle est bien en réseau, une commande simple suffit

sudo ifconfig eth0:0 123.123.22.22

mais elle n'est pas persistante, lorsque l'on redémarre la machine cette interface virtuelle disparaît

il faut donc créer un script qui se lancera à chaque démarrage

sudo nano /etc/init.d/virtual_interface_for_dynamicvhosts

et y mettre le code suivant

#!/bin/bash
sudo ifconfig eth0:0 123.123.22.22

ensuite il faut le rendre éxecutable

sudo chmod +x /etc/init.d/virtual_interface_for_dynamicvhosts

puis pour l'enregistrer au démarage

sudo update-rc.d virtual_interface_for_dynamicvhosts defaults

 

à partir de linux mint 18 oubliez ce qui précède dans l'étape 3, et faites plutôt

sudo nano /etc/network/interfaces

pour y rajouter

#si vous êtes en dhcp
iface eth0:0 inet dhcp

#si vous êtes en ip statique
#iface eth0:0 inet static

 

Et voilà ! Vos hôtes virtuels dynamiques sont maintenant pleinement opérationels 🙂

Pour rappel: il vous suffira de créer un dossier suffixer d'un .dev dans /var/www et il sera automatiquement pointé par l'adresse correspondant au nom du dossier, ex: /var/www/monsite.dev attrapera http://monsite.dev et le localhost pointera quant à lui sur /var/www/localhost

 

Umask apache permissif pour une config de dev

Par défaut le umask d'apache est de 0022 ce qui fait que les fichiers créés par apache/php sont accessible en écriture uniquement par apache ce qui est bonne mesure de sécurité pour un serveur en production mais pour une machine de dev, un environnement de bureau par exemple, il est plus pratique d'avoir des fichiers générés par apache/php qui sont accessible en écriture pour tout le monde, pour ce faire, il vous suffit d'ouvrir le fichier /etc/apache2/envvars en sudo par ex:

sudo nano /etc/apache2/envvars

si vous aimez la console

ou

gksudo geany /etc/apache2/envvars

si vous préférez utiliser un éditeur de code en interface graphique

et ajoutez la ligne

umask 000

puis sauvegardez et bien sûr n'oubliez pas de redémarrer apache

sudo service apache2 restart

 

Redirection de port sur un serveur debian

Voilà un petit script à mettre dans un fichier port_forward.sh par exemple

avant de l'activer (et de le mettre au démarage de la machine si vous voulez que cette redirection soit persistente) remplacez la valeur assigné à IF_IN par votre périphérique réseau que vous pourrez trouver en tapant ifconfig, la valeur de PORT_IN par le port auquel vous voulez accéder de l'extérieur, IP_OUT par l'IP de sortie (en général sur votre réseau local), et PORT_OUT par le port de sortie (correspondant à IP_OUT).

 

#!/bin/bash
IF_IN=eth0
PORT_IN=2222
IP_OUT=123.321.123.321
PORT_OUT=22

IPTBL=/sbin/iptables
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPTBL -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPTBL -A FORWARD -p tcp -d $IP_OUT --dport $PORT_OUT -j ACCEPT
$IPTBL -A POSTROUTING -t nat -j MASQUERADE