# Einführung in Linux
YALC - Yet Another Linux Course
Author: Daniel Schubert

# LINUX

### Das universelle Betriebssystem

Eine Einführung - Teil 14

Deutsche Angestellten Akademie

Frage: Fragen zur letzten Stunde?

### lampp stack

Linux & Apache & mysql & php

    ~$ sudo apt install apache2 mysql-server phpmyadmin

    ~$ mysql -u root -p
    MariaDB [(none)]> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'some_very_complex_password';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost'; FLUSH PRIVILEGES;
    MariaDB [(none)]> \q

- http://localhost/phpmyadmin
- user: phpmyadmin
- http://localhost/phpmyadmin

### mysql

mysql ist eine „relationale Datenbank”

> Relationale Datenbanken versuchen, die Realität in einem Datenmodell abzubilden.

- Jede Zeile einer Tabelle ist ein Datensatz
- Jede Zeile ( Tupel ) besteht aus Attributen ( die Spalten )
- Über Primärschlüssel werden Beziehungen hergestellt
- Eine Datenbank kann viele Tabellen beinhalten
- Die Tabellen stehen in Beziehung ( Relation )

Quelle: http://www.datenbanken-verstehen.de/datenbank-grundlagen/datenbankmodell/relationales-datenbankmodell/

#### Normalisierung

Aufteilung der Attribute (Spalten) in mehrere Relationen ( Tabellen ), so dass eine Form ohne Redundanzen entsteht.

Rg Nr | Datum | Name | Straße | Ort | Artikel | Anzahl | Preis
143 | 01.04.2018 | Max Müller | Trumstrasse 4 | 75179 Pforzheim | Bleistift | 1001 | 1,00€

1. Normalform

Rg Nr | Datum | Vor Name | Nach Name | Straße | Hausnr | PLZ | Ort | Artikel | Anzahl | Preis
143 | 01.04.2018 | Max | Müller | Trumstrasse | 4 | 75179 | Pforzheim | Bleistift | 1001 | 1,00€

Rg Nr | Datum | Vor Name | Nach Name | Straße | Hausnr | PLZ | Ort | Artikel | Anzahl | Preis
144 | 01.04.2018 | Max | Müller | Trumstrasse | 4 | 75179 | Pforzheim | Bleistift | 1001 | 1,00€
145 | 01.04.2018 | Max | Müller | Trumstrasse | 4 | 75179 | Pforzheim | Tüte | 1001 | 0,10€
146 | 01.04.2018 | Max | Müller | Trumstrasse | 4 | 75179 | Pforzheim | Ratzefummel | 1001 | 1,50€

Kunden

ID | Vor Name | Nach Name | Straße | Hausnr | PLZ | Ort
1234 | Max | Müller | Trumstrasse | 4 | 75179 | Pforzheim

Rechnungen:

Rg Nr | Datum | KundenID | Artikel | Anzahl | Preis
144 | 01.04.2018 | 1234 | Bleistift | 1001 | 1,00
145 | 01.04.2018 | 1234 | Tüte | 12 | 0,10
146 | 01.04.2018 | 1234 | Ratzefummel | 32 | 1,50

Verbindung aufnehmen:

    ~$ sudo mysql
    # oder:
    ~$ mysql -u BENUTZERNAME -p -h localhost

- -u : Username
- -p : Passwort abfragen
- -h : Host

Datenbank erstellen

    CREATE DATABASE IF NOT EXISTS test;

    USE test;

    CREATE TABLE IF NOT EXISTS books (
      BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      Title VARCHAR(100) NOT NULL,
      SeriesID INT, AuthorID INT);

    CREATE TABLE IF NOT EXISTS authors
    (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);

    CREATE TABLE IF NOT EXISTS series
    (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);

    INSERT INTO books (Title,SeriesID,AuthorID)
    VALUES('The Fellowship of the Ring',1,1),
          ('The Two Towers',1,1), ('The Return of the King',1,1),
          ('The Sum of All Men',2,2), ('Brotherhood of the Wolf',2,2),
          ('Wizardborn',2,2), ('The Hobbbit',0,1);

