Monter son serveur Web avec Debian 9

1/52/53/54/55/5 (20 votes, moyenne: 4,25 sur 5)
Loading...
M

Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.


Bonjour à tous,

Aujourd’hui, on va voir comment monter un serveur web de A à Z avec Debian 9 sans passer par un panel d’administration type ISPConfig ou Cpanel.

Les technologies utilisées seront les suivantes : NGINX, MariaDB, PHP 7, UFW, Let’s Encrypt, FreshRSS, WordPress et Ghost

 

Vous devrez évidemment remplacer mes noms de domaines par les vôtres 🙂

 

Installation de Debian 9 :

Pas mal d’hébergeurs ne proposent pas encore des installations de Debian 9 en natif.

Il va donc falloir mettre à jour de Debian 8 vers Debian 9 :

rm /etc/apt/sources.list
nano /etc/apt/sources.list

 

Remplissez le fichier avec ceci :

#Debian Mirrors
deb http://httpredir.debian.org/debian stretch main contrib non-free
deb-src http://httpredir.debian.org/debian stretch main contrib non-free
deb http://httpredir.debian.org/debian stretch-updates main contrib non-free
deb-src http://httpredir.debian.org/debian stretch-updates main contrib non-free

 

Lancez la mise à jour avec ceci :

apt-get update && apt-get dist-upgrade -y

 

Nettoyage et mise à jour du système :

Lancez les commandes suivantes pour partir sur un système propre :

apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get clean

 

Configuration de l’authentification par clé ED25519 :

Lancez la commande suivante si vous êtes sur un Linux pour générer une clé ED25519 :

ssh-keygen -t ed25519

 

Sinon utilisez PuttyGen sur Windows :

 

Copiez ensuite la clé publique sur le serveur avec la commande suivante :

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@machine

 

Configuration de SSH :

Une fois que votre Debian 9 est prêt, ouvrez le fichier de configuration du serveur SSH :

echo "" > /etc/ssh/sshd_config
nano /etc/ssh/sshd_config

 

Et copiez-y ceci :

#Port 22

HostKey /etc/ssh/ssh_host_ed25519_key

PermitRootLogin without-password
AllowUsers root

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

PasswordAuthentication no
PermitEmptyPasswords no

ChallengeResponseAuthentication no

UsePAM yes

X11Forwarding yes

PrintMotd no

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server

KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com
MACs umac-128-etm@openssh.com,umac-128@openssh.com

 

Comment ça le seul moyen d’accès à votre serveur sera par authentification par clé ED25519.

Redémarrez SSHD pour appliquer les paramètres :

systemctl restart sshd

 

Installation des mises à jour :

Installez Unattended-upgrades pour que les mises à jour s’installe automatiquement et needrestart pour redémarrer les services utilisant des bibliothèques dépassées :

apt-get install unattended-upgrades needrestart -y

 

Configurez les mises à jour automatiques avec la commande suivante :

dpkg-reconfigure unattended-upgrades

 

Installation de UFW :

Maintenant on va installer UFW pour filtre les accès entrants sur le serveur.

Installez le pare-feu UFW avec la commande suivante :

apt-get install ufw -y

 

Si vous utilisez IPV6 sur votre serveur, éditez le fichier suivant :

nano /etc/default/ufw

 

Et vérifiez que la ligne IPV6 est bien sur Yes :

IPV6=yes

 

Ensuite, désactivez le pare-feu :

ufw disable

 

Autorisez toutes les connexions sortantes et refusez toutes les connexions entrantes :

ufw default deny incoming
ufw default allow outgoing

 

Maintenant, créez les règles pour autoriser les ports HTTP et HTTPS au web entier :

ufw allow 80
ufw allow 443

Autorisez l’accès SSH uniquement depuis votre adresse IPV4 fixe :

ufw allow from IPV4 to any port 22
ufw allow from IPV6 to any port 22

 

Et activez le pare-feu :

ufw enable

Installation des composants supplémentaires :

