Tag archieven: centos

Mod_wsgi in Apache

Om via een webserver Python scripts te kunnen gebruiken en specifiek Django of Flask voor bijvoorbeeld API deployments zal je de server iets bij moeten werken.

Onderstaand voorbeeld is hoe je dus Mod_wsgi activeert in een Centos7 server voorzien van Apache 2.4. De keuze op Python versie is sowieso 3.x en in dit voorbeeld 3.8.7.

Belangrijk is om root rechten te hebben. We beginnen met 2 environment variabelen te definiëren:

export PATH=$PATH:/usr/local/bin/
export LD_RUN_PATH=/usr/local/lib/

Hierna zorgen we dat de package apxs beschikbaar is, die via httpd-devel te vinden is:

yum install -y httpd-devel

Dan is het zaak Python te installeren. Vanwege redenen is Centos7 nog steeds standaard uitgerust met versie 2.7 en dat willen we verder niet gebruiken. Het is dus belangrijk dat de installatie naast de bestaande komt te draaien. Het hele Centos ecosysteem is afhankelijk van de huidige versie. Dat word met ‘make altinstall‘ bepaald.

Nog veel belangrijker is de ‘–enable-shared‘ optie waarme Python op de juiste manier compiled word. Vergeet deze niet!

cd /tmp
wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz
tar -xf Python-3.8.7.tgz -C /usr/local/src
cd /usr/local/src/Python-3.8.7
./configure --enable-shared --enable-optimizations
make altinstall

Als het goed is kan je daarna Python3.8 starten:

[root@mightyserver ~]# python3.8
Python 3.8.7 (default, Jan  2 2021, 14:19:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Voor we de module mod_wsgi introduceren in Apache moet er nog een kleine update gedaan worden:

/usr/local/bin/python3.8 -m pip install --upgrade pip

Nu kunnen we via ‘Pip’ de installatie van de module uitvoeren en deze configureren:

pip3.8 install mod_wsgi
mod_wsgi-express install-module > /etc/httpd/conf.modules.d/02-wsgi.conf

systemctl restart httpd

Een controle kan gedaan worden of de module beschikbaar is:

[root@mightyserver ~]# httpd -t -D DUMP_MODULES | grep wsgi
 wsgi_module (shared)

In de volgende post meer over hoe nu Apache te ‘sturen’ is naar jouw Python project.

Emergency Backup op de QNAP

In mijn thuis situatie heb ik een QNAP (TS-412)  actief waarop meerdere gebruikers hun bestanden kwijt kunnen. Nu had ik laatst het idee; wat als… Ja wat als. Wat als er brand uit breekt, of wat als de mooie polder waar ik mij in bevind weer onder water komt. Dan is het nodige kwijt.

Een disaster backup, of emergency backup is dan wel wenselijk. Maar dan geen dikke media files, geen duizenden foto’s of gedownloade installatiebestanden; nee.
Documenten. De digitalisering is redelijk toegeslagen en alle documenten van papier worden langzamerhand ingescanned of opgeslagen in een directory ‘Digiarchive’.

Hier heb ik, want zelf maken is leuker, een setup voor gebouwd en een script voor gemaakt. De setup is eenvoudig:

  • 1x VPS op de eigen vCloud omgeving in Amsterdam met 300GB storage, Centos als een NFS server.
  • 1x VPN IKE/IPsec
  • 1x QNAP met SSH access

Op de NFS server moet het bestand /etc/exports gevuld worden. Hier moet verteld worden in welke map wie en hoe bij mag. In dit geval de map /var/data/vrieskist en de host 192.168.1.100 (QNAP):

/var/data/vrieskist 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)

Daarna kan het script gemaakt worden in het bestand embackup.sh . Hierin zit een dependency voor het bestand to_backup. In dit bestand kan je alle directory’s of files aangeven welke je elke maand gebackuped wil hebben.

Het script werkt als volgt:

  1. Geen input bestand? Stop
  2. Directory waarin de mount moet zijn bestaat niet? Maak aan, bij fout: Stop
  3. Mount zelf bestaat niet? Maak aan, bij fout: Stop
  4. Bestaat dezelfde maand van vorig jaar? Delete deze
  5. Bestaat deze maand van dit jaar? Dan heeft de backup al  gedraaid
  6. Kopieer de direcotory’s/bestanden
#!/bin/bash

if [ ! -f /share/Bartjan/Scripts/to_backup ]; then
	# input file does not exists, failing
	echo "No input file detected, exiting..."
	exit 1
fi
	
