Tutoriel | Configurer la réplication master/slave d’une instance PostgreSQL

Article publié le 7 Septembre 2018

Un petit tutoriel sur la manière la plus facile de mettre en place une réplication Master/Slave d’une instance PostgreSQL. Une réplication Master/Slave est extrêmement utile. Elle vous permettra d’avoir un failover et donc une continuité de service en cas de perte de votre master mais également de répartir la charge en redirigeant toute les requête read-only (select) sur votre slave.

Dans ce tutoriel, deux instances PostgreSQL seront installées sur deux machines distinctes.

 La version utilisée lors de la rédaction de ce tutoriel est la version 10.  Si vous utilisez une version différente de postgresql, ce tutoriel sera toujours valable, seul le chemin du répertoire d’installation de postgresql et certaines commandes changeront légèrement.

 

1)  Configuration du Master

– Éditez votre fichier postgresql.conf (sa localisation diffère en fonction de la distribution et de la version de PostgreSQL installé) et faites les modifications suivantes:

listen_addresses = ‘*’

wal_level = hot_standby

max_wal_senders = <nombre de noeuds dans votre cluster>    # Logiquement 2 dans notre cas master/slave
synchronous_standby_names = ‘<hostname du master>’
wal_keep_segments = 100

– Créez un user dédié à la réplication via cette requête SQL:

create user replica replication;

– Éditez le fichier pg_hba.conf et rajoutez la ligne suivante (permettant ainsi la connexion de votre slave sur votre master):

host     replication     replica     <ip de votre slave>   trust

– Redémarrez enfin votre service PostgreSQL

 

2) Configuration du Slave

– Arrêtez votre instance PostgreSQL.

– Supprimez tout le contenu du répertoire data situé dans le répertoire d’installation de votre instance PostgreSQL

– Lancez la commande suivante afin d’établir le lien avec votre master:

pg_basebackup -D <pgsql_path>/data -h <ip ou fqdn du master> -U replica

– Éditez ou créez si il n’existe pas déja le fichier recovery.conf situé dans le répertoire data et ajoutez y les lignes suivantes:

standby_mode=on
trigger_file=’/tmp/promotedb’
primary_conninfo=’host=<ip ou fqdn du master> port=5432 user=replica application_name='<valeur de synchronous_standby_name indiqué dans le postgresql.conf du master>’

– Changez le owner du répertoire data (suite à sa précédente suppression celui ci a été recréé avec le user root):

chown -R postgres:postgres <pgsql_path>/data

– Editer le fichier postgresql.conf et décommentez (ou ajoutez) la ligne suivante
 hoy_standby=on
– Lancer la commande suivante:
/usr/pgsql/bin/pg_ctl-10 -D /var/lib/pgsql/10/data start

3) Test

Afin de rédiger ce tuto j’ai utilisé 2 machines: vdahmane5 comme master et vdahmane6 comme slave.

Pour tester, j’ai créé une nouvelle base de données sur le master:

Je me connecte ensuite sur le slave et vérifie que la création de la base « testreplica » a bien faite:

La réplication fonctionne!

 Attention toutefois, si jamais des données sont directement insérées dans le slave, votre réplication sera par terre. Il vous faudra la reconstuire.




Tutoriel | Installation d’un cluster ElasticSearch

Article publié le 28 Mars 2018

Un petit tutoriel qui pourra être utile à ceux qui, comme moi, ont souffert de la prise en main d’ElasticSearch ;-).

Ce tutoriel expliquera la marche à suivre pour monter un cluster ElasticSearch.

Dans l’exemple ci-dessous, je vais monter un cluster ElasticSearch composé de trois nœuds.

 

1) Installation

Installez ElasticSearch sur chaque machine (au moment où ce tutoriel a été rédigé, la version courante d’ElasticSearch est la 6.2)

Installation sous Debian:

Téléchargez et installez la clé GPG:

wget -qO – https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –

Ajoutez le répo elasticsearch (à adapter en fonction de la version courante du moment):

echo « deb https://artifacts.elastic.co/packages/6.x/apt stable main » | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Enfin, Installez ElasticSearch

sudo apt-get update && sudo apt-get install elasticsearch

 

Installation sous RedHat:

Téléchargez et installez la clé GPG:

rpm –import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Ajoutez le répo (à adapter en fonction de la version courante du moment):

[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Enfin, installez ElasticSearch

sudo yum install elasticsearch

 

2) Configuration

Chaque machine doit être joignable via le hostname (enregistrement DNS ou fichier host impératif)

– Une fois les noeuds ElasticSearch installés, éditez le fichier /etc/elasticsearch/elasticsearch.yml et remplacez la conf par celle ci-dessous sur chaque nœuds de votre cluster elasticsearch:

cluster.name: moncluster
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

#A sécuriser si nécessaire

network.host: 0.0.0.0
http.port: 9200

# Nombre de noeuds sans compter cette machine
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: [ « <nom dns du noeud 1> », « <nom dns du noeud 2> », « <nom dns du noeud 3> » ]

# Nombre total de nœuds composant votre cluster

gateway.expected_nodes: 3

#Nombre de nœuds sans compter cette machine

gateway.recover_after_nodes: 2
node.name: <nom du noeud>

action.destructive_requires_name: true
bootstrap.memory_lock: true

–  Éditez le fichier de configuration systemd /usr/lib/systemd/system/elasticsearch.service et rajoutez à la fin de ce fichier la ligne suivante:

LimitMEMLOCK=infinity

– Éditez le fichier /etc/security/limits.conf et rajoutez à la fin du fichier les lignes suivantes:

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch – nofile 65536
elasticsearch – nproc 2048

– Désactivez le Swap

swapoff -a

– Les paramètres java sont configurable directement via le ficher de configuration /etc/elasticsearch/jvm.options (notamment les paramètres mémoires)

 

Une fois les nœuds paramétrés, redémarrez le service elasticsearch sur chacune de vos machines

service elasticsearch restart

 

3) Vérification du cluster

Avant toute chose, vous pouvez vérifier dans les logs elasticsearch si vos machines communiquent bien entre elles (/var/log/elasticsearch.log) et avoir quelque chose de similaire à la log ci-dessous:

 

[2018-03-28T13:17:54,213][INFO ][o.e.n.Node ] [els02] starting …
[2018-03-28T13:17:54,379][INFO ][o.e.t.TransportService ] [els02] publish_address {192.168.2.91:9300}, bound_addresses {[::]:9300}
[2018-03-28T13:17:54,390][INFO ][o.e.b.BootstrapChecks ] [els02] bound or publishing to a non-loopback address, enforcing bootstrap checks
[2018-03-28T13:17:57,508][INFO ][o.e.c.s.MasterService ] [els02] zen-disco-elected-as-master ([1] nodes joined)[{els01}{swDhGGuVTfCeRVp79KFpzQ}{NZvRF3JyT72OyoshFARfMw}{192.168.2.29}{192.168.2.29:9300}], reason: new_master {els02}{h-Q4N-ytQ_6G8JWolSklMg}{axcVvf6BTqOfCPM4CPg3-g}{192.168.2.91}{192.168.2.91:9300}, added {{els01}{swDhGGuVTfCeRVp79KFpzQ}{NZvRF3JyT72OyoshFARfMw}{192.168.2.29}{192.168.2.29:9300},}
[2018-03-28T13:17:57,594][INFO ][o.e.c.s.ClusterApplierService] [els02] new_master {els02}{h-Q4N-ytQ_6G8JWolSklMg}{axcVvf6BTqOfCPM4CPg3-g}{192.168.2.91}{192.168.2.91:9300}, added {{els01}{swDhGGuVTfCeRVp79KFpzQ}{NZvRF3JyT72OyoshFARfMw}{192.168.2.29}{192.168.2.29:9300},}, reason: apply cluster state (from master [master {els02}{h-Q4N-ytQ_6G8JWolSklMg}{axcVvf6BTqOfCPM4CPg3-g}{192.168.2.91}{192.168.2.91:9300} committed version [1] source [zen-disco-elected-as-master ([1] nodes joined)[{els01}{swDhGGuVTfCeRVp79KFpzQ}{NZvRF3JyT72OyoshFARfMw}{192.168.2.29}{192.168.2.29:9300}]]])
[2018-03-28T13:17:57,601][INFO ][o.e.g.GatewayService ] [els02] delaying initial state recovery for [5m]. expecting [3] nodes, but only have [2]
[2018-03-28T13:17:57,632][INFO ][o.e.h.n.Netty4HttpServerTransport] [els02] publish_address {192.168.2.91:9200}, bound_addresses {[::]:9200}
[2018-03-28T13:17:57,632][INFO ][o.e.n.Node ] [els02] started
[2018-03-28T13:18:21,135][INFO ][o.e.c.s.MasterService ] [els02] zen-disco-node-join[{els03}{I9Kd4QJ1SZGuHPppMwdS0A}{NSdfQfdfRhCD4_YfhQ18vA}{192.168.2.76}{192.168.2.76:9300}], reason: added {{els03}{I9Kd4QJ1SZGuHPppMwdS0A}{NSdfQfdfRhCD4_YfhQ18vA}{192.168.2.76}{192.168.2.76:9300},}
[2018-03-28T13:18:21,279][INFO ][o.e.c.s.ClusterApplierService] [els02] added {{els03}{I9Kd4QJ1SZGuHPppMwdS0A}{NSdfQfdfRhCD4_YfhQ18vA}{192.168.2.76}{192.168.2.76:9300},}, reason: apply cluster state (from master [master {els02}{h-Q4N-ytQ_6G8JWolSklMg}{axcVvf6BTqOfCPM4CPg3-g}{192.168.2.91}{192.168.2.91:9300} committed version [2] source [zen-disco-node-join[{els03}{I9Kd4QJ1SZGuHPppMwdS0A}{NSdfQfdfRhCD4_YfhQ18vA}{192.168.2.76}{192.168.2.76:9300}]]])
[2018-03-28T13:18:21,372][INFO ][o.e.g.GatewayService ] [els02] recovered [0] indices into cluster_state

Enfin, il existe un plugin Chrome très utiles permettant d’avoir un statut en temps réel de votre cluster elasticsearch: ElasticSearch Head:

 

enjoy !




Tutoriel | Déployez facilement un cluster Kubernetes avec Rancher

Article publiée le 13 Janvier 2018

Article mis à jour le 21 Août 2018

Kubernetes est un orchestrateur de container docker extrêmement puissant mais également très fastidieux à déployer. Il existe pourtant un moyen très simple pour déployer Kubernetes en utilisant Rancher.

Rancher est un outil permettant de gérer vos environnements Docker de manière intuitive via une interface graphique  (site de Rancher: https://rancher.com/)

Pour ce tuto je vais utiliser trois machines sous Debian 9 avec docker installé. Pour ceux qui ne connaissent pas Docker, je leurs suggère de lire le tutoriel ci-dessous:

Tuto Docker | Démarrer avec Docker

Pour info un tutoriel rédigé le 20 Août 2018 explique comment installer Kubernetes from scratch (à la mano!) sur Debian ou Centos . Ce tuto est disponible ici

1) Installation de Rancher