On installe maintenant Haveged pour la génération d’entropie et tout ce qui pourrait être utilisé pour la suite :

 apt-get install -y haveged curl git unzip zip dirmngr

Configuration du kernel :

Ouvrez votre fichier de configuration du kernel :

nano /etc/sysctl.conf

 

Et ajoutez les lignes suivantes :

#PERSO

# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000

# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384

# Increase page share factor per process
vm.pmap.pv_entry_max=54272521
vm.pmap.shpgperproc=20000

# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=268435456

# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120

# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068

# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1

# Increase maximum amount of memory allocated to shm

kernel.shmmax = 1073741824

# This will increase the amount of memory available for socket input/output queues
net.ipv4.tcp_rmem = 4096 25165824 25165824
net.core.rmem_max = 25165824
net.core.rmem_default = 25165824
net.ipv4.tcp_wmem = 4096 65536 25165824
net.core.wmem_max = 25165824
net.core.wmem_default = 65536
net.core.optmem_max = 25165824

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

# you shouldn't be using conntrack on a heavily loaded server anyway, but these are
# suitably high for our uses, insuring that if conntrack gets turned on, the box doesn't die
# net.ipv4.netfilter.ip_conntrack_max = 1048576
# net.nf_conntrack_max = 1048576

# For Large File Hosting Servers
net.core.wmem_max = 1048576
net.ipv4.tcp_wmem = 4096 87380 524288

# Use swap when we have less than 10% of the physical memory available
vm.swappiness=10

 

Redémarrez ensuite le serveur :

reboot

 

Installation du serveur web NGINX :

On va builder NGINX à la main avec le script suivant : https://github.com/stylersnico/nginx-openssl-chacha-naxsi

Lancez la commande suivante pour se faire (et relancez-la pour faire les mises à jour :

cd /tmp && wget --no-check-certificate https://raw.githubusercontent.com/stylersnico/nginx-openssl-chacha/master/build.sh && sh build.sh

 

Les réponses aux deux questions seront n

 

Installation du serveur de bases de données MariaDB :

On installe MariaDB depuis les dépôts de l’éditeur :

apt-get install software-properties-common -y
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.2/debian stretch main'
apt-get update && apt-get install -y mariadb-server

 

Ensuite, on lance la commande suivante pour sécuriser l’installation :

mysql_secure_installation

 

Installation de PHP 7 :

Installez PHP 7.0-FPM et les modules les plus communs avec la commande suivante :

apt-get install -y php-common php-pear php-zip php7.0-cli php7.0-common php7.0-curl php7.0-dev php7.0-fpm php7.0-gd php7.0-imap php7.0-intl php7.0-json php7.0-mbstring php7.0-mysql php7.0-opcache php7.0-pspell php7.0-readline php7.0-recode php7.0-snmp php7.0-tidy php7.0-xml php7.0-zip

 

Créez le répertoire des sockets avec la commande suivante :

mkdir -p /var/lib/php7.0-fpm/

 

Installation de Let’s Encrypt :

Ici, on récupère Let’s Encrypt pour générer les certificats SSL gratis par la suite :

cd /etc
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

 

Installation de NodeJS :

Si vous souhaitez installer un blog Ghost ou des applications en NodeJS lancez les commandes suivantes :

wget -O- https://deb.nodesource.com/setup_4.x | bash
apt-get install -t jessie nodejs -y

 

Installation d’un blog Ghost :

Maintenant, téléchargez et installez la dernière version de Ghost sur votre serveur :

mkdir -p /var/www/ghost && cd /var/www/ghost
wget https://ghost.org/zip/ghost-latest.zip && unzip ghost-latest.zip
npm install --production

 

Copiez la configuration par défaut et ajoutez votre nom de domaine dans la configuration de Ghost :

cp config.example.js config.js && nano config.js

 

Remplacez les lignes :

URL: 'http://my-ghost-blog.com',

 

Par (remplacez votre domaine puis précisez déjà le protocole en https) :

URL: 'https://www.nicolas-simond.com',

 

Maintenant, créez l’utilisateur pour Ghost :

adduser ghost

 

Et ajoutez-lui les droits sur le site :

chown -R ghost:ghost /var/www/ghost

 

Ajoutez ensuite cet utilisateur dans le groupe des sudoers :

adduser ghost sudo

 

Automatiser le lancement de Ghost :

Maintenant, on va installer Forever qui nous permettra de gérer le serveur Ghost plus facilement et qui en plus nous permettra de le lancer automatiquement au démarrage.

Connectez-vous d’abord sur l’utilisateur Ghost :

su ghost

 

Maintenant, lancez les commandes suivantes pour installer forever :

cd /var/www/ghost
sudo npm install -g forever

 

Ensuite, lancez votre blog ghost avec la commande suivante :

NODE_ENV=production forever start index.js

 

Pour finir, automatisez le lancement de Ghost au démarrage en ajoutant ceci dans votre crontab (crontab -e) :

@reboot NODE_ENV=production forever start /var/www/ghost/index.js

 

Mise en place du reverse proxy Nginx :

Téléchargez une configuration de reverse proxy NGINX :

mkdir /etc/nginx/conf.d/ && cd  /etc/nginx/conf.d/
wget https://raw.githubusercontent.com/stylersnico/my-webserver/master/etc/nginx/conf.d/proxy.conf

 

Créez votre vhost pour Ghost :

nano /etc/nginx/sites-enabled/ghost.vhost

 

Et remplissez-le avec ceci (en modifiant le server_name pour mettre votre domaine) :

server {
        listen 80;
        server_name nicolas-simond.com www.nicolas-simond.com;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   Host      $http_host;
            proxy_pass         http://127.0.0.1:2368;
        }

        #Dossier pour l'hébergement de fichiers types PDF|ZIP ...
        location /static/ {
                alias /var/www/ghost/static/;
        }

        #Renouvellement automatique pour le certificat Let's Encrypt
        location /.well-known/acme-challenge {
                alias /var/www/ghost/.well-known/acme-challenge/;
        }

}

 

