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