Installer Rancher est très facile, il suffit de déployer le container fournit par l’éditeur:

Au moment de la rédaction de cet article, la version stable de Rancher est la version 1.6. La version 2.0 est une version Alpha en cours de développement (très instable).

Nous allons installer Rancher sur notre première machine:

docker run -d –restart=unless-stopped -p 8080:8080 rancher/server:stable

Une fois le container installé, connectez vous à l’interface Web: <ip de votre machine>:8080

Rancher est installé et opérationnel!

Petite parenthèse, si vous allez dans l’onglet « CATALOG » vous verrez que Rancher peut déployer un large panel d’outils:

 

2) Kubernetes

Revenons en à nos moutons, nous allons maintenant déployer Kubernetes via Rancher.

Dans un premier temps cliquez sur l’onglet « infrastructure » puis « Hosts »

Puis cliquez sur le bouton « Add Host »:

Contentez vous de copier la ligne de commande au paragraphe 5 et de la coller sur toutes les machines Linux qui serviront de nœud à votre infra kubernetes (dans mon cas les 3 machines sous Debian que j’ai créées).

Cette commande va déployer un container contenant un agent Rancher qui va gérer chacune de vos machines!

Retournez dans l’onglet « infrastructure »/ »Hosts » pour vérifier que vos machines sont bien remontées:

Cliquez ensuite sur « Catalog » puis cherchez « Kubernetes » et cliquez sur « View details »:

Laissez tout par défaut et validez en cliquant sur le bouton tout en bas de la page.

Un nouvel onglet  « Kubernetes devrait apparaître. En cliquant dessous, vous pourrez suivre l’avancement de l’installation:

Vous pouvez suivre avec plus de détails l’installation de chaque composant Kubernetes en cliquant sur l’onglet « Kubernetes » puis « Infrastructure Stacks »:

Une fois que tous les statuts seront à « Active », les composants Kubernetes seront installés:

 

Vous pouvez maintenant vous connectez à l’interface Kubernetes en cliquant sur l’onglet « Kubernetes » puis « Dashboard »:

Cliquez sur « Kubernetes UI »:

Vous voila connecté à l’interface Kubernetes.

Pour les personnes ayant plus de connaissances, une interface en ligne de commande est également disponible depuis l’interface de Rancher via l’onglet « Kubernetes »/ »_Cli »:

 

3) Déploiement d’un container

Pour vous prouver que je ne me moque pas de vous et que tout fonctionne, je vais déployer un container apache répliqué sur 2 deux nœuds:

Cliquez sur le bouton « CREATE » en haut à droite et remplissez les champs requis:

Deux container apache ont été déployés sur deux différents nœuds (très pratique pour la tolérance de panne ;-)):

En me connectant sur l’un des nœuds au hasard, mon apache répond bien!

Enjoy!

 




AWX l’alternative gratuite à Ansible Tower

Article publiée le 03 octobre 2017

Tous les utilisateurs connaissent Ansible Tower, l’interface graphique pour gérer Ansible créé par RedHat qui est une solution très onéreuse! Hors une variante opensource existe également sponsorisé depuis peu par RedHat :AWX

Ci-dessous une petite doc d’installation dédiée adaptée aux distributions RedHat/CentOS:

  • Installez Ansible: yum install ansible
  • Créer le fichier install_aws.yml qui contiendra le playbook d’installation AWX:

– name: Deploy AWX
hosts: all
become: true
become_user: root

tasks:

– name: sort out the yum repos
yum:
name: « {{ item }} »
state: « latest »
with_items:
– « epel-release »
– « yum-utils »

– name: add the docker ce yum repo
yum_repository:
name: « docker-ce »
description: « Docker CE YUM repo »
gpgcheck: « yes »
enabled: « yes »
baseurl: « https://download.docker.com/linux/centos/7/$basearch/stable »
gpgkey: « https://download.docker.com/linux/centos/gpg »

– name: install the prerequisites using yum
yum:
name: « {{ item }} »
state: « latest »
with_items:
– « epel-release »
– « libselinux-python »
– « python-wheel »
– « python-pip »
– « git »
– « docker-ce »

– name: start and enable docker
systemd:
name: « docker »
enabled: « yes »
state: « started »

– name: install the python packages using pip
pip:
name: « {{ item }} »
state: « latest »
with_items:
– « pip »
– « ansible »
– « boto »
– « boto3 »
– « docker »

– name: check out the awx repo
git:
repo: « https://github.com/ansible/awx.git »
dest: « ~/awx »
clone: « yes »
update: « yes »

– name: install awx
command: « ansible-playbook -i inventory install.yml »
args:
chdir: « ~/awx/installer »

 

  • Exécutez le playbook (pensez à rajouter votre machine dans le fichier /etc/ansible/hosts):

ansible-playbook -i hosts install_aws.yml

  • Une fois le playbook exécuté vous devriez avoir des container docker monté:

 

  • Connectez vous sur l’interface Web via l’url suivante: http://<ipoudnsdevotremachine>
  • Attendez que l’installation de AWX se finalise:

  • Une fois l’installation terminée authentifiez vous avec les identifiants par défaut (login : admin, mot de passe: password):

 

  • Une fois authentifié le dashboard AWX sera affiché :

Comme vous pouvez le constater l’interface AWX est identique à celle de Tower!

 




Tutoriel | Gérez vos container docker avec Portainer

Article publié le 2 Octobre 2017

Un petit tutoriel afin de vous présenter un outil peu connu mais extrêmement puissant vous permettant de gérer vos environnements Docker avec une simplicité sans égale: Portainer.

Si vous cherchez une interface graphique pour gérer votre environnement docker, portainer est fait pour vous!

Afin de suivre ce tuto, Docker doit-être installé sur votre machine. Un tuto sur l’installation et la configuration de  docker est disponible :

https://journaldunadminlinux.fr/tuto-docker-demarrer-avec-docker/

1) Installation de Portainer

Portainer est livré nativement dans un container docker. Pour le déployer :

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer

Une fois le container déployé connectez vous à l’interface web via l’adresse suivante: http://ipdevotremachine:9000

 

2) Configuration

Lors de la première connexion, il vous sera demandé de créer le mot de passe du user admin:

Il vous sera demandé ensuite de « brancher » votre instance portainer à votre machine Docker.

Dans mon cas mon instance portainer est installée au même endroit que mon instance Docker.

Vous voilà connecté au dashboard:

2.1) Déployer un container

Nous allons tout d’abord faire un pull d’une image, pour cela cliquer sur « images » dans le menu de gauche:

Tapez le nom de l’image Docker que vous voulez utiliser puis cliquez sur « pull » (dans notre cas, nous allons faire un pull de l’image httpd).

Une fois le pull terminé, notre image sera présente dans la liste:

Nous allons maintenant déployer un container docker apache. Pour cela cliquez sur « container »

Puis sur le bouton « Add container ».

Procédez au paramétrage de votre container docker grâce à cette superbe interface intuitive puis cliquez sur le bouton « start container »

 

Votre container est à présent démarré!

En cliquant sur le nom de votre container, vous aurez accès à toute la supervision nécessaire:

 

 

En cliquant sur « Stats »:

2.2) Rajouter une machine docker ou un cluster docker Swarm

Comme vous avez pu le constater dans le chapitre précédent l’interface est extrêmement simple et intuitive. Cet outil vous simplifiera grandement la vie pour gérer vos environnements docker.

Pour rajouter une machine ou un cluster swarm, cliquez sur le bouton « Endpoints » situé dans le menu en bas à gauche

Comme vous l’avez compris grâce à cette fonctionnalité, vous pouvez ajouter et gérer tout vos environnement dockers!

 

Pour plus d’info le github du projet: https://github.com/portainer/portainer et un grand bravo aux développeurs!!




Présentation de Zentyal 5

Article publié le 1er Octobre 2017

Deux après la rédaction de mon article sur la solution IPCOP (https://journaldunadminlinux.fr/tutoriel-securiser-son-reseau-avec-ipcop/), je vais partager aujourd’hui ma nouvelle découverte: Zentyal.

Zentyal est une solution de sécurité (mais pas seulement) Opensource vous offrant pleins de fonctionnalités:

  • Mise en réseau (Networking)
    • Pare-feu (informatique) et routage
      • Filtrage
      • NAT (Network address translation) et redirections de port
      • VLAN 802.1Q (Réseau local virtuel)
      • Support de passerelles IP multiples (PPPoE and DHCP)
      • Règles de passerelle multiple, équilibrage de charge et basculement automatique
      • Lissage du trafic (à l’aide d’une couche d’application)
      • Suivi graphique de la vitesse du trafic
      • Système de détection d’intrusions dans le système
      • Client DNS dynamique
    • Infrastructure réseau
      • Serveur DHCP (Dynamic Host Configuration Protocol)
      • Serveur NTP (Network Time Protocol)
      • Serveur DNS
        • Mises à jour dynamiques via DHCP (Dynamic Host Configuration Protocol)
      • Serveur RADIUS (Remote Authentication Dial-In User Service)
    • Prise en charge VPN
      • Autoconfiguration de routes dynamiques
    • Proxy HTTP
      • Cache Internet
      • Authentification de(s) utilisateur(s)
      • Filtrage de contenu (avec des listes par catégorie)
      • Antivirus transparent
    • Système de détection d’intrusions
    • Serveur mail
      • Domaines virtuels
      • Quotas
      • Soutien pour Sieve
      • Récupération de compte externe
      • POP3 et IMAP avec SSL/TLS
      • Filtre antispam et antivirus
        • Listes grises, noires et blanches
      • Filtre proxy transparent POP3
      • Compte « catch-all » (fourre-tout)
  • Messagerie internet (webmail)
  • Serveur internet (web server)
    • Hôtes virtuels
  • Autorité de certification
  • Travail de groupe (workgroup)
    • Gestion centralisée des utilisateurs et des groupes
      • Soutien maître/esclave
      • Synchronisation avec un contrôleur de domaine Windows Active Directory
    • Windows PDC
      • Système de mot de passe
      • Assistance pour les clients Windows 7
    • Partage des ressources en réseau
      • Serveur de fichiers
        • Antivirus
        • Corbeille
      • Serveur d’impression
    • Groupware: partage de calendriers, agendas, repertoire, boîte mail, wiki, etc.
    • Serveur VoIP
      • Messagerie vocale
      • Salles de conférence
      • Appels via un fournisseur externe
      • Transferts d’appels
      • Parking d’appel
      • Musique d’attente
      • Files d’attente (mise en attente)
      • Journaux d’appels
  • Serveur Jabber et (XMPP)
  • Coin des utilisateurs eBox
  • Suivi et rapports
  • Mises à jour du logiciel
  • Sauvegardes (configuration et sauvegarde de données à distance)

Pour moi, le principal avantage de Zentyal est sa simplicité d’implémentation et toutes les fonctionnalités dont elle dispose. Zentyal est la solution parfaite pour une petite entreprise/startup qui désire monter une infra sans dépenser une fortune.

 

1) Installation/Configuration