Créez le dossier et redémarrez Nginx :

mkdir /var/www/ghost/static && systemctl restart nginx

 

Mise en place du certificat Let’s Encrypt :

Maintenant, on va installer un certificat ECDSA pour le blog ghost.

Créez les dossiers nécessaires avec les commandes suivantes :

mkdir /etc/letsencrypt/live-ecdsa/
mkdir /etc/letsencrypt/live-ecdsa/nicolas-simond.com
cd /etc/letsencrypt/live-ecdsa/nicolas-simond.com
mkdir letmp

 

Maintenant, créez la clé privée pour votre certificat :

openssl ecparam -genkey -name secp384r1 > privkey-p384.pem

 

Maintenant, créez un CSR, indiquez votre domaine correctement :

openssl req -new -sha256 -key privkey-p384.pem -subj "/CN=nicolas-simond.com" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:nicolas-simond.com,DNS:www.nicolas-simond.com")) -outform der -out csr-p384.der

 

Rendez-vous dans le dossier temporaire « letmp » et créez votre certificat avec Let’s Encrypt :

cd letmp
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email mail@yolo.com --webroot-path /var/www/ghost/ --csr /etc/letsencrypt/live-ecdsa/nicolas-simond.com/csr-p384.der --renew-by-default --agree-tos
cat 0001* > /etc/letsencrypt/live-ecdsa/nicolas-simond.com/chain.pem

 

Si l’opération réussie, vous devrez juste configurer le certificat ECDSA dans votre vhost nginx ?

ssl_certificate /etc/letsencrypt/live-ecdsa/nicolas-simond.com/chain.pem;
ssl_certificate_key /etc/letsencrypt/live-ecdsa/nicolas-simond.com/privkey-p384.pem;

 

Éditez votre vhost nginx pour rajouter les informations nécessaires :

