Instalacja i konfiguracja Apache/MySQL/PHP w OpenWrt
Ostatnia zmiana: 2018-09-22 09:23

LAMP jest akronimem określającym platformę serwerową składającą się z następujących elementów:

  • Linux (system operacyjny)
  • Apache (serwer www)
  • MySQL (baza danych)
  • PHP (język skryptowy)
Nic nie stoi na przeszkodzie aby takie połączenie oprogramowania zainstalować na OpenWrt/LEDE; linux już jest, należy tylko zainstalować pozostałe komponenty (użyjemy Lighttpd jako serwera www, MariaDB jako bazę danych i PHP7 jako język skryptowy). Mała uwaga: routery mają małą ilość pamięci RAM i są ograniczone zasobami obliczeniowymi. Nie będzie to super wydajna platforma, ale do domowych i niewielkich zastosowań może się sprawdzić.
Niezbędne jest posiadanie zewnętrznego nośnika na bazę danych oraz najlepiej extroot, jako że same pakiety zajmują dość dużo miejsca. Całość przetestowano na wydaniu OpenWrt 18.06.

Mała uwaga: poniższy zestaw nie nadaje się do routerów z 32MB pamięci RAM. Przyda się jak największa ilość pamięci RAM oraz ew. swap.

Założenia:

  • serwer nasłuchuje na porcie 80 (więc wyłączamy wbudowane LuCI)
  • katalog główny serwera to /www1
Przed instalacją należy spełnić w/w wymagania, czyli:


    # opkg update
    # mkdir -p /www1
    # /etc/init.d/uhttpd stop
    # /etc/init.d/uhttpd disable


  • mamy dostateczną ilość wolnego miejsca, najlepiej wykonać extroota z wykorzystaniem nośnika USB

Apache

W wydaniu LEDE 17.01 apache ma problemy z poprawnym działaniem. Poniższy opis został zachowany w celach archiwalnych, ale nie należy go używać. W zamian należy użyć np. lighttpd.

Instalacja



    # opkg install apache zlib

Konfiguracja

Plik konfiguracyjny znajduje się w pliku /etc/apache/httpd.conf. Należy zmienić linię zawierającą DocumentRoot tak, aby wskazywała na wymagany przez nas katalog, czyli:


    DocumentRoot "/usr/share/htdocs"

na


    DocumentRoot "/www1"

Należy też zmienić sekcję


    <Directory "/usr/share/htdocs">

na


    <Directory "/www1">

Z powodu błędu w pakiecie należy także zmienić opcję LogLevel na error.


    LogLevel debug

na


    LogLevel error

Uruchomienie



    # apachectl start

Poprawnie działanie można sprawdzić umieszczając dowolny plik pod nazwą index.html w katalogu /www1, np


    # echo "<html><body>To dziala!</body></html>" > /www1/index.html

I wchodzimy przeglądarką na adres routera, np http://192.168.1.1/index.html

Aby apache uruchamiało się po starcie routera należy np. w/w linię dopisać jako pierwszą w pliku /etc/rc.local.

Lighttpd

Niestety program apache na OpenWrt/LEDE działa źle i często są problemy z jego uruchomieniem. Dlatego też można zainstalować inny serwer http, np. lighttpd.

Instalacja



    # opkg install lighttpd lighttpd-mod-cgi

Konfiguracja

Zawarta jest w pliku /etc/lighttpd/lighttpd.conf. Zmieniamy


    server.document-root = "/www"

na


    server.document-root = "/www1"

Uruchomienie



    # /etc/init.d/lighttpd stop
    # /etc/init.d/lighttpd enable
    # /etc/init.d/lighttpd start

Poprawnie działanie można sprawdzić umieszczając dowolny plik pod nazwą index.html w katalogu /www1, np


    # echo "<html><body>To dziala!</body></html>" > /www1/index.html

I wchodzimy przeglądarką na adres routera, np http://192.168.1.1/index.html

PHP

Instalacja



    # opkg install php7-cgi php7-mod-mysqli zoneinfo-core libxml2 php7-mod-openssl
    # mv /etc/php7/20_openssl.ini /etc/php7/15_openssl.ini

Konfiguracja Apache