Téléchargez directement l’ISO sur le site de Zentyal: http://www.zentyal.org/server/ (Development édition).

Bootez ensuite sur l’ISO:

Sélectionnez la langue d’installation

Sélectionnez « Install Zentyal 5.0.1-development (delete all disk) ».

L’installation se fera ensuite de la même manière que l’installation d’une distribution de Linux classique. D’ailleurs, Zentyal est basé sur une Ubuntu 16.04!

 

2) Présentation des fonctionnalités de Zentyal

Une fois l’installation terminée, connectez vous à l’interface Web de Zentyal via l’adresse:https://ipdevotremchine:8443.

Saisissez les identifiants que vous avez paramétrés durant l’installation:

L’assistant de configuration va démarrer:

 

Sélectionnez les composants qui vous intéressent.

Confirmez l’installation:

L’assistant d’installation va installer tout les paquets demandés:

Procédez aux paramétrages de vos cartes réseaux:

 

Une fois la configuration terminée cliquez sur le bouton « Go to the dashboard »

3) Présentation

Voici l’interface de Zentyal:

Comme vous pouvez le constater, Zentyal est une véritable boite à clic vous permettant d’installer et d’administrer de manière simple le service dont vous avez besoin (Firewall, Routeur, etc…).

Network

Zentyal n’a absolument rien à envier de ses concurrents payant (sophos, sonicwall, etc…):

On appréciera également les fonctionnalités « Balance Traffic » et « Wan Failover » vous permettant respectivement de dispatcher le trafic sortant sur plusieurs sorties internet  (si vous avez deux lignes ) ou de mettre en place une bascule automatique vers une autre ligne internet en cas de perte d’une connexion:

Firewall

L’interface de configuration du Firewall est très bien conçue:

Bref comme vous l’aurez compris Zentyal possède énormément de fonctionnalités à tel point que vous pourriez gérer l’intégralité de l’infra de votre entreprise uniquement avec cette solution.

Il faudrait une bonne centaine de page pour vous présenter l’intégralité des fonctionnalités de Zentyal, c’est pourquoi je vous laisse découvrir par vous-même cette solution absolument géniale!

Enjoy!

 

 




Tutoriel | Répartition de charge en fonction des ressources disponibles sur vos machines avec HAPROXY

Article publiée le 23 Septembre 2017

Il y a quelque temps, je suis tombé sur la problématique suivante: comment faire en sorte que mon LoadBalancer HAProxy répartisse les connexions sur les machines ayant le moins de charge CPU?

Un collègue m’a alors fait suivre une doc qui m’a apporté la solution.

Ci-dessous un petit tuto vous expliquant comment procéder en prenant comme exemple la répartition d’un flux SSH sur 2 machines. Rien ne vous empêche d’adapter ce tuto  pour rediriger d’autres type de connexion (HTTP, etc…)

1) Configuration de votre serveur HAPROXY

  • Installez HAPROXY:

Sous Debian/Ubuntu:

apt-get install haproxy

Sous RedHat/Centos

yum install haproxy

Éditez le fichier /etc/haproxy/haproxy.cfg (pensez à faire une sauvegarde avant) et écrasez le contenu avec la configuration ci-dessous:

global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

 

# turn on stats unix socket

stats socket /var/lib/haproxy/stats

 

defaults
mode tcp
log global
option dontlognull
option http-server-close
#option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

 

 

listen haproxy_servers

#bind correspond au port d’écoute de votre HAPROXY

bind *:2222
mode tcp
option tcplog
timeout client 10800s
timeout server 10800s
#balance leastconn
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 200 maxqueue 250 weight 100 error-limit 10 on-error mark-down on-marked-down shutdown-sessions agent-port 9707 agent-inter 30s
server monserveur1.mondomaine.net monserveur1.mondomaine.net:22 check agent-check observe layer4
server monserveur2.mondomaine.net monserveur2.mondomaine.net:22 check agent-check observe layer4
server localhost 127.0.0.1:22 maxconn 500 backup weight 1

 

backend servers

mode tcp
option tcplog
#balance roundrobin
server monserveur1.mondomaine.net monserveur1.mondomaine.net:22
server monserveur2.mondomaine.net monserveur2.mondomaine.net:22

2) Installation de l’agent sur les machines hôtes

Déployez l’agent en suivant les instructions ci-dessous sur chacune des machines qui recevra la charge.

  • Créez le fichier /usr/local/bin/haproxy-agent-check et insérez le script ci-dessous

#!/bin/bash
LMAX=90

load=$(uptime | grep -E -o ‘load average[s:][: ].*’ | sed ‘s/,//g’ | cut -d’ ‘ -f3-5)
cpus=$(grep processor /proc/cpuinfo | wc -l)

while read -r l1 l5 l15; do {
l5util=$(echo « $l5/$cpus*100″ | bc -l | cut -d ». » -f1);
[[ $l5util -lt $LMAX ]] && echo « up 100% » && exit 0;
[[ $l5util -gt $LMAX ]] && [[ $l5util -lt 100 ]] && echo « up 50% » && exit 0;
echo « down#CPU overload »;
}; done < <(echo $load)

exit 0

  • Ajustez les droits pour que le script soit exécutable:

chmod +x /usr/local/bin/haproxy-agent-check

  • Installez xinetd (apt-get install xinetd ou yum install xinetd en fonction de votre distribution)
  • Éditez le fichier /etc/services et ajoutez y la ligne suivante:

haproxy-agent-check 9707/tcp                # haproxy-agent-check

  • Créez le fichier xinetd /etc/xinetd.d/haproxy-agent-check avec le contenu suivant:

# default: on
# description: haproxy-agent-check
service haproxy-agent-check
{
disable         = no
flags           = REUSE
socket_type     = stream
port            = 9707
wait            = no
user            = nobody
server          = /usr/local/bin/haproxy-agent-check
log_on_failure  += USERID
per_source      = UNLIMITED

}

  • Ajustez les droits:

chmod +x /etc/xinetd.d/haproxy-agent-check

  • Redémarrez le service xinetd

service xinetd restart

  • Une fois cette manipulation effectuée sur chacune de vos machine testez la connectivité entre votre serveur HAProxy et vos hôtes via le port 9707

telnet <DNS ou IP de votre machine> 9707

  • Redémarrez ensuite le service HaProxy sur la machine prévue à cet effet:

service haproxy restart

  • Enfin, depuis votre machine HAproxy, vérifiez que vos agents répondent correctement grâce à la commande suivante:

echo « show stat » | socat stdio unix-connect:/var/lib/haproxy/stats  | cut -d ‘,’ -f1,2,18,19 | grep haproxy

Vous devriez avoir un retour de ce type:

haproxy_servers,FRONTEND,OPEN,
haproxy_servers,<monserveur1>,UP,100
haproxy_servers,<monserveur2>,UP,100
haproxy_servers,localhost,no check,1
haproxy_servers,BACKEND,UP,200

Voila il ne vous reste plus qu’à vous connecter sur votre machines HAPROXY (via la port 2222 dans notre cas) et vous constaterez que votre LoadBalancer répartira la charge sur la machine ayant la charge CPU la plus faible!

Enjoy 😉

 




tuto | Installez et configurez rundeck (ordonnanceur opensource)

Article publié le 14 Août 2017

Article mis à jour le 17 Janvier 2018

J’ai eu l’occasion de tester pas mal d’ordonnanceur et j’ai remarqué que la plupart du temps les solutions du marché sont onéreuses, difficile à mettre en place et dur à maîtriser.

C’est pour ces raisons que j’ai été impressionné par la solution Rundeck.

Cet ordonnanceur open-source est extrêmement simple à mettre en place et à administrer. De plus énormément de plugins sont disponible ce qui permet de bénéficier d’un paquet de fonctionnalités supplémentaire (intégration d’Ansible, etc…)

 

1) Installation

Sous Debian/Ubuntu:

Installez Java:

apt-get install openjdk-8-jdk

Télécharger le paquet DEB sur le site officiel de Rundeck et installez le.

dpkg -i <nom du paquet>

 

Sous RedHat/Centos:

Installez Java:

yum install java-1.8.0-openjdk

Installez Rundeck

rpm -Uvh http://repo.rundeck.org/latest.rpm
yum install rundeck

 

Une fois l’installation terminée, démarrez le service rundeck:

service rundeckd start

Pour accéder à l’interface d’administration, connectez vous àl’URL suivante: <IP ou nom de la machine>:4440

Login et mot de passe par défaut: admin/admin

Si vous avez des difficultés à vous authentifiez (erreur 404 après avoir saisi les identifiants), lisez la suite de ce tutoriel.

 

2) Configuration

2.1) Paramétrage de la base de donnée

Par défaut, Rundeck utilise une base de donnée SqlLite. Il est préférable d’utiliser une base de donnée MySQL afin d’éviter de futures problèmes de performances:

# Sous Debian/Ubuntu

apt-get install mysql-server*

# Sous RedHat/Centos

yum install mysql

 

Authentifiez vous sur votre base mysql en root

mysql -uroot -p<votre password>

Créons ensuite la base de données rundeck:

CREATE database rundeck;

CREATE USER ‘rundeck’@’localhost’ IDENTIFIED BY ‘rundeck’;

GRANT ALL PRIVILEGES ON rundeck.* TO ‘rundeck’@’localhost’;

FLUSH PRIVILEGES;

Utilisez un mot plus sécurisé bien évidemment 😉

Éditez ensuite le fichier /etc/rundeck/rundeck-config.properties et modifiez les lignes suivantes:

grails.serverURL=http://<IP ou DNS de votre machine>:4440

dataSource.dbCreate = update
dataSource.url = jdbc:mysql://localhost/rundeck?autoReconnect=true
dataSource.username = rundeck
dataSource.password = rundeck
dataSource.driverClassName=com.mysql.jdbc.Driver

 

Redémarrez ensuite rundeck:

service rundeckd restart

 

2.2) Génération clés SSH

Afin de lancer un job sur une machine spécifique rundeck le protocole SSH.

Il est donc nécessaire de générer une clé privée via la commande « ssh-keygen » et de la coller dans le répertoire /var/lib/rundeck/.ssh

ssh-keygen

mkdir /var/lib/rundeck/.ssh

cp id_rsa /var/lib/rundeck/.ssh

chown -R rundeck:rundeck /var/lib/rundeck/.ssh

La clé publique (le fichier avec l’extension « .pub » généré par la commande ssh-keygen) sera a coller sur chaque machine cible dans le fichier authorized_keys du user système qui exécutera le job.

 

2.3 Création de votre premier job