server {
        listen 80;
        listen 443 ssl  http2;

        if ($scheme != "https") {
            rewrite ^ https://$http_host$request_uri? permanent;
        }

        ssl_certificate /etc/letsencrypt/live-ecdsa/nicolas-simond.com/chain.pem;
        ssl_certificate_key /etc/letsencrypt/live-ecdsa/nicolas-simond.com/privkey-p384.pem;

		server_name nicolas-simond.com www.nicolas-simond.com;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   Host      $http_host;
            proxy_pass         http://127.0.0.1:2368;
        }

        location /static/ {
                alias /var/www/ghost/static/;
        }
        location ~ ^/(keybase.txt) {
                root /var/www/ghost/;
        }

        location /.well-known/acme-challenge {
                alias /var/www/ghost/.well-known/acme-challenge/;
        }

}

 

Et redémarrez votre serveur pour tester le bon fonctionnement du bordel ?

En cas d’erreur, relancez la commande suivante en root :

chown -R ghost:ghost /var/www/ghost/

 

Et la commande suivante avec l’utilisateur ghost :

forever restartall

 

Lancez la commande suivante pour voir l’état de l’instance ghost :

forever list

 

Et maintenant, accédez à l’installateur du blog ghost depuis l’URL suivante :

https://www.nicolas-simond.com/ghost/setup/one/

 

 

Installation d’un blog WordPress :

Maintenant, téléchargez et installez la dernière version de WordPress sur votre serveur :

cd /var/www/
wget https://fr.wordpress.org/wordpress-4.8-fr_FR.zip && unzip wordpress*.zip && rm wordpress*.zip

 

Maintenant, créez l’utilisateur pour wordpress :

adduser wordpress

 

Et ajoutez-lui les droits sur le site :

chown -R wordpress:www-data /var/www/wordpress

 

Ajoutez ensuite cet utilisateur dans le groupe www-data :

adduser wordpress www-data

 

Création du fichier de configuration NGINX :

Créez le vhost avec la commande suivante :

nano /etc/nginx/sites-enabled/wordpress.vhost

 

Et copiez-y ceci :

server {
        listen 80;


	if ($http_host = abyssproject.net){
            return 303 https://www.abyssproject.net$request_uri;
	}

        server_name abyssproject.net www.abyssproject.net;

        root   /var/www/wordpress/;

        location /.well-known/acme-challenge {
                alias /var/www/wordpress/.well-known/acme-challenge/;
        }

        index index.php;


        error_log /var/log/abyssproject.net/error.log;
        access_log /var/log/abyssproject.net/access.log combined;

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }


        location ~ \.php$ {
            try_files /e1d4ea2d073f20faebaf9539ddde872c.htm @php;
        }

        location @php {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/lib/php7.0-fpm/wordpress.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }




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

        location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
            expires                     max;
            add_header                  Pragma public;
            add_header                  Cache-Control "public, must-revalidate, proxy-revalidate";
        }


}

 

Créez les dossiers de log :

mkdir -p /var/log/abyssproject.net/

 

Création du fichier de configuration PHP :

Créez le pool fpm avec la commande suivante :

nano /etc/php/7.0/fpm/pool.d/wordpress.conf

 

Et copiez-y ceci :

[wordpress]

listen = /var/lib/php7.0-fpm/wordpress.sock
listen.owner = wordpress
listen.group = www-data
listen.mode = 0660

user = wordpress
group = www-data

pm = dynamic
pm.max_children = 32
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16
pm.max_requests = 40000

chdir = /

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

 

Redémarrez les services avec la commande suivante :

systemctl restart nginx && systemctl restart php7.0-fpm

 

Création de la base de données :

Connectez-vous en root avec la commande suivante :

mysql -u root -p

 

Créez la base de données pour WordPress :

CREATE DATABASE wordpress;

 

Créez l’utilisateur :

CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'password';

 

Donnez les droits à l’utilisateur sur la base de données :

GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';

 

Appliquez les droits et sortez :

FLUSH PRIVILEGES;
exit

