Instalacja i konfiguracja Apache/MySQL/PHP w OpenWrt
Ostatnia zmiana: 2017-04-15 07:54

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. 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 LEDE 17.01.

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

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 z


    ;date.timezone =

na


    date.timezone = Europe/Warsaw

PHP będzie uruchamiane z poziomu Apache lub Lighttpd jako cgi, więc nie 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 mysql-server

Konfiguracja

Plik konfiguracyjny to /etc/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

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


    key_buffer = 2M
    max_allowed_packet = 2M

Niezbędne jest zainicjowanie serwera poleceniem

 
    # mysql_install_db --force

Uruchomienie



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

Ustawiamy hasło roota w bazie


    # mysqladmin -u root password admin123

Testy



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

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73    |
+-----------+
1 row in set (0.00 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  mysql -uroot -padmin123
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> create database openwrt;
Query OK, 1 row affected (0.00 sec)

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

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

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> 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 MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

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

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

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

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

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

mysql> 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.