Connectez-vous sur l’interface WEB de rundeck (<IP ou nom de la machine>:4440) et authentifiez vous (admin/admin par défaut).

 

Cliquez sur le bouton new projet afin de créer votre premier projet.

Renseignez le nom de votre projet et cliquez sur le bouton « create » en laissant tous les autres paramètres par défaut:

 

Cliquez ensuite sur le bouton « create a new job »:

 

Indiquez tout en haut de la page le nom de votre job et positionnez vous ensuite sur l’encadré « add a step ».

C’est à ce niveau que tout se joue!

Vous pouvez lancer une commande ou exécutez un script sur une machine distante comme l’exemple ci-dessous.

La partie matched nodes correspond aux machines sur lequelles vous voulez exécutez  vos jobs/workflow. Par défaut seul localhost est paramétré. Pour rajouter une machine vous devez éditer le fichier

/var/rundeck/projects/<nom de votre projet>/etc/resources.xml et ajoutez vos machines en respectant la synthaxe XML suivante:

<project>
<node name= »nom de votre machine 1″ description= »votre description » tags= » » hostname= »<adresse ou ip de votre machine » osArch= »amd64″ osFamily= »unix » osName= »Linux » osVersion= »votre distrib » username= »user qui execute votre job sur votre machine »/>
<node name= »nom de votre machine 2″ description= »votre description » tags= » » hostname= »<adresse ou ip de votre deuxième machine » osArch= »amd64″ osFamily= »unix » osName= »Linux » osVersion= »votre distrib » username= »user qui execute votre job sur votre machine »/>
</project>

Enregistrez vos modifications et normalement de nouveaux nodes devraient apparaître (Si ce n’est pas le cas rafraîchissez la page).

Vous avez désormais les bases pour vous lancer. Rundeck est un ordonnanceur très complet et il me serait impossible de vous expliquer chaque fonctionnalité. L’interface étant très intuitive, il vous sera très facile de trouver les fonctions dont vous avez besoin.

3) Sauvegardes/restaurations

 

tuto | sauvegardez vos instances rundeck

 

 

4) Supervisez vos jobs Rundeck

Monitoring | Superviser vos jobs rundeck

 

5) Purger les logs d’exécutions Rundeck

Script | Purger les logs d’exécution Rundeck

 

 




Tuto | Installer et configurer un serveur WildFly

Article publiée le 7 Juin 2017

WildFly est un fork opensource de Jboss. Ce serveur d’application Java EE représente une alternative à crédible par rapport aux autres serveurs d’application JAVA type weblogic, websphère (tutoriel d’installation disponible ici), Jboss, etc…

Ce tutoriel explique comment installer et configurer rapidement un serveur WildFly afin qu’il soit opérationnel. Nous ne rentrerons pas dans les fonctionnalités avancées du produit.

1) Installation

Avant toute chose, Wildfly doit être exécuté via un user système dédié (surtout pas en root!).

Le choix de la distribution importera peu (Debian/Ubuntu ou Centos/RedHat feront très bien l’affaire). Assurez que JAVA soit installé sur votre serveur.

  • Authentifiez vous ensuite en tant que user wildfly (ou celui que vous avez créé)

su – wildfly

  • Téléchargez ensuite la dernière version de WildFly sur le site officiel (au moment ou ce tutoriel a été rédigé, la version 10.1.0 été en version stable.): http://wildfly.org/downloads/
  • Éditez le fichier .bashrc afin de mettre à jour les variables d’environnement $JAVA_HOME et $PATH.

export JAVA_HOME=<chemin d’installation de JAVA>
export PATH=$JAVA_HOME/bin:$PATH

  • Sans oublier de sourcer votre .bashrc

source .bash_rc

 

Décompressez ensuite l’archive précédemment téléchargée. Vous devriez avoir le contenu suivant:

 

2) Configuration

Le fichier de configuration qui va nous intéresser se situe dans le répertoire <votre répertoire d’installation>/wildfly/standalone/configuration/standalone.xml.

Les élément qui nous intéresse se situe à la fin du fichier:

<socket-binding-group name= »standard-sockets » default-interface= »public » port-offset= »${jboss.socket.binding.port-offset:0} »>
<socket-binding name= »management-http » interface= »management » port= »${jboss.management.http.port:9990} »/>
<socket-binding name= »management-https » interface= »management » port= »${jboss.management.https.port:9993} »/>
<socket-binding name= »ajp » port= »${jboss.ajp.port:8009} »/>
<socket-binding name= »http » port= »${jboss.http.port:8080} »/>
<socket-binding name= »https » port= »${jboss.https.port:8443} »/>
<socket-binding name= »txn-recovery-environment » port= »4712″/>
<socket-binding name= »txn-status-manager » port= »4713″/>
<outbound-socket-binding name= »mail-smtp »>
<remote-destination host= »localhost » port= »25″/>
</outbound-socket-binding>
</socket-binding-group>

Les lignes ci-dessus permette de paramétrer les ports d’écoutes (port d’écoute HTTP par défaut: 8080).

 

3) Démarrage/Arrêt

Vous trouverez ci-dessous le contenu d’un shell permettant de gérer l’arret/démarrage de votre serveur WildFly

#!/usr/bin/env bash

# LANG must be explicitly set in startup script (it is not set by monit)
export LANG= »en_US.utf8″

 

# Adapt  JBOSS_HOME with your current installation wildfly PATH
export JAVA_HOME= »${JAVA_HOME} »
export JBOSS_HOME=/srv/wildfly/apps/wildfly
export JBOSS_PIDFILE=$JBOSS_HOME/standalone/tmp/wildfly.pid
export JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh
export JBOSS_CONFIG=standalone.xml
export JBOSS_CONSOLE_LOG=/srv/wildfly/logs/wilfly/console-$(date +%Y%m%d-%H%M%S).log

export SHUTDOWN_WAIT=30

export prog=wildfly
export JBOSS_BIND_ADDRESS=0.0.0.0

JBOSS_MODULES_SYSTEM_PKGS= »org.jboss.byteman »

#Adapt the memory tunning as you want
JAVA_OPTS= »-Xms1303m -Xmx1303m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true »
JAVA_OPTS= »$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true »
JAVA_OPTS= »$JAVA_OPTS -Djboss.modules.policy-permissions=true »
JAVA_OPTS= »$JAVA_OPTS -Djboss.bind.address=$JBOSS_BIND_ADDRESS »
export JAVA_OPTS

EXEC_PATH=${JBOSS_HOME}/bin
cd ${EXEC_PATH}

start() {
# TODO verifier le contenu du fichier de pid
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE
if [ `ps –pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq ‘1’ ]; then
echo -n « $prog is already running »
echo
return 1
else
rm -f $JBOSS_PIDFILE
fi
fi

mkdir -p $(dirname $JBOSS_CONSOLE_LOG)
cat /dev/null > $JBOSS_CONSOLE_LOG

mkdir -p $(dirname $JBOSS_PIDFILE)

export LAUNCH_JBOSS_IN_BACKGROUND=1
$JBOSS_SCRIPT -c $JBOSS_CONFIG > $JBOSS_CONSOLE_LOG 2>&1 &
return 0
}

stop() {
# TODO verifier le contenu du fichier de pid
count=0;

if [ -f $JBOSS_PIDFILE ]; then
read kpid < $JBOSS_PIDFILE
let kwait=$SHUTDOWN_WAIT

# Try issuing SIGTERM

kill -15 $kpid
until [ `ps –pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq ‘0’ ] || [ $count -gt $kwait ]
do
sleep 1
let count=$count+1;
done

if [ $count -gt $kwait ]; then
kill -9 $kpid
fi
fi
rm -f $JBOSS_PIDFILE
}

