PC-BSD jails: serverové aplikace a služby (pokračování)

12. 8. 2013
Doba čtení: 8 minut

Sdílet

V minulém díle našeho seriálu o věznění v PC-BSD jsme se zaměřili na společné postupy při vytvoření a zpřístupnění jailů. Konkrétně pak byly popsány instalace a zprovoznění databázových serverů MariaDB a Percona. V dnešním díle dokončíme databáze popisem PostgreSQL a pustíme se do PHP webových aplikací.

B. PostgreSQL

PostgreSQL je dalším často využívaným a vhodným databázovým serverem. Je k dispozici prakticky pro všechny významné Unix a Linux distribuce.

B2) instalace programů a aplikací

Instalace se bude provádět pomocí PKGNG. K dispozici jsou tyto možnosti (nejsou uvedeny balíčky odpovídajících klientů):

  • postgresql-server-8.3.23_1
  • postgresql-server-8.4.17_1
  • postgresql-server-9.0.13
  • postgresql-server-9.1.9
  • postgresql-server-9.2.4
  • postgresql-server-9.3.b2

Instalovat se bude zvýrazněná verze včetně příslušného klienta. Je sice označená jako beta, ale verze 9.3 má plno zajímavých vlastností a novinek, takže se určitě vyplatí jí vyzkoušet.

B3) zprovoznění a zpřístupnění služby

  • upraví se soubor /etc/rc.conf a vloží do něj další řádek:
    postgresql_enable=“YES“
  • spustí se inicializace databázového clusteru příkazem service # postgresql initdb nebo  # /usr/local/etc/rc.d/postgresql initdb
  • při snaze o inicializaci clusteru docházelo neustále k problémům a chybovým hlášením, které jí neumožnily dokončit
  • hledáním chybového hlášení bylo zjištěno, že se jedná o problém se systémovou službou System V- style IPC
  • našel jsem několik návodů a spojil je do jednoho. Možná, že by to šlo i jednodušeji, ale po uvedených úpravách vše proběhlo bez zádrhelů a server funguje
  • v hostitelském stroji se upraví soubor /etc/rc.conf a přidá se řádek:
    jail_sysvipc_allow=“YES“
  • v hostitelském stroji se upraví soubor /etc/sysctl.conf a přidá se řádek:
    security.jail.sysvipc_allowed=1
  • restartuje se hostitelský stroj
  • otevře se Warden GUI a u tohoto jailu se nastaví příznak Permissions allow.sysvipc
  • znovu se provede inicializace databázového clusteru
  • nastartuje se server příkazem: # service postgresql start
  • při inicializaci clusteru je mimo jiné vytvořen uživatel pgsql. Je pro něj nutné vytvořit heslo příkazem:  # passwd pgsql
  • lokálně se přihlásíme k serveru příkazem: # psql -d template1 -U pqsql
  • vytvoříme nového uživatele: # CREATE USER testuser WITH PASSWORD 'heslo';
  • vytvoříme novou databázi: # CREATE DATABASE testdb;
  • vytvořenému uživatele přidělíme práva k databázi pomocí příkazů: # GRANT ALL PRIVILEGES ON testdb TO testuser; nebo  # GRANT ALL ON DATABASE testdb TO testuser;
  • odhlásíme se od databázového serveru
  • vyzkoušíme lokální připojení k serveru příkazem: # psql -U testuser -d testdb -W
  • upravíme soubor /usr/local/pgsql/data/postgresql.conf a řádek
    listen_addresses='xy'
    , kde xy může být třeba rozsah IP adres ve stylu ‚x.y.z.w/24‘. Nejčastěji se ale zadává ‚*‘ pro neomezený rozsah a omezení se pak nastaví jinak a jinde
  • omezení přístupu se provede změnou souboru pg_hba.conf ve stejném adresáři. Zde je možné zadávat velmi složitá přístupová pravidla podle vzoru:
    host   database   user         ad­dress         auth-method , konkrétně třeba takto:
    host   testdb   testuser   x­.y.z.w/24   password
  • restartuje se server příkazem: # service postgresql restart
  • nastaví se FW dle pokynů Krok 4, jediný přístupný port je 5432
  • vyzkouší se vzdálené připojení příkazem: # psql -h IPv4-jailu -U testuser -d testdb
  • vyzkouší se vzdálené připojení z nějakého administračního nástroje, např. pgAdmin3
  • pokud není vzdálené připojení možné, je třeba znovu projít nastavení serveru a FW a případné nedostatky doladit