Konfigurujemy tylko jeżeli faktycznie używamy Apache. Do zmiany niezbędna jest aktualizacja pliku konfiguracyjnego apache. Dodajemy tzw. handler do obsługi plików php przez cgi na końcu pliku /etc/apache/httpd.conf.


    ScriptAlias /local-bin /usr/bin
    AddHandler application/x-httpd-php php
    Action application/x-httpd-php /local-bin/php-cgi
    <Directory "/usr/bin">
        Order allow,deny
        Allow from all
    </Directory>

Restartu dokonujemy poleceniem


    # apachectl restart

Konfiguracja Lighttpd

Konfigurujemy jeżeli faktycznie używamy Lighttpd. W pliku /etc/lighttpd/conf.d/30-cgi.conf zamieniamy:


    cgi.assign = ( ".pl" => "/usr/bin/perl",
        ".cgi" => "/usr/bin/perl",
        ".rb" => "/usr/bin/ruby",
        ".erb" => "/usr/bin/eruby",
        ".py" => "/usr/bin/python" )

na


    cgi.assign = ( ".pl" => "/usr/bin/perl",
        ".cgi" => "/usr/bin/perl",
        ".rb" => "/usr/bin/ruby",
        ".erb" => "/usr/bin/eruby",
        ".php" => "/usr/bin/php-cgi",
        ".py" => "/usr/bin/python" )

Oraz upewniamy się że w pliku /etc/lighttpd/lighttpd.conf opcja index-file.names zawiera index.php - tak jest domyślnie. Restartujemy demona:


    # /etc/init.d/lighttpd restart

Konfiguracja PHP

Następnie należy zmodyfikować plik konfiguracyjny /etc/php.ini. Do modyfikacji jest linia:


    doc_root = "/www1"

oraz ew. ustawiamy date.time, którą zmieniamy lub dodajemy z


    ;date.timezone =

na


    date.timezone = Europe/Warsaw

PHP będzie uruchamiane z poziomu Apache lub Lighttpd jako cgi, więc nie ma potrzeby specjalnego uruchamiania tego interpretera. Sprawdzenie czy PHP działa poprawnie dokonujemy wykonując polecenie:


    # php-cgi -v

Należy pamiętać że do instalacji for czy portali niezbędne jest dużo rozszerzeń php; w tym celu należy zainstalować określone (lub wszystkie) pliki php7-mod-*.

Sprawdzenie działania



    echo "<?php phpinfo(); ?>" > /www1/index.php

I wchodzimy przeglądarką na adres routera, np http://192.168.1.1/index.php. Powinna wyświetlić się strona informacyjna o zainstalowanym PHP.

MySQL

Instalacja



    # opkg install mariadb-server

Konfiguracja

Plik konfiguracyjny to /etc/mysql/my.cnf. Do modyfikacji niezbędne jest ustawienie katalogu z bazą danych (linia z datadir). Nie powinna wskazywać wewnętrznej pamięci flash, powinien to być zewnętrzny nośnik:


    datadir = /mnt/data/mysql/

To samo dotyczy linii tmpdir:


    tmpdir = /mnt/data/tmp

Przed uruchomieniem należy utworzyć te katalogi:


    # mkdir -p /mnt/data/mysql
    # mkdir -p /mnt/data/tmp
    # chmod 777 /mnt/data/tmp

Dobrze jest także zmienić domyślne wartości buforów na mniejsze:


    key_buffer = 2M
    key_buffer_size = 2M
    max_allowed_packet = 2M

w odpowiednich sekcjach, oraz dodajemy na końcu pliku


    [mysqld]
    innodb_buffer_pool_size = 16M

Niezbędne jest zainicjowanie serwera poleceniem:


    # mysql_install_db --force --basedir=/usr

Jeżeli podczas inicjacji bazy nastąpi błąd pamięci lub zabicie procesu to należy zwolnić pamięć przez chwilowe wyłączenie zbędnych demonów.

Uruchomienie



    # /etc/init.d/mysqld enable
    # /etc/init.d/mysqld start

Ustawiamy hasło roota w bazie


    # opkg install mariadb-client mariadb-client-extra
    # mysqladmin -u root password admin123

Testy

Uruchomienie bazy danych może trwać kilka minut, więc należy poczekać chwilę po uruchomieniu.


    # mysql -uroot -padmin123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.35-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select version();
