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
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 ?
Bonjour,
Merci pour le retour 🙂
Ici les coupures de courants sont rares, hormis de grands orages. J’ai simplement des UPS qui tiennent la charge 15-20 minutes le temps que les serveurs s’arrêtent.
Pour ce qui est des adresses IP publiques, elles sont fournies par votre fournisseur d’accès internet.
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 ?
Hello, regarde ça pour gérer tes mises à jour 🙂 https://www.abyssproject.net/2016/09/gerer-mises-a-jour-de-bsd-linux-windows-ansible/
Merci pour ton partage
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
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
Bonsoir, ou doit on intégrer tes modifications.
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.
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+
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 »
Hello, merci pour ton message 🙂
Oui, tu peux utiliser ton WordPress pour un site e-commerce, la solution pour ça c’est de travailler avec le plug-in woocommerce qui te permettra de faire une boutique en ligne.
Ça marche très très bien 🙂
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 »
Bonjour,
Il n’y a pas de grande différence entre la 10.1 et 10.2 donc tu ne rateras rien de transcendant 🙂
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.
Bonjour,
Il faut que je regarde ça, lors de l’écriture de l’article, le nodejs du dépôt stretch n’était pas compatible.
Merci
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
Hello,
Je ne pourrais pas t’aider pour ça, personnellement je ne me sers plus de PageSpeed.
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 🙂
C’est mieux d’optimiser par soi-même et google aime bien cela aussi 🙂
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
Bonjour,
C’est modifié