Webserver cluster [High Availability]

I recently wanted some kind of high availability for my private websites and applications, so I decided to setup a second server at my dads office as a failover system.

Install GlusterFs for file syncing.

The latest stable version for me was 3.8, but check the authors site, because GlusterFS is geeting new updates from time to time. It is recommended to use a separate partition for GlusterFS, but as I already got my setup up and runnig on the first node i am only covering the simple way.

@every node

# add-apt-repository ppa:gluster/glusterfs-3.8
# apt update
# apt install glusterfs-server
# update-rc.d glusterfs-server defaults

2. Setting up dns (makes things much easier)

@ every node

# nano /etc/hosts

192.168.255.101 node1 web02
192.168.255.102 node02 web02

Open Firewall

@ node1

#  gluster peer probe node2

@ node2

# gluster peer probe node1
# gluster peer status

Create a volume “cluster-data”

# gluster volume create cluster rep 2 transport tcp node1:/data node2:/data
# gluster volume start master

Mount the volume
Do this on each node, because we are planning to use our gluster file-system with the webserver on the nodes itself.

# mkdir /cluster

@ every node

# nano /etc/fstab
localhost:/cluster /cluster glusterfs defaults,_netdev 0 0
# mount -a

@ node1

# mkdir -p /cluster/etc
# mkdir -p /cluster/www
# mkdir -p /cluster/var/lib
# mkdir -p /cluster/log
# mv /etc/nginx /cluster/etc
# mv /etc/php /cluster/etc
# mv /etc/mysql /cluster/etc
# mv /var/lib/mysql /cluster/var/lib/mysql
# mv /var/lib/php /cluster/var/lib/php
# mv /var/www /cluster/www
# mv /var/log/nginx /cluster/log
# mv /var/log/mysql /cluster/log

@ every node, apart from node1

# rm -r /etc/nginx
# rm -r /etc/php
# rm -r /etc/mysql
# rm -r /var/lib/mysql
# rm -r /var/lib/php
# rm -r /var/www
# rm -r /var/log/nginx
# rm -r /var/log/mysql

@ every node

# ln -s /cluster/etc/nginx /etc/nginx 
# ln -s /cluster/etc/php /etc/php
# ln -s /cluster/etc/mysql /etc/mysql
# ln -s /cluster/db /var/lib/mysql
# ln -s /cluster/php /var/lib/php
# ln -s /cluster/www /var/www
# ln -s /cluster/log/nginx /var/log/nginx
# ln -s /cluster/log/mysql /var/log/mysql

Usefull Linux Commands

Search for a string recursively

grep -rnw './' -e "imsearchingyou"

or a bit more clearly:

grep -Hornw './' -e "imsearchingyou"

Edit the default version of an alternatives software

update-alternatives --set php /usr/bin/php5.6

Generate super secure passwords

apt install pwgen
pwgen -s -y 32 -N 1

Checking opened ports

apt install nmap
nmap -p 80 test.de

for upd ports:

nmap -sU -p 53 test.de

for localhost:

netstat -tulpn

Add user without login shell

useradd -s /sbin/nologin anton

Add user to group

usermod -a -G groupName anton

Howto Git

neues repository erstellen

erstelle ein neues Verzeichnis, öffne es und führe
git init
aus, um ein neues git-Repository anzulegen.

ein repository auschecken

erstelle eine Arbeitskopie, indem du folgenden Befehl ausführst:
git clone /pfad/zum/repository
Falls du ein entferntes Repository verwendest, benutze:
git clone benutzername@host:/pfad/zum/repository

add & commit

Du kannst Änderungen vorschlagen (zum Index hinzufügen) mit
git add <dateiname>
git add .
git add -u . (Lösche nicht gelöschte Dateien vom HEAD)
Das ist der erste Schritt im git workflow, du bestätigst deine Änderungen mit:
git commit -m "Commit-Nachricht"
Jetzt befindet sich die Änderung im HEAD, aber noch nicht im entfernten Repository.

änderungen hochladen

Die Änderungen sind jetzt im HEAD deines lokalen Repositories. Um die Änderungen an dein entferntes Repository zu senden, führe:
git push origin master
aus. Du kannst master auch mit einem beliebigen anderen Branch ersetzen, mehr über Branches erfährst du später.

Wenn du dein lokales Repository nicht von einem entfernten geklont hast und du diese aber mit einem anderen Repository verbinden möchtest, musst du dieses mit
git remote add origin <server>
hinzufügen. Jetzt bist du bereit, deine Änderungen hochzuladen

branching

Branches werden benutzt, um verschiedene Funktionen isoliert voneinander zu entwickeln. Der master-Branch ist der “Standard”-Branch, wenn du ein neues Repository erstellst. Du solltest aber für die Entwicklung andere Branches verwenden und diese dann in den Master-Branch zusammenführen (mergen). Auch das lernst du später.