Je nutné počítat s tím, že na vzdálených strojích mohou a zřejmě také budou k dispozici PostgreSQl klienti nižších či jiných verzí, než je samotný server. Při snaze o přihlášení toto systém hlásí. Je také možné, že by mohlo dojít k tomu, že některé vlastnosti nebudou funkční nebo přístupné. Server je spuštěný při startu jailu a je ihned k dispozici včetně uložených dat.

Velikost jailu a exportovaného souboru jsou následující:

# zfs list
NAME                                                 USED  AVAIL  REFER  MOUNTPOINT
tank1/usr/jails/postgre                        229M   779G   628M     /usr/jails/postgre

Velikost exportovaného WDN souboru je 121 MB

C. Administrace databází

V tomto jailu budou instalované dvě nejznámější aplikace pro administraci databází – phpMyAdmin a Adminer. Oba mají své výhody i nevýhody a vzhledem k jejich velikosti není problém je umístit do jednoho jailu. Obě aplikace jsou v PHP, takže základní sestava je jasná: Apache + PHP5. K tomu jsem se rozhodl (ani ne tak z praktických, jako spíše z poznávacích a experimentálních důvodů) přidat reverzní proxy Nginx.

C2) instalace programů a aplikací

Instalace se bude provádět pomocí PKGNG. K dispozici jsou různé verze všech potřebných aplikací a je tedy dobré vyzkoušet funkční kombinaci. Aktuálně jsou k dispozici:

apache22–2.2.24 nginx-1.4.1_1,1 php5–5.4.16
apache24–2.4.4_1 nginx-devel-1.5.1 php55–5.5.0

Já jsem instaloval zvýrazněnou kombinaci, ale je samozřejmě možné se pokusit i o kombinace jiné. Kromě samotného PHP je nutné instalovat ještě jeho rozšíření. Konkrétně se jednalo o následující:

  • php5-extensions-1.7
  • php5-pdo_pgsql
  • php5-pdo_odbc
  • php5-pdo_mysql
  • php5-pgsql
  • php5-mysql
  • php5-mysqli
  • php5-gettext
  • php5-mbstring
  • php5-mcrypt