if [ ! -d "/mnt/dcstore/vrieskist" ]; then
	# dir does not exists, try to create
	echo "Mountpoint directory does not exists"
	echo "Trying make the mountpoint directory"
	mkdir -p /mnt/dcstore/vrieskist 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Mount point directory created"
		echo ""
	else
		echo "Cannot create mount point directory" >&2
		exit 1
	fi
elif [ -d "/mnt/dcstore/vrieskist" ]; then
	echo "Mountpoint directory exists"
fi


if ! `grep -qs /mnt/dcstore/vrieskist /proc/mounts`; then
	echo "Mountpoint directory does exists"
	echo "Trying to make the mount"
	mount -t nfs 192.168.100.14:/var/data/vrieskist /mnt/dcstore/vrieskist/ 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Mount point created"
		echo ""
	else
		echo "Cannot create mount point" >&2
		exit 1
	fi
elif `grep -qs /mnt/dcstore/vrieskist /proc/mounts`; then
	echo "Mount exists"
fi


# Looks like the critical parts are in place...

LASTYEAR=`date +%b_%Y --date="1 year ago"`
THISYEAR=`date +%b_%Y`

if [ -d "/mnt/dcstore/vrieskist/$LASTYEAR" ]; then
	echo "$LASTYEAR: it exists"
	rm -rf /mnt/dcstore/vrieskist/$LASTYEAR 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Directory $LASTYEAR purged"
		echo ""
	else
		echo "Cannot remove directory $LASTYEAR" >&2
		exit 1
	fi
else
	echo "$LASTYEAR: it does not exists"
fi

if [ -d "/mnt/dcstore/vrieskist/$THISYEAR" ]; then
	echo "$THISYEAR: it exists. Probably no need to copy.."
else
	echo "$THISYEAR: does not exists"
	echo "Creating target directory"
	mkdir /mnt/dcstore/vrieskist/$THISYEAR 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Target directory created"
		echo ""
	else
		echo "Cannot create target directory" >&2
		exit 1
	fi
	echo "Copying..."
	echo ""
	while read line; do
		cp -a "$line" /mnt/dcstore/vrieskist/$THISYEAR/ 2> /dev/null
	done < /share/Bartjan/Scripts/to_backup
	if [ $? -eq 0 ]; then
		echo "Copy succesfull!"
		echo ""
	else
		echo "Failure: Cannot copy source to target directory" >&2
		exit 1
	fi
fi

exit 0

De output kan zijn:

[./Scripts] # .embackup.sh
Mountpoint directory exists
Mount exists
Mar_2016: it does not exists
Mar_2017: does not exists
Creating target directory
Target directory created

Copying..
Copy succesfull!

Maar ook het kan als volgt zijn:

[./Scripts] # .embackup.sh
Mountpoint directory does not exists
Trying make the mountpoint directory
Mount point directory created

Mountpoint directory does exists
Trying to make the mount
Mount point created

Mar_2016: it does not exists
Mar_2017: it exists. Probably no need to copy..

Het doel word hiermee simpel bereikt. Dit kan vast en zeker in bestaande software pakketten of misschien veel simpeler. Dit is nu zo gedaan vanwege de automatische restore van systeem settings op de Qnap. Na een reboot zijn mount points weg, directory’s in /mnt en zo nog een paar zaken. Het staat nu in de crontab van de QNAP dat het elke maar de eerste dag even draait.

Natuurlijk, het is ook vast vanuit de QNAP store middels een te installeren programma mogelijk naar een online cloud dienst en dat is prima. Maar ik heb nu de controle over wat, hoe en ook waar.

Deel 2: Simpel backup script voor je Linux machine

Eerder heb ik geschreven over mijn backup script. Deze zou ik nog aanpassen zodat het niet faalt als er een inputfile mist omdat er bijvoorbeeld geen SQL actief zou zijn. Hierbij dus de iteratie en daarmee het volledige script.

Met een paar simpele ‘if, else’ blokken is het uitgebreid en werkt het zonder problemen. Bij totaal geen input files word er niets gedaan dan enkel een log entry, dat er geen werk is.

Ook een $var bijgevoegd “basefolder” puur voor de handigheid.

#!/bin/bash
#
# Backup script for the daily and weekly copys
# Files to fill:
#       to_backup               Normal files, webcontent, configuration dirs. Note: no wildcards like '*'
#       to_backup_sql           SQL databases. Enter only the database name
#
# 16-06-2013: created by bartjan@pc-mania.nl
# 03-09-2016: re-done script (simplified, improved, universal, use of input files)
# 13-10-2016: checks made if input files exist

# Variables to work with

if [[ "$(date +%a)" != "Sun" ]]; then
        btype="daily"
else
        btype="weekly"
fi
servername="$(hostname -s)"
log="/var/log/backuplog"
destination="vrieskist:/share/Backups/$servername/$btype"
basefolder="/root/scripts"