Tabellen anzeigen

    SHOW TABLES;

    +----------------+
    | Tables_in_test |
    +----------------+
    | authors        |
    | books          |
    | series         |
    +----------------+
    3 rows in set (0.00 sec)

    DESCRIBE books;

    +----------+--------------+------+-----+---------+----------------+
    | Field    | Type         | Null | Key | Default | Extra          |
    +----------+--------------+------+-----+---------+----------------+
    | BookID   | int(11)      | NO   | PRI | NULL    | auto_increment |
    | Title    | varchar(100) | NO   |     | NULL    |                |
    | SeriesID | int(11)      | YES  |     | NULL    |                |
    | AuthorID | int(11)      | YES  |     | NULL    |                |
    +----------+--------------+------+-----+---------+----------------+

Daten anzeigen:

    SELECT * FROM books;

    +--------+----------------------------+----------+----------+
    | BookID | Title                      | SeriesID | AuthorID |
    +--------+----------------------------+----------+----------+
    |      1 | The Fellowship of the Ring |        1 |        1 |
    |      2 | The Two Towers             |        1 |        1 |
    |      3 | The Return of the King     |        1 |        1 |
    |      4 | The Sum of All Men         |        2 |        2 |
    |      5 | Brotherhood of the Wolf    |        2 |        2 |
    |      6 | Wizardborn                 |        2 |        2 |
    |      7 | The Hobbbit                |        0 |        1 |
    +--------+----------------------------+----------+----------+
    7 rows in set (0.00 sec)

Daten einfügen:

    INSERT INTO books (Title, SeriesID, AuthorID)
    VALUES ("Lair of Bones", 2, 2);

    Query OK, 1 row affected (0.00 sec)

    SELECT * FROM books;

Daten modifizieren:

    UPDATE books
    SET Title = "The Hobbit"
    WHERE BookID = 7;

    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

Speicherort:

    /var/lib/mysql

Konfiguration

    /etc/mysql/my.cnf

Andere Datenbanken:

- PostgreSql
- SQLite
- Redis
- MongoDB

### Apache Webserver

- Apache ist der meistgenutzte (?) Webserver
- Apache beantwortet http Requests.
- Punkt.
- kennt Module -> Funtionserweiterung
- interpretiert versch. Script-Sprachen über Module
- Liste der Module
- php, ruby, perl, lua, JavaScript, .net .....

- aktuelle Version 2.3 ( deswegen apache2 )
- Standard Speicherort f. Webseiten: /var/www/html
- Aufruf per Browser :
  http://localhost/
  http://SERVER-IP_ODER_NAME/
- Standardmässig wird `index.html` ausgeliefert
- wenn nicht vorhanden Liste des Verz. Inhalt
- Steuerung über
  `systemctl start | stop | restart | reload | force-reload apache2`

#### Konfiguration

- `/etc/apache2/apache2.conf`
- Zusätzliche conf Files:
  `/etc/apache2/conf-available/`
- Einzelne Webseiten ( vhosts )
  `/etc/apache2/sites-available/`
- per Verzeichnis: `.htaccess`

De-/ Aktivieren einer Zusätzlichen Konfigurationsdatei

    ~$ sudo a2enconf NAME_DER_DATEI.conf
    ~$ sudo a2disconf NAME_DER_DATEI.conf

De-/ Aktivieren einer Zusätzlichen Webseite

    ~$ sudo a2ensite MEINE_WEBSEITE.conf
    ~$ sudo a2dissite MEINE_WEBSEITE.conf

Diese beiden Befehle machen Symlinks in die Ordner
`/etc/apache/[ conf | site ]-enabled`

Nach Änderungen in diesen Dateien:

    ~$ sudo systemctl reload apache2

#### Virtual Hosts

Es ist möglich, von einem Server verschiedene Domains auszuliefern mit sog. Virtual Hosts.

Beispiel:: beispiele/15/schubertdaniel.conf

Aufgabe:

Erstellt eine Webseite namens omikron, die per

`http://localhost/omikron`
aus dem Ordner

`/var/www/html/omikron`
ausgeliefert wird.

Aufgabe:

Verlegt die Wordpress Installation nach `/home/NUTZERNAME/www/wordpress`