C3) zprovoznění a zpřístupnění služby

  • upraví se soubor /usr/local/etc/apache22/httpd.conf:
    do oddílu DirectoryIndex se přidá položka
    index.php



    doplní se typ souborů pro PHP:

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
  • upraví se soubor /etc/rc.conf a přidá se nový řádek:
    apache22_enable=“YES“
  • spustí se Apache příkazem: # service apache22 start
  • vyzkouší se funkčnost apache z prohlížeče: <a>http://x.y.z.IPv4-jailu
  • pro zkoušku funkčnosti PHP se vytvoří nový soubor:  # touch /usr/local/www/apache22/data/phpinfo.php
  • do vytvořeného souboru se vloží testovací funkce:
        <?php
         phpinfo();
         ?>
  • znovu se vyzkouší funkčnost Apache + PHP: <a>http://x.y.z.IPv4-jailu/phpinfo.php
  • zastaví se Apache: # service apache22 stop
  • upraví se soubor /etc/rc.conf a přidá se nový řádek:
    nginx_enable=“YES“
  • spustí se Nginx příkazem: # service nginx start
  • vyzkouší se funkčnost Nginx: <a>http://x.y.z.IPv4-jailu:8080
  • zkopíruje se testovací PHP soubor: # cp /usr/local/www/apache22/data/phpinfo.php /usr/local/www/nginx-dist
  • vyzkouší se funkčnost kombinace Nginx + PHP: <a>http://x.y.z.IPv4-jailu:8080/phpinfo.php
  • server Nginx není na provoz s PHP nastavený, takže se nabídne pouze obvyklé stažení testovacího souboru
  • pro správnou funkci kombinace Apache + Nginx jako reverzní proxy je nutné nastavit Apache tak, aby přijímal požadavky pouze od proxy a ne od jiných klientů
  • za tímto účelem je nutné v systému mít instalovaný Apache modul mod_rpaf
  • pro instalaci modulu je nutné do jailu přidat strom portů příkazem:  # portsnap fetch extract update
  • modul je v adresáři /usr/ports/www.mod_rpaf2
  • modul se instaluje příkazem: # configure && install clean
  • upraví se soubor /usr/local/etc/apache22/httpd.conf , kde je nutné udělat 4 změny:
    odkomentovat řádek:
    LoadModule rpaf_module       libexec/apache22/mod_rpaf2.so



    přidat řádky:

    RPAFenable On
    RPAFproxy_ips 127.0.0.1



    upravit řádek:

    Listen 127.0.0.1:8080



    přidat řádek:

    NameVirtualHost 127.0.0.1:8080
  • spustí se Apache
  • je možné vyzkoušet <a>http://x.y.z.IPv4-jailu nebo <a>http://x.y.z.IPv4-jailu:8080
    Apache na portu 80 nebude reagovat, na portu 8080 se objeví výstup z Nginx
  • upraví se soubor /usr/local/etc/nginx/nginx.conf pro kombinaci Nginx+Apache – viz příloha nginx-conf.txt
  • vytvoří se nový soubor: # touch /usr/local/etc/nginx/proxy.conf, obsah v příloze proxy-conf.txt
  • vytvoří se nový adresář: # mkdir /usr/local/etc/nginx/vhosts
  • vytvoří se nový soubor: # touch /usr/local/etc/nginx/vhosts/default.conf, obsah v příloze vhosts.txt
  • vytvoří se nový adresář: # mkdir /var/nginx/cache
  • vytvoří se nový adresář: # mkdir /var/log/nginx
  • spustí se Nginx – při startu se ověří funkčnost konfigurace a zobrazí případné chyby v ní
  • nastaví se FW dle pokynů Krok 4, jediný přístupný port je 80
  • vyzkouší se vzdálené připojení: <a>http://x.y.z.IPv4-jailu
  • vyzkouší se vzdálené připojení: <a>http://x.y.z.IPv4-jailu/phpinfo.php
  • z webu projektu se stáhne příslušná verze Admineru (já jsem konkrétně volil českou verzi pro všechny typy databází)
  • PHP soubor se uloží a přejmenuje: /usr/local/www/apache22/da­ta/adminer.php
  • vyzkouší se vzdálené připojení: <a>http://x.y.z.IPv4-jailu/adminer.php
  • z webu projektu se stáhne příslušná verze phpMyAdmin (nejnovější vícejazyčná verze)
  • stažený adresář se přejmenuje a uloží: /usr/local/www/apache22/da­ta/phpMyAdmin
  • vyzkouší se vzdálené připojení: <a>http://x.y.z.IPv4-jailu/phpMyAdmin
  • spustí se jail se serverem MariaDB nebo Percona
  • v Admineru je možné zadat přímo IP adresu serveru (IPv4-jailu), uživatele testuser a databázi testdb
  • v phpMyAdmin je možné zadat pouze jméno a heslo uživatele – systém je ve výchozím stavu nastaven pro připojení databáze na localhost
  • v adresáři phpMyAdmin je soubor config.sample.inc.php
  • tento soubor se přejmenuje na config.inc.php a nastaví se proměnná host na
    x.y.z.IPv4-jailu
  • phpMyAdmin se pak připojí na zadanou IP adresu serveru
  • zastaví se jail MySQL a spustí se jail PostgreSQL
  • v Admineru je nutné zadat všechny údaje – IP adresu serveru, jméno uživatele, heslo i název databáze, pak je připojení k PostgreSQL bez problémů
  • pokud není vzdálené připojení možné, je třeba znovu projít nastavení serverů a FW a případné nedostatky doladit
  • z jailu se vymaže obsah adresáře /usr/ports, aby strom portů zbytečně nezabíral místo a nezvětšoval velikost jailu samotného i jeho exportovaného souboru wdn

Oba nástroje automaticky hlídají nové verze, takže pokud se nějaká objeví, je možné jí stáhnout a stejným způsobem nakopírovat na patřičné místo, přejmenovat a případně znovu upravit potřebná nastavení.

Velikost jailu a exportovaného souboru jsou následující:

# zfs list
NAME                                                 USED  AVAIL  REFER  MOUNTPOINT
tank1/usr/jails/dbadmin                      595M   779G   994M      /usr/jails/dbadmin

Velikost exportovaného WDN souboru je 237 MB

bitcoin_skoleni

Když už byla instalovaná proxy, bylo by asi vhodné vyzkoušet jejích dopad na výkon celého serveru. Toto srovnání ponecháme až do dalších dílů, aby bylo možné srovnat všechny tři varianty – samotný Apache, Apache+NGINX a Apache+Varnish.

V dalším díle budeme pokračovat popisem instalace a zprovoznění prostředí pro provoz PHP aplikací s na pojením na lokální databázi včetně proxy a vývojového prostředí PHP.