+-----------------+
| version() |
+-----------------+
| 10.1.35-MariaDB |
+-----------------+
1 row in set (0.42 sec)
mysql> exit
Bye

Uruchomienie LAMP

Wszystkie serwery są na miejscu, można więc pokusić się o sprawdzenie połączenia tych elementów.

Baza danych

Tworzymy nową bazę danych o nazwie openwrt, tworzymy użytkownika phptest z haslem phphaslo i nadajemy mu określone prawa dostępu.


    # mysql -uroot -padmin123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.35-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database openwrt;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create user 'phptest'@'localhost' IDENTIFIED BY 'phphaslo';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'phptest'@'localhost';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]>> exit
Bye

Następnie logujemy się jako użytkownik phptest, tworzymy prostą tabelę lamptest i wpisujemy do niej dane:


    # mysql -uphptest -pphphaslo openwrt;
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.1.35-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [openwrt]> create table lamptest (kolumna1 int, kolumna2 varchar(255));
Query OK, 0 rows affected (0.03 sec)

MariaDB [openwrt]> insert into lamptest (kolumna1, kolumna2) values (1, "to");
Query OK, 1 row affected (0.02 sec)

MariaDB [openwrt]> insert into lamptest (kolumna1, kolumna2) values (2, "zyje");
Query OK, 1 row affected (0.00 sec)

MariaDB [openwrt]> insert into lamptest (kolumna1, kolumna2) values (3, "!");
Query OK, 1 row affected (0.01 sec)

MariaDB [openwrt]> select * from lamptest;
+----------+----------+
| kolumna1 | kolumna2 |
+----------+----------+
| 1 | to |
| 2 | zyje |
| 3 | ! |
+----------+----------+
3 rows in set (0.00 sec)

MariaDB [openwrt]> exit
Bye

Strony PHP

Zmieniamy plik /www1/index.php i wpisujemy w nim następującą zawartość:


<?php
$servername = "127.0.0.1";
$username = "phptest";
$password = "phphaslo";
$dbname = "openwrt";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT kolumna1, kolumna2 FROM lamptest";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "kolumna1: " . $row["kolumna1"] . ", kolumna2: " . $row["kolumna2"]. "<br>";
    }
} else {
    echo "0 results";
}
$conn->close();
?>

Wchodzimy przeglądarką na adres routera, np http://192.168.1.1/index.php. Jeżeli wyświetli się strona o zawartości


    kolumna1: 1, kolumna2: to
    kolumna1: 2, kolumna2: zyje
    kolumna1: 3, kolumna2: !

To mamy działający cały zestaw LAMP, gratulacje!

Zakończenie

Serwer Apache można zastąpić lighttpd, zamiast cgi w php można użyć zainstalować fastcgi. Takie połączenie powinno działać sprawniej od samego apache z cgi.
Należy pamiętać o doinstalowanie dodatkowych modułów od php, które różne aplikacje webowe mogą potrzebować.
W razie problemów z działaniem stron można doinstalować pakiet php7-cli i uruchamiać strony z poziomu konsoli. Można także w pliku php.ini włączyć wyświetlanie błędów.

Bonus

Instalacja phpMyAdmin


    # opkg install php7-mod-iconv php7-mod-json php7-mod-session php7-mod-zip php7-mod-mbstring zoneinfo-europe
    # opkg install wget
    # cd /www1
    # wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.tar.gz
    # tar zxvf phpMyAdmin-4.8.3-all-languages.tar.gz
    # rm phpMyAdmin-4.8.3-all-languages.tar.gz
    # mv phpMyAdmin-4.8.3-all-languages phpmyadmin
    # cd phpmyadmin
    # mv locale/pl locale/pl_PL

Tworzymy plik /www1/phpmyadmin/config.inc.php z następującą zawartością:


<?php
$i = 0;
$i++;
$cfg['Servers'][$i]['verbose'] = 'localhost';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'phptest';
$cfg['Servers'][$i]['password'] = 'phphaslo';
$cfg['DefaultLang'] = 'pl';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
?>

W pliku /etc/php.ini zmieniamy limit pamięci na większy:


    memory_limit = 16M

W przeglądarce wpisujemy http://192.168.1.1/phpmyadmin . Szybkość działania zależy od szybkości routera i ilości pamięci RAM.