Mise en place du certificat Let’s Encrypt :

Maintenant, on va installer un certificat ECDSA pour le blog WordPress.

Créez les dossiers nécessaires avec les commandes suivantes :

mkdir /etc/letsencrypt/live-ecdsa/
mkdir /etc/letsencrypt/live-ecdsa/abyssproject.net
cd /etc/letsencrypt/live-ecdsa/abyssproject.net
mkdir letmp

 

Maintenant, créez la clé privée pour votre certificat :

openssl ecparam -genkey -name secp384r1 > privkey-p384.pem

 

Maintenant, créez un CSR, indiquez votre domaine correctement :

openssl req -new -sha256 -key privkey-p384.pem -subj "/CN=abyssproject.net" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:abyssproject.net,DNS:www.abyssproject.net")) -outform der -out csr-p384.der

 

Rendez-vous dans le dossier temporaire « letmp » et créez votre certificat avec Let’s Encrypt :

cd letmp
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email mail@yolo.com --webroot-path /var/www/wordpress/ --csr /etc/letsencrypt/live-ecdsa/abyssproject.net/csr-p384.der --renew-by-default --agree-tos
cat 0001* > /etc/letsencrypt/live-ecdsa/abyssproject.net/chain.pem

 

Si l’opération réussie, vous devrez juste configurer le certificat ECDSA dans votre vhost nginx ?

ssl_certificate /etc/letsencrypt/live-ecdsa/abyssproject.net/chain.pem;
ssl_certificate_key /etc/letsencrypt/live-ecdsa/abyssproject.net/privkey-p384.pem;

 

Éditez votre vhost nginx pour rajouter les informations nécessaires :

server {
        listen 80;
        listen 443 ssl  http2;

        ssl_certificate /etc/letsencrypt/live-ecdsa/abyssproject.net/chain.pem;
        ssl_certificate_key /etc/letsencrypt/live-ecdsa/abyssproject.net/privkey-p384.pem;

        if ($scheme != "https") {
            rewrite ^ https://$http_host$request_uri? permanent;
        }

	if ($http_host = abyssproject.net){
            return 303 https://www.abyssproject.net$request_uri;
	}

        server_name abyssproject.net www.abyssproject.net;

        root   /var/www/wordpress/;

        location /.well-known/acme-challenge {
                alias /var/www/wordpress/.well-known/acme-challenge/;
        }

        index index.php;



        error_log /var/log/abyssproject.net/error.log;
        access_log /var/log/abyssproject.net/access.log combined;

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }


        location ~ \.php$ {
            try_files /e1d4ea2d073f20faebaf9539ddde872c.htm @php;
        }

        location @php {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/lib/php7.0-fpm/tap.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }




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

        location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
            expires                     max;
            add_header                  Pragma public;
            add_header                  Cache-Control "public, must-revalidate, proxy-revalidate";
        }


}

 

Redémarrez ensuite NGINX et accédez à l’URL du blog pour l’installer :

https://www.abyssproject.net/

 

Installation de Fresh RSS:

Maintenant, téléchargez et installez la dernière version de WordPress sur votre serveur :

cd /var/www/
wget https://github.com/FreshRSS/FreshRSS/archive/master.zip && unzip master.zip && rm master.zip && mv FreshRSS-master/ rss/

 

Maintenant, créez l’utilisateur pour Fresh RSS :

adduser rss

 

Et ajoutez-lui les droits sur le site :

chown -R rss:www-data /var/www/rss

 

Ajoutez ensuite cet utilisateur dans le groupe www-data :

adduser rss www-data

 

Création du fichier de configuration NGINX :

Créez le vhost avec la commande suivante :

nano /etc/nginx/sites-enabled/rss.vhost

 

Et copiez-y ceci :