printf "\n========== $btype backup started at $(date) ==========\n" >> $log

# Do the backup of files, if any
if [[ -f $basefolder/to_backup ]]; then
        while read line
        do
                data="$data $line"
        done < $basefolder/to_backup
        printf "\nCopying Webcontent and Webserver configuration files...\n\n" >> $log

        rsync -avphR --delete --log-file="$log" $data $destination
else
        nofiles=true
fi

# Do the backup of databases, if any
if [[ -f $basefolder/to_backup_sql ]]; then
        printf "\nMaking the MySQL dumps...\n" >> $log
        if [ ! -d "/tmp/mysqlbackup_tmp" ]; then
                mkdir /tmp/mysqlbackup_tmp
        fi
        while read line
        do
                mysqldump --defaults-extra-file=/root/.my.cnf $line > /tmp/mysqlbackup_tmp/$line.sql
        done < $basefolder/to_backup_sql
        printf "\nCopying Databases and MySQL configuration...\n" >> $log

        rsync -avph --delete --log-file="$log" /tmp/mysqlbackup_tmp/* $destination/mysql/

        printf "\nCleanup after SQL backup...\n" >> $log
        rm -rf /tmp/mysqlbackup_tmp
else
        nosql=true
fi

if [[ ! -z $nofiles && $nosql ]]; then
        printf "\nNothing to backup apparently...\n\n" >> $log
else
        printf "\nAll done!\n\n" >> $log
fi

Simpel backup script voor je Linux machine

Een poos terug heb ik mijn backup scriptje aangepast dat het universeler te gebruiken werd over meerdere machines. Er werd te moeilijk gedaan, meerdere rsync commando’s (per map 1 rsync), geen variabelen enzovoorts.

Even een korte situatie schets: Er zijn een 3-tal Linux (CentOS 5/6) VM’s die gebackupped moeten worden. Kort gezged, die zijn als de bekende LAMP stacks opgebouwd. Deze backup gaat het datacenter uit naar de QNAP TS-412 thuis genaamd “vrieskist”. Elke dag loopt een backup: deze is ‘daily’ en op zondag draait de ‘weekly’. Redelijk simpel toch?

De map structuur word door de juiste rsync parameter ook duidelijk; /var/www/html word opgeslagen in de map /share/Backups/servernaam/daily/var/www/html

Er zijn een tweetal invoer bestanden die naast het script zelf staan:
– to_backup
– to_backup_sql

Hierin staat de mappen en bestanden die je mee wil nemen in de backup. Het SQL bestand mag duidelijk zijn; de databases, en in het bestand de database-naam.

Het resultaat; slechts een tweetal Rsync acties, en een veel duidelijkere logfile met een voor ‘platte data’ 1 eindoverzicht van statistieken.

Er zal vast nog wel even een nieuwe IF-conditie (if [[ -f to_backup_sql ]])bij komen zodat je bij een kale webserver,dus geen MySQL, het bestand ’to_backup_sql’ niet hoeft te plaatsen en het script zelf niet hoeft aan te passen.

#!/bin/bash
#
# Backup script for the daily and weekly copys
#
# created by bartjan@pc-mania.nl, date 16-06-2013
# redone script (simplified, improved, universal, use of input files) 03-09-2016
HOME=/root/

# Variables to work with
if [[ "$(date +%a)" != "Sun" ]]; then
        btype="daily"
else
        btype="weekly"
fi
servername="$(hostname -s)"
log="/var/log/backuplog"
destination="vrieskist:/share/Backups/$servername/$btype"


# Do the backup of files
while read line
do
        data="$data $line"
done < /root/scripts/to_backup

printf "\n========== $btype backup started at $(date) ==========\n" >> $log
printf "\nCopying Webcontent and Webserver configuration files...\n\n" >> $log

rsync -avphR --delete --log-file="$log" $data $destination

# Do the backup of databases
printf "\nMaking the MySQL dumps...\n" >> $log
if [ ! -d "/tmp/mysqlbackup_tmp" ]; then
        mkdir /tmp/mysqlbackup_tmp
fi
while read line
do
        mysqldump --defaults-extra-file=/root/.my.cnf $line > /tmp/mysqlbackup_tmp/$line.sql
done < /root/scripts/to_backup_sql
printf "\nCopying Databases and MySQL configuration...\n" >> $log

rsync -avph --delete --log-file="$log" /tmp/mysqlbackup_tmp/* $destination/mysql/

printf "\nCleanup after backup...\n" >> $log
rm -rf /tmp/mysqlbackup_tmp
printf "\nAll done!\n\n" >> $log

#HOME=/