Pour installer votre serveur web, il faudra préalablement avoir un serveur web et installé Linux dessus.
Je vous conseille de louer un serveur de type VPS (serveur virtuel privé) pour cela.
Si vous n’avez pas encore choisi votre hébergeur et installé votre serveur, référez-vous aux parties précédentes.
- Pourquoi choisir un serveur VPS comme hébergeur web
- Déposer son nom de domaine
- Créer un serveur web (VPS)
- Faire pointer un nom de domaine vers un serveur
- Se connecter à un serveur
- Installer son serveur
- Installer WordPress sur son serveur
Dans ce tutoriel, nous allons installer un serveur web sous la distribution Debian de Linux.
Après s’être connecté en SSH (Ref : se connecter à un serveur en SSH), nous allons exécuter des lignes de commandes Linux pour installer le serveur.
Vous l’aurez compris, vous devez tout d’abord vous connecter à votre serveur.
Une fois connecté, voici les étapes pour installer votre serveur :
Déclaration des variables pour l’installation
Dans cette installation, nous allons utiliser des variables.
Pour ceux qui font de la programmation savent probablement déjà ce que c’est.
En gros, ce sont des informations stockées en mémoire, que nous pourront réutiliser tout au long de notre installation.
Cela vous permettra de copier-coller mes instructions sans trop réfléchir.
Remplacez les valeurs suivantes « motdepasse1 », « motdepasse2 », « motdepasse3 », « votredomaine », « votreemail », « votreIP » par vos propres informations.
PHP_VERSION='7.4'
MCRYPT_VERSION='1.0.3'
PMA_VERSION='4.9.5'
MY_PASSWORD_ROOT='motdepasse1'
MY_PASSWORD_MYSQL='motdepasse2'
MY_PASSWORD_FTP='motdepasse3'
domain='votredomaine'
MY_EMAIL='votreemail'
MY_PUBLIC_IP='votreIP'
motdepasse1 | Choisissez un mot de passe (ne comportant pas d’apostrophe). |
motdepasse2 | Choisissez un mot de passe (ne comportant pas d’apostrophe). |
motdepasse3 | Choisissez un mot de passe (ne comportant pas d’apostrophe). |
votredomaine | Mettez votre nom de domaine (ex : monsuperwebsite.com) |
votreemail | Renseigner votre email |
votreIP | Mettez l’adresse IP de votre serveur web (vous l’obtenez après avoir louer un serveur VPS) |
Je vous recommande le site random.org pour générer vos mots de passe (mettez au minimum 16 caractères).
Copier les commandes avec les valeurs changés par vos soins, puis exécutez les via le terminal.
Mettre à jour le serveur
Tout d’abord, nous allons mettre à jour le système d’exploitation du serveur.
Pour cela, tapez les commandes suivantes :
apt-get update
apt-get upgrade -y
Installation des paquets
On ajoute des liens dans le registre des sources, pour que le système puisse installer les paquets que nous avons besoin.
echo "deb http://ftp.debian.org/debian stretch-backports main" | tee -a /etc/apt/sources.list
echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx" | tee -a /etc/apt/sources.list
echo "deb-src http://nginx.org/packages/mainline/debian/ stretch nginx" | tee -a /etc/apt/sources.list
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php${PHP_VERSION}.list
apt-get install lsb-release apt-transport-https ca-certificates -y
wget http://nginx.org/keys/nginx_signing.key
apt-get update
Installer Nginx
Nous allons installer le serveur Nginx, c’est un logiciel libre de serveur Web qui permet de gérer les requêtes HTTP.
apt-get install nginx -y
systemctl enable nginx
sed -i "s/user nginx/user www-data/g" /etc/nginx/nginx.conf
Ajout de modules
On installe divers outils sur le système.
apt-get install sudo git curl unzip build-essential apache2-utils locales zlib1g-dev libpcre3 libpcre3-dev libmcrypt-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev libssh2-1 libssh2-1-dev libmagickwand-dev libmagickcore-dev -y
Installer PHP
On installe PHP (version 7.4) qui est un langage de programmation.
Il va permettre de faire fonctionner des frameworks comme WordPress.
apt-get install php${PHP_VERSION} php${PHP_VERSION}-cli php${PHP_VERSION}-curl php${PHP_VERSION}-dev php${PHP_VERSION}-fpm php${PHP_VERSION}-gd php${PHP_VERSION}-mysql php${PHP_VERSION}-opcache php${PHP_VERSION}-xml php${PHP_VERSION}-mbstring php${PHP_VERSION}-zip -y
Configurer PHP
On va configurer et installer quelques modules pour PHP.
Puis redémarre la tâche de fond PHP.
cp /etc/php/${PHP_VERSION}/fpm/php.ini /etc/php/${PHP_VERSION}/fpm/php.ini.backup
sed -i "s/session.gc_maxlifetime = 1440/session.gc_maxlifetime = 14400/g" /etc/php/${PHP_VERSION}/fpm/php.ini
sed -i "s/max_execution_time = 30/max_execution_time = 90/g" /etc/php/${PHP_VERSION}/fpm/php.ini
cp /etc/php/${PHP_VERSION}/cli/php.ini /etc/php/${PHP_VERSION}/cli/php.ini.backup
sed -i "s/session.gc_maxlifetime = 1440/session.gc_maxlifetime = 14400/g" /etc/php/${PHP_VERSION}/cli/php.ini
sed -i "s/max_execution_time = 30/max_execution_time = 90/g" /etc/php/${PHP_VERSION}/cli/php.ini
printf "\n" | pecl install mcrypt-${MCRYPT_VERSION} -y
echo 'extension=mcrypt.so' | tee -a /etc/php/${PHP_VERSION}/fpm/conf.d/mcrypt.ini
cd
git clone https://github.com/php/pecl-networking-ssh2.git
cd pecl-networking-ssh2
phpize
./configure
make
make install
echo 'extension=ssh2.so' | tee -a /etc/php/${PHP_VERSION}/fpm/conf.d/ssh2.ini
cd
git clone https://github.com/mkoppanen/imagick.git
cd imagick
phpize
./configure
make
make install
echo 'extension=imagick.so' | tee -a /etc/php/${PHP_VERSION}/fpm/conf.d/imagick.ini
systemctl restart php${PHP_VERSION}-fpm
systemctl enable php${PHP_VERSION}-fpm
Installer MariaDB (MySQL)
Ensuite, nous allons installer MariaDB, alternative de MySQL.
MariaDB est connu pour être open source et plus performant que MySQL.
C’est un logiciel qui permet de gérer les bases de données relationnelles.
Ce qui nous sera utile pour le framework WordPress puisqu’il nécessite une base de données.
apt-get install mariadb-server mariadb-client -y
Configurer MariaDB
Après l’installation, nous allons modifier la configuration, puis redémarrer la tâche de fond.
mysql -u root << _EOF_
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
CREATE USER 'admin'@'localhost' IDENTIFIED BY '${MY_PASSWORD_MYSQL}';
GRANT ALL PRIVILEGES ON * . * TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
_EOF_
rm /etc/mysql/conf.d/mysql.cnf
touch /etc/mysql/conf.d/zmysql.cnf
tee -a /etc/mysql/conf.d/zmysql.cnf << _EOF_
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
[mysqld]
skip-name-resolve
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
character-set-client-handshake = FALSE
init-connect='SET NAMES utf8mb4'
_EOF_
systemctl restart mysql
Configurer Nginx
On va configurer le serveur Web.
systemctl stop nginx
mkdir -p /etc/nginx/template
On configure les paramètres globaux de Nginx.
touch /etc/nginx/template/params.conf
tee -a /etc/nginx/template/params.conf << _EOF_
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_cache_key "\$scheme\$request_method\$host\$request_uri";
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
port_in_redirect off;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
server_tokens off;
client_max_body_size 10m;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
application/atom+xml
application/ecmascript
application/javascript
application/postscript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
application/xml+rss
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/csv
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
_EOF_
On configure le processus PHP pour Nginx.
touch /etc/nginx/template/php.conf
tee -a /etc/nginx/template/php.conf << _EOF_
location ~ \.php$ {
try_files \$uri =404;
fastcgi_pass unix:/run/php/php${PHP_VERSION}-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_param SCRIPT_NAME \$fastcgi_script_name;
include fastcgi_params;
}
_EOF_
On met en place des règles de blocages pour certaines attaques et injections.
touch /etc/nginx/template/exploit.conf
tee -a /etc/nginx/template/exploit.conf << _EOF_
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options "SAMEORIGIN";
## Block SQL injections
set \$block_sql_injections 0;
if (\$query_string ~ "union.*select.*\(") {
set \$block_sql_injections 1;
}
if (\$query_string ~ "union.*all.*select.*") {
set \$block_sql_injections 1;
}
if (\$query_string ~ "concat.*\(") {
set \$block_sql_injections 1;
}
if (\$block_sql_injections = 1) {
return 403;
}
## Block user agents
set \$block_user_agents 0;
# Disable Akeeba Remote Control 2.5 and earlier
if (\$http_user_agent ~ "Indy Library") {
set \$block_user_agents 1;
}
# Common bandwidth hoggers and hacking tools.
if (\$http_user_agent ~ "libwww-perl") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "GetRight") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "GetWeb!") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "Go!Zilla") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "Download Demon") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "Go-Ahead-Got-It") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "TurnitinBot") {
set \$block_user_agents 1;
}
if (\$http_user_agent ~ "GrabNet") {
set \$block_user_agents 1;
}
if (\$block_user_agents = 1) {
return 403;
}
_EOF_
On met une date d’expiration pour activer le cache du navigateur pour ces fichiers.
touch /etc/nginx/template/expire.conf
tee -a /etc/nginx/template/expire.conf << _EOF_
location ~* \.(jpg|jpeg|gif|png|css|js|ico|svg)$ {
access_log off;
log_not_found off;
expires 30d;
}
_EOF_
On rajoute quelques règles de redirection pour le sitemap du plugin Yoast de WordPress.
touch /etc/nginx/template/wp_sitemap.conf
tee -a /etc/nginx/template/wp_sitemap.conf << _EOF_
location ~ ([^/]*)sitemap(.*)\.x(m|s)l\$ {
rewrite ^/sitemap\.xml\$ /index.php?sitemap=1 last;
rewrite ^/([a-z]+)?-?sitemap\.xsl\$ /index.php?xsl=\$1 last;
rewrite ^/sitemap_index\.xml\$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml\$ /index.php?sitemap=\$1&sitemap_n=\$2 last;
## following lines are options. Needed for wordpress-seo addons
rewrite ^/news_sitemap\.xml\$ /index.php?sitemap=wpseo_news last;
rewrite ^/locations\.kml\$ /index.php?sitemap=wpseo_local_kml last;
rewrite ^/geo_sitemap\.xml\$ /index.php?sitemap=wpseo_local last;
rewrite ^/video-sitemap\.xsl\$ /index.php?xsl=video last;
access_log off;
}
_EOF_
On créé fichier PHP avec « Hello World » pour pouvoir tester notre serveur.
rm /etc/nginx/conf.d/default.conf
mkdir -p /var/www/root/
echo 'Hello World' | tee -a /var/www/root/index.php
On configure un système Authentification d’accès de base (basic access authentication) lorsqu’on accède par l’IP.
mkdir -p /var/password/
htpasswd -b -c /var/password/.htpasswd root ${MY_PASSWORD_ROOT}
touch /etc/nginx/conf.d/0default.conf
tee -a /etc/nginx/conf.d/0default.conf << _EOF_
include template/params.conf;
server {
listen 80 default_server;
root /var/www/root;
index index.php index.html index.htm;
server_name _;
location / {
auth_basic 'Administrator Login';
auth_basic_user_file /var/password/.htpasswd;
try_files \$uri \$uri/ \$uri.php;
}
include template/php.conf;
}
_EOF_
Dans un premier temps, on crée le répertoire et la configuration du site web sans HTTPS.
mkdir -p /var/www/sites
mkdir -p /var/www/sites/${domain}/public_html/
touch /var/www/sites/${domain}/public_html/index.html
touch /etc/nginx/conf.d/${domain}.conf
tee -a /etc/nginx/conf.d/${domain}.conf << _EOF_
server {
listen 80;
root /var/www/sites/${domain}/public_html;
index index.php index.html index.htm;
server_name ${domain}
www.${domain};
include template/php.conf;
location / {
try_files \$uri \$uri/ /index.php?q=\$uri&\$args;
}
}
_EOF_
Redémarre le serveur Nginx.
systemctl start nginx
On installe Let’s encrypt (certbot).
apt-get install python-certbot-nginx -t stretch-backports -y
On génère un certificat SSL (HTTPS).
certbot certonly -n --keep-until-expiring --agree-tos --nginx -m ${MY_EMAIL} -d ${domain} -d www.${domain}
On recrée la configuration du site web, mais en HTTPS cette fois-ci.
rm /etc/nginx/conf.d/${domain}.conf
touch /etc/nginx/conf.d/${domain}.conf
tee -a /etc/nginx/conf.d/${domain}.conf << _EOF_
server {
listen 443 ssl http2;
root /var/www/sites/${domain}/public_html;
index index.php index.html index.htm;
server_name ${domain}
www.${domain};
include template/php.conf;
include template/exploit.conf;
include template/wp_sitemap.conf;
include template/expire.conf;
location / {
try_files \$uri \$uri/ /index.php?q=\$uri&\$args;
}
rewrite /wp-admin$ \$scheme://\$host\$uri/ permanent;
ssl_certificate /etc/letsencrypt/live/${domain}/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/${domain}/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
listen 80;
server_name ${domain} www.${domain};
return 301 https://www.${domain}$request_uri;
}
_EOF_
Installer PhpMyAdmin
phpMyAdmin est une application Web de gestion pour les systèmes de gestion de base de données.
On va l’installer sur notre serveur.
cd /var/www/root/
wget https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.zip
unzip phpMyAdmin-${PMA_VERSION}-all-languages.zip
mv phpMyAdmin-${PMA_VERSION}-all-languages phpmyadmin
cd /var/www/
chown www-data:www-data -Rf root
chown www-data:www-data -Rf sites
Redémarre le serveur Nginx.
systemctl restart nginx
Installer un serveur FTP
Pour pouvoir transférer des fichiers sur le serveur, on va installer un serveur FTP.
Pour cela, on va installer le logiciel VsFTPd, c’est un logiciel très sécurisé, développé par Chris Evans.
useradd -m ftpuser1
echo "ftpuser1:${MY_PASSWORD_FTP}" | chpasswd
apt-get install vsftpd -y
systemctl enable vsftpd
systemctl start vsftpd
Création de l’utilisateur FTP
On créé un certificat SSL et un utilisateur (« ftpuser1 ») pour se connecter en FTP.
mkdir -p /var/ssl
openssl req -x509 -nodes -days 36500 -subj "/C=XX/ST=Country/L=City/CN=default" -newkey rsa:2048 -keyout /var/ssl/vsftpd.pem -out /var/ssl/vsftpd.pem
chmod 600 /var/ssl/vsftpd.pem
echo "ftpuser1" | tee -a /etc/vsftpd.chroot_list
Configurer Vsftpd
On configure vsftpd.
mv /etc/vsftpd.conf /etc/vsftpd.conf.backup
touch /etc/vsftpd.conf
tee -a /etc/vsftpd.conf << _EOF_
listen_port=2121
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_file=/etc/vsftpd.chroot_list
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=ftp
allow_writeable_chroot=YES
local_root=/var/www/sites
guest_enable=YES
chown_uploads=YES
chown_username=www-data
guest_username=www-data
nopriv_user=www-data
virtual_use_local_privs=YES
pasv_enable=YES
pasv_min_port=1060
pasv_max_port=1069
pasv_address=${MY_PUBLIC_IP}
rsa_cert_file=/var/ssl/vsftpd.pem
ssl_enable=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
_EOF_
On redémarre la tâche de fond.
systemctl restart vsftpd
Vérifications
Une fois que nous avons configuré notre serveur, nous allons vérifier que tout marche bien.
Accès au serveur
Tout d’abord, nous allons vérifier que notre serveur est bien accessible.
Tapez l’adresse IP de votre serveur dans le navigateur
Comme ceci : http://votreIP
Comme nous avons mis en place un système d’Authentification d’accès de base.
Vous devriez voir une boite de dialogue apparaitre, vous demandant un « Utilisateur » et « Mot de passe ».
Tapez
Utilisateur : « root »
Mot de passe : « le motdepasse1 que vous avez choisi »
Puis OK.
Si vous voyez une page blanche avec « Hello world », c’est que votre serveur fonctionne.
Accès au site
Vous devriez aussi avoir accès à votre site en tapant l’adresse de votre site web dans le navigateur internet.
Ex : https://www.monsuperwebsite.com
Une page blanche devrait s’afficher vu que l’on a placé par défaut un fichier index.html.
Accès au gestionnaire de base de données
Nous avons installé aussi phpMyAdmin, un gestionnaire de base de données.
Tapez l’IP de votre serveur (sauvegardé dans le bloc-notes) suivi de slash « phpmyadmin ».
http://votreIP/phpmyadmin
La boite de dialogue Authentification d’accès de base devrait apparaitre (Tapez « root » et votre « motdepasse1 »).
L’interface phpMyAdmin s’affichera.
Pour vous connecter à phpMyAdmin :
Tapez
Utilisateur : « admin »
Mot de passe : « le motdepasse2 que vous avez choisi »
Puis Exécuter.
Accès au FTP
Et enfin l’accès au serveur FTP.
Pour cela, vous devrez installer un client FTP comme « Filezilla ».
https://filezilla-project.org/
Téléchargez et installez Filezilla.
Ouvrez Filezilla.
Cliquez sur l’icône serveur en haut à gauche.
Une nouvelle fenêtre va apparaitre.
Tapez dans les champs suivants :
Host : « l’adresse IP de votre serveur »
Port : « 2121 »
User « ftpuser1 »
Password : « le motdepasse3 que vous avez choisi »
Puis Connect.
Une boite de dialogue va vous demander d’accepter un certificat.
Acceptez avec « Yes ».
Vous serrez connecté à votre serveur en FTP.
Il y aura le dossier avec le nom de votre domaine et en sous-répertoire un dossier « public_html ».
C’est dans ce dernier que vous mettrez vos pages web (HTML, PHP, WordPress…).
Voilà, nous avons installé ce qu’il faut sur notre serveur.
Dans la prochaine étape, nous verrons comment installer WordPress sur notre serveur.