server {
        listen 80;

	server_name rss.nicolas-simond.com;

        root   /var/www/rss/;


        index index.html index.php;


        location /.well-known/acme-challenge {
                alias /var/www/rss/.well-known/acme-challenge/;
        }


        error_log /var/log/rss.nicolas-simond.com/error.log;
        access_log /var/log/rss.nicolas-simond.com/access.log combined;

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }


        location ~ ^.+?\.php(/.*)?$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/lib/php7.0-fpm/rss.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }


        location / {
            try_files $uri $uri/ index.php;
        }

}

 

Créez les dossiers de log :

mkdir -p /var/log/rss.nicolas-simond.com/

Création du fichier de configuration PHP :

Créez le pool fpm avec la commande suivante :

nano /etc/php/7.0/fpm/pool.d/rss.conf

 

Et copiez-y ceci :

[rss]

listen = /var/lib/php7.0-fpm/rss.sock
listen.owner = rss
listen.group = www-data
listen.mode = 0660

user = rss
group = www-data

pm = dynamic
pm.max_children = 32
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16
pm.max_requests = 40000

chdir = /

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

 

Redémarrez les services avec la commande suivante :

systemctl restart nginx && systemctl restart php7.0-fpm

 

Création de la base de données :

Connectez-vous en root avec la commande suivante :

mysql -u root -p

 

Créez la base de données pour WordPress :

CREATE DATABASE freshrss;

 

Créez l’utilisateur :

CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'password';

 

Donnez les droits à l’utilisateur sur la base de données :

GRANT ALL PRIVILEGES ON freshrss.* TO 'freshrss'@'localhost';

 

Appliquez les droits et sortez :

FLUSH PRIVILEGES;
exit

Mise en place du certificat Let’s Encrypt :

Maintenant, on va installer un certificat ECDSA pour Fresh RSS.

Créez les dossiers nécessaires avec les commandes suivantes :

mkdir /etc/letsencrypt/live-ecdsa/
mkdir /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com
cd /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com
mkdir letmp

 

Maintenant, créez la clé privée pour votre certificat :

openssl ecparam -genkey -name secp384r1 > privkey-p384.pem

 

Maintenant, créez un CSR, indiquez votre domaine correctement :

openssl req -new -sha256 -key privkey-p384.pem -subj "/CN=rss.nicolas-simond.com" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:rss.nicolas-simond.com")) -outform der -out csr-p384.der

 

Rendez-vous dans le dossier temporaire « letmp » et créez votre certificat avec Let’s Encrypt :

cd letmp
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email mail@yolo.com --webroot-path /var/www/rss/ --csr /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/csr-p384.der --renew-by-default --agree-tos
cat 0001* > /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/chain.pem

 

Si l’opération réussie, vous devrez juste configurer le certificat ECDSA dans votre vhost nginx ?

ssl_certificate /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/chain.pem;
ssl_certificate_key /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/privkey-p384.pem;

 

Éditez votre vhost nginx pour rajouter les informations nécessaires :

server {
        listen 80;
        listen 443 ssl  http2;

        ssl_certificate /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/chain.pem;
        ssl_certificate_key /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/privkey-p384.pem;

        server_name rss.nicolas-simond.com;

        root   /var/www/rss/;


        index index.php;

        if ($scheme != "https") {
            rewrite ^ https://$http_host$request_uri? permanent;
        }

        location /.well-known/acme-challenge {
                alias /var/www/rss/.well-known/acme-challenge/;
        }


        error_log /var/log/rss.nicolas-simond.com/error.log;
        access_log /var/log/rss.nicolas-simond.com/access.log combined;

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }


        location ~ ^.+?\.php(/.*)?$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/lib/php7.0-fpm/rss.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
        }


        location / {
            try_files $uri $uri/ index.php;
        }

}

 

Redémarrez ensuite NGINX et accédez à l’URL de FreshRSS pour l’installer :

https://rss.nicolas-simond.com/

 

Renouvellement des certificats :

Pour finir, il va falloir renouveler les certificats comme on les a créés car le client Certbot de Let’s Encrypt ne supporte pas encore totalement la génération de certificats ECDSA.

Créez le script de renouvellement :

nano /root/renew-certs.sh

 

