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)
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
Należy też zmienić sekcję
<Directory "/usr/share/htdocs">
na
Z powodu błędu w pakiecie należy także zmienić opcję
LogLevel na
error.
na
Uruchomienie
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
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:
oraz ew. ustawiamy date.time, którą zmieniamy lub dodajemy z
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:
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:
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:
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.