status() {
# TODO verifier le contenu du fichier de pid
if [ -f $JBOSS_PIDFILE ]; then
read ppid < $JBOSS_PIDFILE
if [ `ps –pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq ‘1’ ]; then
echo « $prog is running (pid $ppid) »
return 0
else
echo « $prog dead but pid file exists »
return 1
fi
fi
echo « $prog is not running »
return 3
}

case « $1 » in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
$0 start
;;
status)
status
;;
*)
## If no parameters are given, print which are avaiable.
echo « Usage: $0 {start|stop|status|restart|reload} »
esac

 

4) Déploiement

Pour déployer votre application JAVA (sous forme de fichier ear), il vous suffit de le placer dans le répertoire <votre répertoire d’installation>/wildfly/standalone/. Une fois la copie terminée créer un fichier vide ayant le même nom que votre fichier ear suivi de .dodeploy.

Exemple: monapplicationjava.ear.dodeploy.

Wildfly commencera à déployer votre application. Si le déploiement se passe correctement le fichier sera renommé en <nom de votre fichier ear>.deployed

Le contenu de votre application sera disponible depuis votre navigateur via le port 8080 (port HTTP par défaut).

Il est vivement conseillé de toujours utiliser un reverse proxy HTTP (apache2) devant votre serveur d’application (un tutoriel est disponible à ce sujet: https://journaldunadminlinux.fr/tutoriel-mettre-en-place-un-reverse-proxy-sur-apache-via-mod_proxy/)




Tuto | Installer et configurer OpenNebula sous Debian

Article publié le 6 Juin 2017

Article mis à jour le 13 Janvier 2018

 

Cela fait un petit moment que je m’intéresse aux technologies Cloud (AWS, OpenStack, etc…) et OpenNebula a particulièrement attiré mon attention par sa simplicité d’installation.

C’est pourquoi, je vous propose un petit tutoriel d’installation sur OpenNebula sous Debian.

Pour suivre ce tutoriel, vous aurez besoin d’au minimum deux VMs: Une VM pour l’interface de gestion et d’une ou plusieurs VMs pour les hôtes (hyperviseurs).

 

1) Installation de l’interface de gestion

1.1) Installation des paquets

On installe les dépôts:

wget -q -O- http://downloads.opennebula.org/repo/Debian/repo.key | apt-key add –

echo « deb http://downloads.opennebula.org/repo/5.2/Debian/8 stable opennebula » > /etc/apt/sources.list.d/opennebula.list

On installe les paquets:

apt-get update & apt-get install opennebula*

A adapter selon la version de votre Debian (à l’heure ou cet article a été écrit, la 9 n’est pas encore sortie en version stable). De plus la version de opennebula (dernière version en date de cet article: 5.4) est à adapter dans le lien (deb http://downloads.opennebula.org/repo/<version opennebula>/Debian/8 stable opennebula)

 

On installe des bibliothèques Gem supplémentaires

/usr/share/one/install_gems

Activation d’openNebula:

systemctl enable opennebula
systemctl enable opennebula-sunstone

1.2) Installation du stockage partagé

On installe le serveur NFS:

apt-get install nfs-common nfs-kernel-server

Dans le fichier /etc/exports ajoutez la ligne suivante:

/var/lib/one/ *(rw,sync,no_subtree_check,root_squash)

Activez  nfs:

systemctl enable nfs-kernel-server

Démarrez nfs:

systemctl start nfs-kernel-server

1.3 Installation de la base de données

La base de données par défaut est SQLITE. Inutile de vous préciser que rester sur ce type de base de données n’est pas une solution pérenne. Nous allons donc partir sur une installation de MySQL.

Installez les paquets:

apt-get install mariadb-server

Activez Mysql:

systemctl enable mysql

Démarrez Mysql:

systemctl start mysql

Créons maintenant la base ainsi que le user MySQL:

# mysql
> CREATE DATABASE opennebula;
> GRANT ALL ON opennebula.* TO oneadmin@localhost IDENTIFIED BY ‘onepassword’;

Le mot de passe est à changer bien entendu 😉

Procédez à la configuration d’openNebula pour que celui-ci se connecte à votre base de données MySQL. Pour cela éditez le fichier /etc/one/oned.conf et commencer par commenter la ligne suivante :

DB = [ backend = « sqlite » ]

Ensuite, rajoutez les lignes suivantes :

DB = [ backend = « mysql »,
server  = « localhost »,
port    = 0,
user    = « oneadmin »,
passwd  = « onepassword »,
db_name = « opennebula » ]

Démarrez les services :

systemctl start opennebula
systemctl start opennebula-sunstone

2) Installation de l’hyperviseur

Sur votre deuxième VM, installez les dépôts:

wget -q -O- http://downloads.opennebula.org/repo/Debian/repo.key | apt-key add –

echo « deb http://downloads.opennebula.org/repo/5.2/Debian/8 stable opennebula » > /etc/apt/sources.list.d/opennebula.list

On installe ensuite le paquet:

apt-get update & apt-get install opennebula-node

On active libvirtd et on le démarre:

systemctl enable libvirtd
systemctl start libvirtd

Rajoutez dans votre fichier /etc/fstab la ligne suivante :

<ip de votre serveur de gestion>:/var/lib/one/ /var/lib/one/ nfs soft,intr,rsize=8192,wsize=8192 0 0

Montez le volume NFS:

mount -a

 

Maintenant que votre hyperviseur est installé nous allons le rajoutez dans le cluster opennebula depuis l’interface de gestion.

Pour cela connectez vous à l’interface Web via l’URL: http://<ip ou nom de votre machine>:9869.

Une page ressemblante à la capture d’écran ci-dessous devrait s’afficher:

Récupérez vos identifiants en affichant le contenu du fichier  /var/lib/one/.one/one_auth et identifiez-vous.

Une fois connecté, le dashboard général d’openNebula s’affiche:

 

Cliquez sur le menu « infrastructure » puis sur « Hosts »:

Cliquez sur le bouton ajoutez:

Puis renseignez le hostname ou l’ip de votre hyperviseur:

Votre installation d’OpenNebula est maintenant terminée!

Vous pouvez commencer à créer des templates et provisionner des Vms

Merci à Séb pour sa contribution pour la rédaction de cet article 😉

 




PyDash | Outil de monitoring Web pour Linux

Article publiée le 11 Avril 2017

J’ai découvert par hasard un petit outil de monitoring Web en temps réel nommé PyDASH. Cet outil développé en Python vous permet d’avoir un aperçu global de votre machine:

 

1) Installation

1.1) Prérequis

Installez les prérequis:

Sous Debian/Ubuntu:

apt-get install git python-pip apache2 libapache2-mod-wsgi

Sous Redhat/Centos

Installez les dépots EPEL:

yum install epel-release

Puis installez les prérequis:

yum install git python-pip httpd mod-wsgi

 

1.2) Installation de PyDASH

On installe ensuite PyDASH:

Positionnez-vous dans le répertoire apache censé contenir le contenu (par défaut /var/www)

Rapatriez les sources depuis le dépôt GIT officiel

git clone https://github.com/k3oni/pydash

Positionnez-vous dans le répertoire pydash/pydash et changez la valeur SECRET_KEY contenue dans le fichier setting.py

Installez-le framework python Django (framework Web Python):

pip install -r requirement.txt

On initialise la base de donnée interne:

./manage.py syncdb

Ensuite attribuez les bons droits au répertoire racine pydash:

chown -R apache:apache pydash    – Pour les distribution Redhat/Centos

chown -R www-data-:www-data  – Pour les distributions Debian/Ubuntu

1.3) Configuration du serveur Apache

Sous Centos/RedHat

Créez le fichier /etc/httpd/conf.d/pyfash.conf et ajoutez y les lignes suivantes:

 

 WSGISocketPrefix run/wsgi
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
ServerName dummy-host.example.com

WSGIDaemonProcess pydash display-name=%{GROUP} python-path=/var/www/pydash
WSGIProcessGroup pydash
WSGIScriptAlias / /var/www/pydash/pydash/wsgi.py
service apache2 reload
Alias /static /var/www/pydash/static/
Alias /media /var/www/pydash/media/

<Directory /var/www/pydash/pydash>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

#CustomLog logs/pydash-access_log common
#ErrorLog logs/pydash-error_log
</VirtualHost>

Sous Debian/Ubuntu

Créez le fichier /etc/apache2/sites-available/pydash.conf et ajoutez y les lignes suivantes (sans oublier de tapez la commande « a2ensite pydash.conf » pour activer votre VirtualHost) :

 WSGISocketPrefix /var/run/apache2/wsgi
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
ServerName dummy-host.example.com

WSGIDaemonProcess pydash display-name=%{GROUP} python-path=/var/www/pydash
WSGIProcessGroup pydash
WSGIScriptAlias / /var/www/pydash/pydash/wsgi.py

Alias /static /var/www/pydash/static/
Alias /media /var/www/pydash/media/

<Directory /var/www/pydash/pydash>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

#CustomLog logs/pydash-access_log common
#ErrorLog logs/pydash-error_log
</VirtualHost>

 

 

Recharger ensuite la configuration de votre serveur apache:

service apache2 reload

 

 

 

 

 




Tuto | Installation et configuration de nginx + Loadbalancing

Article publiée le 10 Avril 2017

Durant mon temps libre, j’ai décidé de m’intéresser de prêt à Nginx. Il est vrai que je n’ai jamais eu l’occasion de le mettre en place étant donné que l’intégralité de mes environnements WEB tournent avec Apache. Nginx est un serveur Web spécialement conçu pour encaisser de très forts trafics. Les performances de celui-ci sont nettement supérieures à ceux d’Apache. De plus, Nginx intègre une fonctionnalité de LoadBalancing très puissante. Cependant, l’inconvénient majeur de Nginx est qu’il ne peut gérer nativement du contenu  dynamique (PHP par exemple). Il faudrait pour cela passer par une configuration légèrement plus fastidieuse par rapport à celle d’Apache.

 

1) Installation

Installez Nginx sur une distrib Debian/Ubuntu:

apt-get install nginx

Installez Nginx sur une distrib Centos/RedHat

yum install nginx

(jusque-là rien de compliqué 😉 )

2) Configuration

2.1) Optimisation de la configuration

Dans le fichier nginx.conf, rajoutez les lignes suivantes afin d’optimiser la configuration de votre serveur nginx:

client_body_buffer_size 10k;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;  #modification car la ligne existe déja
send_timeout 10;

2.2) VirtualHost

Vous trouverez ci-dessous des exemples de configuration de VirtualHost Nginx. Pour rappel, un Virtualhost permet de gérer plusieurs sites simultanément avec le même serveur Web. Il permet d’afficher le bon site en fonction du nom de domaine. La configuration des VirtualHost Nginx est assez similaire à celle d’Apache.

Pour créer un VirtualHost sous Debian/Ubuntu il faut créer un fichier de configuration dans le répertoire « /etc/nginx/sites-available » est le remplir avec une configuration similaire à ce qui est indiqué ci-dessous. Ensuite, il ne restera plus qu’à faire un lien symbolique de ce fichier vers le répertoire « site-enabled »

Sous Redhat/Centos créer le répertoire /etc/nginx/vhost.d/ et rajoutez dans le fichier de configuration /etc/nginx.conf la ligne suivante:

include /etc/nginx/vhost.d/*.conf

 

Ci-dessous un VirtualHost prenant en compte un site accessible via HTTP et HTTPS:

 

server {
              listen 80;
              root /var/www/html;
              index index.html index.htm index.php;
              server_name example.com example;
              access_log /var/log/nginx/myexample.access.http.log;
              error_log /var/log/nginx/myexample.error.http.log;
}

server {
        listen 443;
        root /var/www/html;
        index index.html index.htm index.php;
        server_name example.com example;
        access_log /var/log/nginx/myexample.access.https.log;
        error_log /var/log/nginx/myexample.error.https.log;
        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
}

Dans le cadre de la configuration du VirtualHost HTTPS, les certificats seront à générer au préalable!

Ci-dessous un VirtualHost permettant de faire un reverse proxy:

 

upstream mysite {
              server localhost:8080;
}
 server {
              server_name mysite.local;
              location / {
              proxy_pass http://mysite.local;
              }
}

 

2.3) Configuration d’un LoadBalancer

Il est également possible de faire du Loadbalancing avec NGINX.

La configuration (VirtualHost) ci-dessous permet de mettre en place un LoadBalancing de type « round robin » (file d’attente gérée de manière circulaire, « chacun son tour »)

upstream vip.local {

server example1.local;
                server example2local;
}
server {
listen 80;
server_name vip.local;
location / {
                proxy_pass http://vip.local;
                }
}

Il est également possible d’assigner un « poids » pour prioriser la répartition de la charge:

upstream vip.local {

server example1.local weight=3;
server example2.local weight=6;
}
server {
listen 80;
server_name vip.local;
location / {
                proxy_pass http://vip.local;
                }
}

3) PHP

Comme indiqué dans l’introduction de ce tutoriel, Nginx ne gère pas nativement PHP (du moins pas aussi bien qu’Apache). Vous trouverez ci-dessous la marche à suivre pour implémenter PHP.

Installez PHP-FPM

apt-get install php5-fpm ou yum install php5-fpm

Redémarrez php5-fpm

service php5-fpm restart

Rajoutez la configuration suivante dans votre virtualhost (ou le VirtualHost default si vous n’avez pas défini de VirtualHost) dans la section server {}

   location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Si vous avez besoin de modules PHP spécifique pour faire tourner votre site web, il suffira de les installer via votre gestionnaire de paquet:

Exemple:

apt-get install php5-curl ou yum install php5-curl

 

Après un redémarrage de Nginx et de php5-fpm votre serveur nginx sera capable d’héberger des sites en PHP sans aucun souci!

 

 

 

 

 

 

 

 

 

 

 

 

 




Tuto Docker | Gérer vos container avec Docker compose

Article publiée le 10 Février 2017

Après mon tuto sur Docker (http://journaldunadminlinux.fr/tuto-docker-demarrer-avec-docker/) je continue dans ma lancée en vous présentant l’outil docker-compose. Docker-compose est un outil officiel Docker  absolument génial qui permet de gérer à 100% vos container uniquement avec un fichier de configuration yml. Cet outil est d’autant plus pratique si vos applications nécessite l’installation de plusieurs containers pour fonctionner.

I) Installation

L’installation est très simple (curl doit être installé sur votre machine):

curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

 

La commande docker-compose doit fonctionner:

 

2) Utiliser Docker Compose

Pour vous montrer comment fonctionne docker-compose je vais prendre comme exemple l’installation d’un GITLAB complet sous Docker (base de données + application).

Après une petite recherche, on trouve facilement un template d’une configuration docker-compose.yml:

version: ‘2’

services:
redis:
restart: always
image: sameersbn/redis:latest
command:
– –loglevel warning
volumes:
– /srv/docker/gitlab/redis:/var/lib/redis:Z

postgresql:
restart: always
image: sameersbn/postgresql:9.6-2
volumes:
– /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z
environment:
– DB_USER=gitlab
– DB_PASS=password
– DB_NAME=gitlabhq_production
– DB_EXTENSION=pg_trgm

gitlab:
restart: always
image: sameersbn/gitlab:8.16.4
depends_on:
– redis
– postgresql
ports:
– « 10080:80 »
– « 10022:22″
volumes:
– /srv/docker/gitlab/gitlab:/home/git/data:Z
environment:
– DEBUG=false

– DB_ADAPTER=postgresql
– DB_HOST=postgresql
– DB_PORT=5432
– DB_USER=gitlab
– DB_PASS=password
– DB_NAME=gitlabhq_production

– REDIS_HOST=redis
– REDIS_PORT=6379

– TZ=Asia/Kolkata
– GITLAB_TIMEZONE=Kolkata

– GITLAB_HTTPS=false
– SSL_SELF_SIGNED=false

– GITLAB_HOST=localhost
– GITLAB_PORT=10080
– GITLAB_SSH_PORT=10022
– GITLAB_RELATIVE_URL_ROOT=
– GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
– GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
– GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

– GITLAB_ROOT_PASSWORD=
– GITLAB_ROOT_EMAIL=

– GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
– GITLAB_NOTIFY_PUSHER=false

– GITLAB_EMAIL=notifications@example.com
– GITLAB_EMAIL_REPLY_TO=noreply@example.com
– GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com

– GITLAB_BACKUP_SCHEDULE=daily
– GITLAB_BACKUP_TIME=01:00

– SMTP_ENABLED=false
– SMTP_DOMAIN=www.example.com
– SMTP_HOST=smtp.gmail.com
– SMTP_PORT=587
– SMTP_USER=mailer@example.com
– SMTP_PASS=password
– SMTP_STARTTLS=true
– SMTP_AUTHENTICATION=login

– IMAP_ENABLED=false
– IMAP_HOST=imap.gmail.com
– IMAP_PORT=993
– IMAP_USER=mailer@example.com
– IMAP_PASS=password
– IMAP_SSL=true
– IMAP_STARTTLS=false

– OAUTH_ENABLED=false
– OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
– OAUTH_ALLOW_SSO=
– OAUTH_BLOCK_AUTO_CREATED_USERS=true
– OAUTH_AUTO_LINK_LDAP_USER=false
– OAUTH_AUTO_LINK_SAML_USER=false
– OAUTH_EXTERNAL_PROVIDERS=

– OAUTH_CAS3_LABEL=cas3
– OAUTH_CAS3_SERVER=
– OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
– OAUTH_CAS3_LOGIN_URL=/cas/login
– OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
– OAUTH_CAS3_LOGOUT_URL=/cas/logout

– OAUTH_GOOGLE_API_KEY=
– OAUTH_GOOGLE_APP_SECRET=
– OAUTH_GOOGLE_RESTRICT_DOMAIN=

– OAUTH_FACEBOOK_API_KEY=
– OAUTH_FACEBOOK_APP_SECRET=

– OAUTH_TWITTER_API_KEY=
– OAUTH_TWITTER_APP_SECRET=

– OAUTH_GITHUB_API_KEY=
– OAUTH_GITHUB_APP_SECRET=
– OAUTH_GITHUB_URL=
– OAUTH_GITHUB_VERIFY_SSL=

– OAUTH_GITLAB_API_KEY=
– OAUTH_GITLAB_APP_SECRET=

– OAUTH_BITBUCKET_API_KEY=
– OAUTH_BITBUCKET_APP_SECRET=

– OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
– OAUTH_SAML_IDP_CERT_FINGERPRINT=
– OAUTH_SAML_IDP_SSO_TARGET_URL=
– OAUTH_SAML_ISSUER=
– OAUTH_SAML_LABEL= »Our SAML Provider »
– OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
– OAUTH_SAML_GROUPS_ATTRIBUTE=
– OAUTH_SAML_EXTERNAL_GROUPS=
– OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
– OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
– OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
– OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=

– OAUTH_CROWD_SERVER_URL=
– OAUTH_CROWD_APP_NAME=
– OAUTH_CROWD_APP_PASSWORD=

– OAUTH_AUTH0_CLIENT_ID=
– OAUTH_AUTH0_CLIENT_SECRET=
– OAUTH_AUTH0_DOMAIN=

– OAUTH_AZURE_API_KEY=
– OAUTH_AZURE_API_SECRET=
– OAUTH_AZURE_TENANT_ID=

 

Le fichier docker-compose ci-dessus va créer 3 container: deux container pour GITLAB et un pour PostgresSQL. Le fichier contient tout les paramètres de connexions à la base données, de l’applicatif, réseau (avec le mapping des ports) ainsi que le répertoire des volumes persistants très utile notamment pour les tablespaces de la base de données PostGRESQL.

 

Une fois le fichier docker-compose adapté à vos besoins, il ne reste plus qu’à builder vos container. Pour cela veillez à être dans le répertoire contenant votre fichier docker-compose.yml puis lancez la commande suivante pour builder les containers:

docker-compose up -d

On vérifie la présence des containers:

Comme prévus, trois containers ont été créés: un pour la base de données et deux pour GITLAB).

Dans le fichier docker-compose.yml (aussi via votre docker ps -a) il est indiqué que le port 80 du container est mappé sur le port 10080 accessible depuis l’extérieur.

Il ne reste plus qu’à tester (http://ip ou DNS de votre machine :10080):

3) Les commandes utiles

Les commandes ci-dessous sont à utiliser quand vous êtes positionné dans le répertoire contenant le  fichier docker-compose.yml:

Stopper le/les containers
docker-compose stop

Démarrer le/les containers
docker-compose start

Supprimer le/les containers
docker-compose rm

Builder le/les Containers
docker-compose up -d

Check des logs
docker logs -f <nom de container>




Tuto Docker | Démarrer avec Docker

Article publié le 09/02/2017

Mis à jour le 22/08/2018

Après mal de temps, j’ai enfin décidé à me mettre à étudier Docker. Étant très hésitant au départ, je me suis vite aperçu que Docker est un outil extrêmement puissant, flexible avec un potentiel Devops incroyable.

La question que se posent beaucoup de personnes est: qu’est-ce que c’est Docker? Contrairement à la virtualisation classique ou vous virtualisez l’intégralité de la machine et tout se qu’elle héberge, Docker n’héberge  que les applications et les librairies!

 

 

 

 

I) Installation

Sous Debian: 

On ajoute les dépôts docker et on installe:

sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add –
sudo add-apt-repository « deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable »
sudo apt-get update
sudo apt-get install docker-ce

systemctl enable docker
systemctl start docker

Sous Centos:

On ajoute les dépôts docker et on installe:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
systemctl enable docker
systemctl start docker
Afin de nous faciliter la vie, on attribue les droits à notre utilisateur pour éviter de bosser avec root.
usermod -a -G docker  <votre user>

 II) Création d’un container

Dans l’exemple ci-dessous, on va chercher une image nginx:

docker search nginx

 

On rapatrie l’image sur notre machine :

docker pull nginx

On vérifie notre liste d’images:

docker images

On s’aperçoit que notre image nginx a bien été rapatrié:

On installe le container

docker run -d –name=ServeurNginx nginx:latest

On vérifie que le container est bien installé:

docker ps  -a

On démarre notre container:

docker start <container id>

docker start 1f8b15c5b642

Nous allons maintenant inspecter la configuration de notre container afin de déterminer l’adresse IP local du container:

docker inspect <id du container>

Vous verrez toutes les informations de votre container et notamment un élément qui nous intéresse:

  « IPAddress »: « 172.17.0.2 »,
« IPPrefixLen »: 16,

L’IP ci-dessus correspond à l’interface virtuel  de votre container. Si vous tentez de vous connecter en HTTP via l’adresse de votre container, le serveur nginx hébergé dans votre container va répondre:

elinks 172.0.0.2

Bon j’imagine que vous allez me poser la question suivante: « comment on fait pour que notre container soit accessible de l’extérieur? »

Pour cela rien de plus simple, nous allons créer un deuxième container depuis l’image nginx avec quelques arguments en plus:

 docker run -d -p 9876:80 –name=Webserver3 nginx:latest

Votre container sera joignable via le port 9876 depuis l’extérieur:

Allons encore un peu plus loin en mappant des répertoires internes de votre container directement sur un répertoire de votre serveur (par exemple pour mettre à jour le contenu d’un site web hébergé dans votre container).
docker run -d -p 9876:80 –name=WebServer4 -v /home/usr/www:/usr/share/nginx/html nginx:latest

III) DockerFile

Il est possible avec Docker de créer un container  à partir d’un fichier de configuration nommé Dockerfile.

Pour cela créer un fichier nommé Dockerfile.

Dans notre fichier nous allons créer un container Debian et installer un serveur apache2 accessible depuis l’extérieur.

Ci-dessous le contenu du Dockerfile

# Image
FROM debian:stable
#Information sur le propriétaire du container
MAINTAINER vdahmane@gmail.com
# Commande RUN utilisé uniquement lors de la creation du container (necessite un docker build)
RUN apt-get update && apt-get upgrade -y && apt-get install -y apache2 telnet  elinks openssh-server
# Creation variable
ENV VARIABLE ma-variable
# PORT 80 Ouvert
EXPOSE  80
# On expose le port SSH pour pouvoir se connecter sur la machine
EXPOSE 22
# Commande passé une fois le container créé (ne neccessite pas un docker build juste un run)
#     Commande               1er arg 2eme arg
CMD [« /usr/sbin/apache2ctl », »-D », »FOREGROUND »]
Reste plus qu’à créer notre container depuis le Dockerfile.
On crée notre image Docker:
docker build -t myapache .
On installe notre container:
docker run -d -P 9999:80 –name=Debianapache myapache:latest
Il ne reste plus qu’à vérifier via l’IP de votre serveur Docker si le serveur apache est accessible:

IV) Autre commandes utiles

Supprimer tout les container actifs:
docker rm `docker ps -a -q`
Démarrer ou arrêter un container :
docker start <container>
docker stop <container>
Supprimer tout les container actif:
docker rm `docker ps -a -q`
Supprimer une image docker (vérifier qu’aucun container n’est actif):
docker rmi <image>
Vous connecter directement sur votre container:
docker run -it <votre container> /bin/bash

VI) Repository

Le repository docker https://hub.docker.com/explore/ contient toutes les images dockers possible et imaginable. Vous pouvez aussi bien trouver des container apache que nginx voir même des images de distributions Linux comme Centos ou Debian. Je vous suggère de créer un compte et d’y  aller faire un tour.

Un tuto pour créer votre propre Registry Docker est disponible ici

VII) Docker Compose

Docker-compose est un outil officiel Docker  absolument génial qui permet de gérer à 100% vos container uniquement un fichier de configuration yml. Cet outil est d’autant plus pratique si vos applications nécessite l’installation de plusieurs containers pour fonctionner.

Le tutoriel sur docker-compose est disponible ici:

Tuto Docker | Gérer vos container avec Docker compose

VIII) Docker Swarm

Docker swarm est l’orchestrateur de container officiel Docker. Un tutoriel sur son déploiement est disponible:

Tutoriel | Installer et utiliser DockerSwarm

 

IX) Registry Privé

Un tutoriel sur l’installation d’un registry privé Docker est disponible:

Tutoriel | Installation, configuration et utilisation d’un Docker Registry

 

X) Kubernetes

Kubernetes est un puissant orchestrateur de container extrêmement utilisé aujourd’hui. Un tutoriel sur son déploiement est disponible:

Tutoriel | Installez facilement un cluster Kubernetes sous Debian ou Centos

XI) Portainer

Portainer est un outil puissant permettant de gérer vos environnement Docker via une interface Web extrêmement simple d’utilisation:

 

Tutoriel | Gérez vos container docker avec Portainer

 

 

 




Tuto | Installation d’un serveur PostgreSQL multi-instances

Article publiée le 27 Décembre 2016

Je continue dans ma lancée des tutoriels concernant l’installation et la configuration de base de données multi instance (cf: tuto sur l’installation d’une base Mysql multi instance: http://journaldunadminlinux.fr/tuto-installation-dune-mysql-multi-instance/).

Si vous ne connaissez rien du tout sur postgresql je vous suggère d’aller faire un tour sur le tuto d’installation de postgres: http://journaldunadminlinux.fr/tuto-installation-dune-mysql-multi-instance/

Ci-dessous la procédure pour configurer un serveur postgresql en multi instance

 

  • Procédez à l’installation de PostgreSQL via la commande apt-get install postgresql postgresql-common postgresql-contrib
  • Faites, une sauvegarde du fichier de configuration /etc/postgresql/9.4/main/postgresql.conf
  • Copier la configuration ci-dessous dans votre fichier postgresql.conf:
data_directory = '/var/lib/postgresql/9.4/main'
hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.4-main.pid'
listen_addresses = 'localhost'
port = 5432
max_connections = 100
unix_socket_directories = '/var/run/postgresql'
ssl = true
shared_buffers = 1024MB
work_mem = 16MB
maintenance_work_mem = 1024MB
checkpoint_segments = 64
checkpoint_completion_target = 0.9
effective_cache_size = 1024MB
log_min_duration_statement = 500
log_line_prefix = '%m %d '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
  • Créez les dossiers de stockage  avec les bons droits:
mkdir /srv//pg && chown postgres:postgres /srv//pg && chmod 700 /srv/pg
  • Créez les répertoires pour les fichiers de configurations

mkdir /etc/postgresql/9.4/<instance>
  • Créez la nouvelle instance
su - postgres
/usr/lib/postgresql/9.4/bin/initdb -D /srv//pg
cp /etc/postgresql/9.4/main/*conf /etc/postgresql/9.4/<instance name>
  • Éditez et modifier le fichier /etc/postgresql/9.4/<instance name>/postgresql.conf avec les bonnes informations
data_directory
hba_file
ident_file
external_pid_file
port
  • Redémarrez PostgreSQL

Quelques commandes pour aider (version « 9.4 »  adapter bien évidemment):

Lister les Clusters :   pg_lsclusters

Arrêter une instance: pg_ctlcluster 9.4 <instance name> stop

Démarrer une instance: pg_ctlcluster 9.4 instance1 start




Tuto | Installez et débutez avec postgresql

Article publiée le 27 Décembre 2016

PostgreSQL est pour moi la meilleure alternative à Oracle. Elle allie performance, fiabilité et simplicité d’administration. Ayant eu pas mal de galère avec MySQL que je trouve plus « fragile » j’ai vite été séduis par la robustesse de PostGRESQL.

 

1) Installation

Debian/Ubuntu

apt-get install postgresql-*

RedHat/Centos

La version de postgresql contenu dans les dépôts de ces distributions sont un peu veilles. Je vous suggère d’ajouter les dépots yum officiel:

CentOS/RHEL 7
# rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm
CentOS/RHEL 6
# rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1.noarch.rpm
CentOS/RHEL 5
# rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-5-x86_64/pgdg-redhat94-9.4-1.noarch.rpm

9.4 correspond à la version de postgreSQL, rien ne vous empêche d’installer une version supérieur/inférieur en modifiant le lien.

Ensuite procédez à l’installation (encore une fois le numéro de la version est à adapter)

yum install postgresql94-server postgresql94

Initialisez l’instance postgresql:

/usr/pgsql-9.4/bin/postgresql94-setup initdb

 

2) Configuration

  • Emplacement des fichiers de configuration sous RedHat/Centos: /var/lib/pgsql/9.4/data/postgresql.conf
  • Emplacement des fichiers de configuration sous Debian/Ubuntu: /etc/postgresql/9.4/main/

Modifiez le fichier de configuration postgresql.conf avec la configuration suivante:

 

data_directory = ‘/var/lib/postgresql/9.4/main’
hba_file = ‘/etc/postgresql/9.4/main/pg_hba.conf’
ident_file = ‘/etc/postgresql/9.4/main/pg_ident.conf’
external_pid_file = ‘/var/run/postgresql/9.4-main.pid’

listen_addresses = ‘*’
port = 5432
max_connections = 200
unix_socket_directories = ‘/var/run/postgresql’
ssl = true

shared_buffers = 512MB
work_mem = 16MB
maintenance_work_mem = 2048MB

checkpoint_segments = 64
checkpoint_completion_target = 0.9

effective_cache_size = 1024MB

log_min_duration_statement = 500
log_line_prefix = ‘%m %d ‘

datestyle = ‘iso, mdy’
#lc_messages = ‘en_US.UTF-8’
#lc_monetary = ‘en_US.UTF-8’
#lc_numeric = ‘en_US.UTF-8’
#lc_time = ‘en_US.UTF-8’

lc_messages = ‘fr_FR.UTF-8’
lc_monetary = ‘fr_FR.UTF-8’
lc_numeric = ‘fr_FR.UTF-8’
lc_time = ‘fr_FR.UTF-8’
default_text_search_config = ‘pg_catalog.english’

ssl_cert_file = ‘/etc/ssl/certs/ssl-cert-snakeoil.pem’
ssl_key_file = ‘/etc/ssl/private/ssl-cert-snakeoil.key’

Modifiez le fichier pg_hba.conf afin d’autoriser la connexion d’un client extérieur à votre base (à adapter selon la configuration de votre réseau):

# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer

# TYPE DATABASE USER ADDRESS METHOD

# « local » is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 192.1.1.137/24 md5
host all all 192.168.0.0/24 md5

Enfin redémarrez postgresql afin de charger la conf.

3) Connexion

Pour vous connecter à votre instance postgreSQL vous avez le choix entre deux méthodes:

  • En ligne de commande:

[user@dbserver ~]$ psqlsu – postgres

[postgres@dbserver ~]$ psql

 

Vous serez ainsi connecter au client en ligne de commande Postgresql. Afin d’avoir un apercu des commandes tapez \h.

Pour plus d’info n’hésitez pas à consulter la documentation officiel : http://docs.postgresql.fr/

 

  • Via une interface graphique

Il est également possible d’utiliser une interface graphique afin d’administrer votre instance postgreSQL.

Cette interface graphique du nom de PGADMIN est disponible en libre téléchargement: https://www.pgadmin.org/

 

Autre tutoriel sur postgresql:

Tuto | Installation d’un serveur PostgreSQL multi-instances

Tutoriel | Configurer la réplication master/slave d’une instance PostgreSQL

 




Tuto | Installation d’une base Mysql Multi-instances

Article publiée le 26 Décembre 2016

Un petit tutoriel sur l’installation d’une base de données MySQL multi instance. Ce type d’installation vous sera particulièrement utile si votre serveur héberge plusieurs instances applicative. En effet admettons que vous hébergiez plusieurs instances applicatives, au lieu de créer une base de données par application, vous pourrez créer une instance MySQL dédié par application. L’avantage est que vous pourrez effectuer un tunning précis de votre base de données par application.

 

  •  Procédez à l’installation de mysql via la commande apt-get install mysql-server
  •  Faites une sauvegarde du fichier de configuration original /etc/mysql/my.cnf et modifier le de la manière suivante (le fichier de configuration est bien sur à adapter. Dans cette exemple j’ai décidé de créer trois instances MySQL):

 

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0
[mysqld]
#user           = mysql
[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer              = 16M
!includedir /etc/mysql/conf.d/
[mysqld1]
user            = mysql1
pid-file        = /var/run/mysqld1/mysqld.pid
socket          = /var/run/mysqld1/mysqld.sock
port            = 33061
basedir         = /usr
datadir         = /var/lib/mysql1
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
general_log_file        = /var/log/mysql1/mysql.log
general_log             = 1
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
expire_logs_days        = 10
max_binlog_size         = 100M
[mysqld2]
user            = mysql2
pid-file        = /var/run/mysqld2/mysqld.pid
socket          = /var/run/mysqld2/mysqld.sock
port            = 33062
basedir         = /usr
datadir         = /var/lib/mysql2
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
general_log_file        = /var/log/mysql2/mysql.log
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error               = /var/log/mysql2/error.log
expire_logs_days        = 10
max_binlog_size         = 100M
[mysqld3]
user            = mysql3
pid-file        = /var/run/mysqld3/mysqld.pid
socket          = /var/run/mysqld3/mysqld.sock
port            = 33063
basedir         = /usr
datadir         = /var/lib/mysql3
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
general_log_file        = /var/log/mysql3/mysql.log
general_log             = 1
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error               = /var/log/mysql3/error.log
expire_logs_days        = 10
max_binlog_size         = 100M
  • On crée  les différents users:

     useradd -r mysql1

     useradd -r mysql2

     useradd -r mysql3

 

  • On crée les répertoires avec les bons droits :
mkdir /var/lib/mysql{1,2,3}
mkdir /var/lib/mysql{1,2,3}
chown mysql1:adm /var/log/mysql1
chown mysql2:adm /var/log/mysql2
chown mysql3:adm /var/log/mysql3
mkdir /var/run/mysqld{1,2,3}
chown mysql1 /var/run/mysqld1
chown mysql2 /var/run/mysqld2
chown mysql3 /var/run/mysqld3
  • On initialise les datastores pour chaque instances
mysql_install_db --datadir=/var/lib/mysql1 --user=mysql1
mysql_install_db --datadir=/var/lib/mysql2 --user=mysql2
mysql_install_db --datadir=/var/lib/mysql3 --user=mysql3

 

  • On démarre nos instances:

mysqld_multi --verbose --no-log start 1

mysqld_multi --verbose --no-log start 2

mysqld_multi --verbose --no-log start 3

 

  • Pour stopper une instance spécifique : mysqld_multi --verbose --no-log stop <numéro de l'instance>
  • Il est possible d’avoir un statut pour chaque instance grâce à la commande : mysqld_multi report
  • Enfin la connexion à une instance via le client mysql se fait avec ce type de commande : mysql -uroot –socket=<chemin du fichier>
    Exemple : mysql -uroot -ptoto --socket=/var/run/mysql1/mysqld.sock



Tutoriel | Mettre en place un reverse proxy Apache avec un serveur tomcat

Article publié le 8 Novembre 2016

Article mise à jour le 19 Janvier 2018

Très souvent je peux constater que des admins mettent directement leur serveur Tomcat en front (les clients se connectent directement sur le Tomcat).

Il est très vivement recommandé d’utiliser un serveur Apache en front (reverse proxy). En effet l’utilisation d’un serveur apache a les avantages suivants:

  • Sécurité: Le serveur tomcat est isolé de l’extérieur et apache gère mieux les requêtes HTTP
  • Performance: Apache sera plus performant que Tomcat (le moteur HTTP d’apache est beaucoup plus performant).
  • Configuration: Apache contrairement à Tomcat est hautement configurable!

Une fois votre serveur apache installé activez le mode proxy:

a2enmod proxy_http

Créez votre virtualhost:

touch /etc/apache2/site-available/<nom de votre site>.conf

Ajoutez y la configuration suivante

< VirtualHost *: 80>

ServerName <nom de votre site>

ProxyPreserveHost On

ProxyRequests On

ProxyPass / <adresse IP ou DNS de votre appli tomcat>

ProxyPassReverse / <Adresse IP ou DNS de votre appli tomcat>

</VirtualHost>

Activez ensuite votre virtualHost via la commande a2ensite <nom de votre VirtualHost> puis recharger la configuration de  votre serveur apache avec la commande /etc/init.d/apache2 reload





tutoriel | Installation et configuration de Tomcat 9

Article publiée le 8 Novembre 2016

1) Présentation

Tomcat 9 est sortie depuis quelque temps.

Tous d’abord faisons un point sur les nouveautés:

– Implémentation des spécification de JAVA7

– Implémentation de Java Servlet  3.1,

– Implémentation de de JavaServer Page2.3

Ci dessous un petit tuto rappel de comment installer un serveur tomcat (version 9):

Cette article reprend le tutoriel que j’ai rédigé pour tomcat 8 en étant adapté pour cette nouvelle version. Il n’y aura pas de gros changement pour les personnes ayant lu le tutoriel sur tomcat 8 🙂

Prérequis: Java

yum install java* pour (RedHat/Centos) ou apt-get install openjdk* (Sous debian/Ubuntu)

– Créez proprement votre répertoire d’installation de tomcat, dans mon cas cela sera /srv/tomcat

mkdir /srv/tomcat

– Décompressez l’archive dans le répertoire de destination:

mv <votre archive>.tar.gz <repertoire d’installation>  &&  tar -xvf  <repertoire d’installation>/<votre archive>.tar.gz

Exemple:  mv /root/apache-tomcat-9.0.0.tar.gz  /srv/tomcat/

Quelques petites explications:

– Le répertoire bin contient tous les scripts de tomcat notamment ceux de démarrage et d’arrêt.

– Le répertoire conf contient tous les fichiers de configuration de tomcat

– Le répertoire webapps contient toutes les webapps (vos servlets java)

 

2) Configuration

– Allez dans le répertoire conf:

cd conf

– Si vous désirez changer le port d’écoute éditez le fichier server.xml et éditez cette ligne en remplaçant le port par défaut 8080 par celui que vous désirez:

<Connector port= »8080″ protocol= »HTTP/1.1″
connectionTimeout= »20000″
redirectPort= »8443″ />
<!– A « Connector » using the shared thread pool–>

– Editons ensuite le fichier tomcat-user afin de définir le mot de passe de l’interface d’administration de tomcat:

Le dernier « paragraphe »  du fichier de configuration est commenté. Pour le dé-commentez enlevez :

<!– et  –>

Ajoutez ensuite les balises rolename:

<role rolename= »manager »/>

<role rolename= »manager-gui »/>

Créons ensuite le user qui aura les droits d’admin de votre serveur tomcat:

<user username= »tomcat-admin » password= »tomcat » roles= »manager,manager-gui »/>

Sans oublier de modifier le password !

 Nouvel particularité avec Tomcat 9: si vous désirez accéder au manager app depuis une machine distante vous devez créer le fichier conf/Catalina/localhost/manager.xml et y ajoutez les lignes suivantes:

<Context privileged= »true » antiResourceLocking= »false »
docBase= »${catalina.home}/webapps/manager »>
<Valve className= »org.apache.catalina.valves.RemoteAddrValve » allow= »^.*$ » />
</Context>

-Il ne reste plus qu’ à redémarrer Tomcat :

rendez vous dans le répertoire bin (de tomcat) et exécutez ces scripts:

./shutdown.sh (pour arréter tomcat)

./startup.sh (pour démarrer tomcat)

Ici vous trouverez la liste des Webapp déployées.

-Il existe 2 méthodes pour déployer une Webapp (fichier .war):

La première (la plus simple) consiste à cliquer sur le bouton déployer et de sélectionnez votre fichier war.

Tomcat se chargera de la déployer pour vous. Une fois le déploiement terminé vous pourrez voir apparaître une nouvelle ligne avec le nom de votre Webapp.

La deuxième est de déposer le war directement dans le répertoire Webapp est de redémarrer le serveur Tomcat

Votre Webapp sera automatiquement déployée.

 

3) Tunning : 

Il est possible, si vous déployez des applications lourdes ou en grand nombre, que vous ayez des problèmes mémoires.

Dans ce cas vous pourrez avoir des messages d’erreur ou de grosses lenteurs lors de l’exécution de vos webapps.

Pour cela éditez le fichier startup.sh et ajoutez à la ligne export JAVA_OPTS= -server -Xms<mémoire minimal alloué> -Xmx <mémoire maximum alloué>

Exemple:

export JAVA_OPTS= »-server -Xms2048m -Xmx2048m »

Redémarrez votre serveur Tomcat afin que les modifications soient prises en comptes.

Si vous rencontrez d’autres problèmes mémoire vous pouvez vous rendre sur cette page :

http://journaldunadminlinux.fr/tomcat-severe-failed-to-initialize-java-lang-outofmemoryerror-permgen-space/

Cette article traite d’un problème Tomcat et pourra peut-être vous aider.

4) Script de démarrage

Afin de vous faciliter la vie, je vous livre ci-dessous le script de démarrage de tomcat à déposer dans le répertoire init.d:

#!/bin/sh
CATALINA_HOME=<repertoire tomcat>; export CATALINA_HOME
JAVA_HOME=<repertoire java>; export JAVA_HOME
TOMCAT_OWNER=<votre user tomcat>; export TOMCAT_OWNER

start() {
echo -n « Starting Tomcat:  »
su $TOMCAT_OWNER -c $CATALINA_HOME/bin/startup.sh
sleep 2
}
stop() {
echo -n « Stopping Tomcat:  »
su $TOMCAT_OWNER -c $CATALINA_HOME/bin/shutdown.sh
}

# See how we were called.
case « $1″ in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $ »Usage: tomcat {start|stop|restart} »
exit
esac

5) Best Pratice

– Si votre application doit-être accessible depuis le monde extérieur je vous conseille de procéder à un couplage (Apache/Tomcat) avec les règles firewall qui vont bien

– Utilisez toujours un serveur apache en front en mode revese proxy. Vos clients ne doivent pas se connecter en direct sur le Tomcat. Un tuto est disponible: http://journaldunadminlinux.fr/tutoriel-mettre-en-place-un-reverse-proxy-sur-apache-via-mod_proxy/

 




Tutoriel | Installer et paramétrer un FTP sécurisé avec VsFTPD

Article publiée le 12 Octobre 2016

Petit tuto expliquant comment configurer un serveur FTPs sécurisé avec vsftpd. Vsftpd étant le serveur FTP le plus sécurisé, je vous le recommande fortement.

– Installez vsftpd via la commande apt-get install vsftpd (sous Debian) ou yum install vsftpd (sous RedHat/CentOS)

– Une fois l’installation effectuée, éditez le fichier /etc/vsftpd/vsftpd.conf et écraser le contenu avec la configuration suivante (sans oublier de faire une sauvegarde du fichier original):

anonymous_enable=NO
# A adapter
pasv_min_port=30000
pasv_max_port=30099
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
local_umask=18
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=1200
chroot_local_user=YES
listen=YES
max_clients=30
pam_service_name=vsftpd.virtual
guest_enable=YES
user_sub_token=$USER
local_root=/srv/ftp/$USER
hide_ids=YES
userlist_enable=YES
tcp_wrappers=YES
ssl_enable=YES
allow_anon_ssl=NO
allow_writeable_chroot=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/ssl/certs/<nom du fichier>.crt
rsa_private_key_file=/etc/ssl/private/<nom du fichier>.key
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
– On génère ensuite un certificat auto-signé:
openssl req -x509 -newkey rsa:1024-keyout /etc/ssl/private/private.key -out /etc/ssl/certs/certificate.crt -nodes -days 3650
chmod 0600/etc/ssl/private/private.key; chmod 0640/etc/ssl/certs/certificate.crt
– On configure le PAM (vi /etc/pam.d/vsftpd.virtual)
#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd/login
account    required     pam_userdb.so db=/etc/vsftpd/login
session    required     pam_loginuid.so
– On crée le user ftp:
useradd ftp
– On oublies pas de créer le répertoire des comptes FTP selon ce que vous avez indiqué dans le fichier de configuration vsftpd.conf. Dans notre cas /srv/ftp
– Créez le fichier de user ftp (touch /etc/vsftpd/login.txt) et on le renseigne comme l’exemple ci dessous:
user1
passworduser1
user2
passworduser2
– On génère ensuite le fichier login.db (bekerley DB):
db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
– Créez le répertoire FTP associé à l’utilisateur:
mkdir -p /srv/ftp/user1
mkdir -p /srv/ftp/user2
chown -R ftp:ftp /srv/ftp
– Enfin on redémarre le service vsftpd
service vsftpd restart