Erstelle einen neuen Branch mit dem Namen “feature_x” und wechsle zu diesem:
git checkout -b feature_x
Um zum Master zurück zu wechseln:
git checkout master
Und um den eben erstellten Branch wieder zu löschen:
git branch -d feature_x
Ein Branch ist nicht für andere verfügbar, bis du diesen in dein entferntes Repository hochlädst:
git push origin <branch>

update & merge

Um dein lokales Repository mit den neuesten Änderungen zu aktualisieren, verwende:
git pull
in deiner Arbeitskopie, um die Änderungen erst herunterzuladen (fetch) und dann mit deinem Stand zusammenzuführen (merge).
Wenn du einen anderen Branch mit deinem aktuellen (z.B. master) zusammenführen willst, benutze:
git merge <branch>
In beiden Fällen versucht git die Änderungen automatisch zusammenzuführen. Unglücklicherweise ist dies nicht immer möglich und endet in Konflikten. Du bist verantwortlich, diese Konflikte durch manuelles Editieren der betroffenen Dateien zu lösen. Bist du damit fertig, musst du das git mit folgendem Befehl mitteilen:
git add <dateiname>
Bevor du Änderungen zusammenführst, kannst du dir die Differenzen auch anschauen:
git diff <quell_branch> <ziel_branch>

merge conflicts lösen

Quelle: https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/

  1. Navigate into the local Git repository that has the merge conflict.
    cd REPOSITORY-NAME
    
  2. Generate a list of the files affected by the merge conflict. In this example, the file styleguide.md has a merge conflict.
    git status
    # On branch branch-b
    # You have unmerged paths.
    #   (fix conflicts and run "git commit")
    #
    # Unmerged paths:
    #   (use "git add ..." to mark resolution)
    #
    # both modified:      styleguide.md
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    
  3. Open your favorite text editor, such as Atom, and navigate to the file that has merge conflicts.
  4. To see the beginning of the merge conflict in your file, search the file for the conflict marker <<<<<<<. When you open the file in your text editor, you’ll see the changes from the HEAD or base branch after the line <<<<<<< HEAD. Next, you’ll see =======, which divides your changes from the changes in the other branch, followed by >>>>>>> BRANCH-NAME. In this example, one person wrote “open an issue” in the base or HEAD branch and another person wrote “ask your question in IRC” in the compare branch or branch-a.
    If you have questions, please
    <<<<<<< HEAD
    open an issue
    =======
    ask your question in IRC.
    >>>>>>> branch-a
    
  5. Decide if you want to keep only your branch’s changes, keep only the other branch’s changes, or make a brand new change, which may incorporate changes from both branches. Delete the conflict markers <<<<<<<, =======, >>>>>>> and make the changes you want in the final merge. In this example, both changes are incorporated into the final merge:
    If you have questions, please open an issue or ask in our IRC channel if it's more urgent.
    
  6. Add or stage your changes.
    git add .
    
  7. Commit your changes with a comment.
    git commit -m "Resolved merge conflict by incorporating both suggestions."

änderungen rückgängig machen

Falls du mal etwas falsch machst (was natürlich nie passiert 😉 ) kannst du die lokalen Änderungen mit:
git checkout -- <filename>
auf den letzten Stand im HEAD zurücksetzen. Änderungen, die du bereits zum Index hinzugefügt hast, bleiben bestehen.

Wenn du aber deine lokalen Änderungen komplett entfernen möchtest, holst du dir den letzten Stand vom entfernten Repository mit folgenden Befehlen:
git fetch origin
git reset --hard origin/master

Quelle: https://rogerdudler.github.io/git-guide/index.de.html

TFTP Server Install and Setup

TFTP Server Install and Setup

  1. Install following packages.

    sudo apt-get install xinetd tftpd tftp
    
  2. Create /etc/xinetd.d/tftp and put this entry

    service tftp
    {
    protocol        = udp
    port            = 69
    socket_type     = dgram
    wait            = yes
    user            = nobody
    server          = /usr/sbin/in.tftpd
    server_args     = /tftpboot
    disable         = no
    }
    
  3. Create a folder /tftpboot this should match whatever you gave in server_args. mostly it will be tftpboot

    sudo mkdir /tftpboot
    sudo chmod -R 777 /tftpboot
    sudo chown -R nobody /tftpboot
    
  4. Restart the xinetd service.

    newer systems:

    sudo service xinetd restart
    

    older systems:

    sudo /etc/init.d/xinetd restart
    

Now our tftp server is up and running.

Testing our tftp server

  1. Create a file named test with some content in /tftpboot path of the tftp server

    Obtain the ip address of the tftp server using ifconfig command

  2. Now in some other system follow the following steps.

    tftp 192.168.1.2
    tftp> get test
    Sent 159 bytes in 0.0 seconds
    
    tftp> quit
    
    cat test
    

Source:
http://mohammadthalif.wordpress.com/2010/03/05/installing-and-testing-tftpd-in-ubuntudebian/