Remplissez-le avec les commandes de génération de certificats pour vos domaines :

#!/bin/bash

cd /etc/letsencrypt/live-ecdsa/abyssproject.net/letmp
rm *
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email nicolas@abyssproject.net --webroot-path /var/www/wordpress/ --csr /etc/letsencrypt/live-ecdsa/abyssproject.net/csr-p384.der --renew-by-default --agree-tos
cat 0001* > ../chain.pem

cd /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/letmp
rm *
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email nicolas@abyssproject.net --webroot-path /var/www/rss/ --csr /etc/letsencrypt/live-ecdsa/rss.nicolas-simond.com/csr-p384.der --renew-by-default --agree-tos
cat 0001* > ../chain.pem

cd /etc/letsencrypt/live-ecdsa/nicolas-simond.com/letmp
rm *
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email nicolas@abyssproject.net --webroot-path /var/www/ghost/ --csr /etc/letsencrypt/live-ecdsa/nicolas-simond.com/csr-p384.der --renew-by-default --agree-tos
cat 0001* > ../chain.pem

service nginx reload

 

Rendez le script exécutable :

chmod +x /root/renew-certs.sh

 

Et ajoutez le dans votre crontab pour le renouvellement automatique tous les mois :

0 12 1 * * /root/renew-certs.sh > > /dev/null 2>&1

 

Pour finir :

Vous l’aurez surement remarqué, toutes ces configurations sont celles de mes sites, le tout est disponible sur mon Github 🙂 https://github.com/stylersnico/my-webserver

 

 

A propos de l'auteur

Nicolas Simond

Ingénieur Systèmes et Réseaux et guitariste hard rock et metal à mes heures perdues.
Je suis le créateur et l'unique rédacteur d'Abyss Project, c'est ici que je note la plupart de mes procédures et quelques divagations.

Si vous l'article vous a aidé, pensez à me payer un café :)

Subscribe
Notify of
guest

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

37 Commentaires
Plus récents
Plus anciens Populaires
Inline Feedbacks
View all comments
lemx
lemx
5 années plus tôt

Bonjour
Je viens de découvrir votre blog et j’aimerais vous dire que vos articles sont plus qu’intéressants.Vous m’avez donné l’envie de me lancer dans l’auto-hebergement
Du coup ,je me demande comment vous gérez la continuité (ici il y a parfois délestage 🙁 ).Avez vous des sources de courants secondaires?
Aussi pouvez vous me dire plus sur les adresses IP publiques : vers quel fournisseur de services se retourner ?

Victor
Victor
6 années plus tôt

Super tuto, merci. du coup maintenant je me retrouve avec 5 serveurs sur mon homelab, j’ai installer librenms avec osupdate manque plus que quelque chose pour automatisé/installé les mise a jour en centralisé, qu’est ce que tu conseil pour arrivé a cela ?

Jérôme
Jérôme
6 années plus tôt

Merci pour ton partage

habnai
habnai
6 années plus tôt

hi when i try to compile nginx i get this error :Saving to: ‘nginx__dynamic_tls_records_1.13.0+.patch’

« nginx__dynamic_tls_records_ 100%[===========================================>] 8.13K –.-KB/s in 0s
2018-01-25 12:13:37 (47.2 MB/s) – ‘nginx__dynamic_tls_records_1.13.0+.patch’ saved [8325/8325]
build.sh: 76: build.sh: cannot open nginx__dynamic_tls_records_1.13*.patch: No such file »
any solution.merci

OliCat
6 années plus tôt

Bonjour,

Tout d’abord merci pour cet excellent tuto et pour le script. Au sujet de ce dernier, j’ai du opérer quelques modifications pour qu’il fonctionne :
[…]
– patch -p1 < nginx__dynamic_tls_records_1.13*.patch
+ patch -p1 < nginx__dynamic_tls_records_1.13.0+.patch
[…]
[…]
– –add-module=../headers-more-nginx-module-0.32 \
+ –add-module=../headers-more-nginx-module-0.33 \
[…]

Enfin, au moment de démarrer le service nginx, il manque le répertoire /usr/local/etc/nginx/body donc :

mkdir -p /usr/local/etc/nginx/body

Merci beaucoup pour le travail effectué 🙂

OliCat

VANBIES
VANBIES
Reply to  OliCat
6 années plus tôt

Bonsoir, ou doit on intégrer tes modifications.

VANBIES
VANBIES
6 années plus tôt

Bonjour Nicolas, j’aimerais installer mysql plutôt que Maria DB peut on le faire, et puis je avec tes recommandations lancer plusieurs site sous nodejs/express, d’avance merci. Jean-François. Et bravo pour ton blog.

frankish
frankish
6 années plus tôt

Salut,

J’ai un site mega surper lent, cela vient de CF ?

Normal, d’avoir des process nginx connecté au DNS 8.8.8.8 et 8.8.4.4 ? ou les trouve t il ?

A+

frankish
frankish
6 années plus tôt

Salut, Déja, bravo, je cherchais a installer word press sur debian, mais je pensais pas en plus y trouver le tunning kernel pour l’engin… Bon , disons le je t’accorde 50% de mes douze coeurs , le temps de lecture, et le temps que je reviendrais sur ce blog et site. Oui les bonnes workstation HP d’occase, faut le dire c’est de la bombe (trop fier de mon achat). Penses tu qu’avec wordpress et un pluggin dédié, la voie du site e-commerce soit réalisable et surtout COMMERCIALE ?! CAD que l’on peux en faire beaucoup de chose, surtout ESTHETIQUE et… Voir plus »

frankish
frankish
Reply to  Nicolas Simond
6 années plus tôt

Bonjour et grand honneur que tu me fais a me repondre ! Je suis sur debian buster, donc ca coince, avec ces vieux ftp pas a jour 🙂 Je recupere les sources et j’envoi la compile de la 10.2 ? ou bien avec le package de buster mariadb, ca fera l’affaire ? Ce doit etre une 10.1 en package buster de base ? vais je rater un truc important ? Bon j’y vais mollo, je veux une bonne base et apres j’attaque la partie esthetique….. ca me fait deja peur. Mais j’ai deja les idées, mon experience d’oric atmos et… Voir plus »

AdrienDS
AdrienDS
7 années plus tôt

Bonjour,
Pour Debian 9 il faut modifier cette ligne:
« apt-get install -t jessie nodejs -y »
par
« apt-get install -t stretch nodejs -y »
Cordialement.

loulou
loulou
7 années plus tôt

Salut Nico,

Que dis tu d’ajouter pagespeed à ton script ?

J’ai ajouté :
#[check the release notes for the latest version]
#NPS_VERSION=1.12.34.2-stable
wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip
unzip v1.12.34.2-stable.zip
cd ngx_pagespeed-1.12.34.2-stable/
#NPS_RELEASE_NUMBER=1.12.34.2-stable/stable/}
psol_url=https://dl.google.com/dl/page-speed/psol/1.12.34.2-stable-stable.tar.gz
[ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget ${psol_url}
tar -xzvf $(basename ${psol_url}) # extracts to psol/

Puis :
–add-module=/usr/src/ngx_pagespeed-release-1.12.34.2-stable

Mais j’ai une erreur avant meme la compilation, qu’en dis tu?

PS:
Merci pour ton job, tes billets sont tous très utiles

loulou
loulou
Reply to  Nicolas Simond
7 années plus tôt

Juste par curiosité, pourquoi ? Est-ce que tu le considère comme inutile ou est-ce que tu préfère optimiser par toi même ? Je t’avoue que je l’installe seulement dans un soucis de satisfaire sa majesté google 🙂

claude
claude
Reply to  loulou
6 années plus tôt

Bonjour il ne manque pas l’ajout de la base de donner wordpress a mariadb ?
pour finir l’installation de wordpress il faut ajouter la base de donner a mariadb .
si non bon tuto