Linux web server s pripadajućim programima i postavkama (Apache, MySQL, PHP)
Tutoriali
Autor albinary // Srijeda, 22 Lipanj 2011 13:08
tutorialU ovom primjeru instalacije servera koristit ću Debian Linux distribuciju. U tutorialu su upute kojima ćemo na server instalirati Apache web server, MySQL server te podršku za PHP s osnovnom defaultnom konfiguracijom, tako da svi ti servisi budu dostupni. Detaljnu konfiguraciju svakog segmenta posebno nećemo obrađivati u ovom tutorialu već u nekom sljedećem. Također, na početku je pokrivena osnovna konfiguracija servera tako da isključujemo nepotrebne servise koji automatski dolaze s instalacijom operativnog sustava. Radionica na ovu temu je odrađena 02.06.2011. godine u prostorijama Hacklaba u AKC Medika.


Instalacija i osnovna priprema servera:

Kada instalirate server, instalirajte samo base sustav, bez ikakvih preporučenih komponenti u instalaciji, same serverske instance programa ćemo sami instalirati (kako bismo izbjegli instalaciju nepotrebnih alata i servisa).
Nakon instalacije servera provjerite koji su sve portovi otvoreni na sustavu. To se najbolje vidi naredbom netstat. Samu sintaksu naredbe i moguće opcije možete provjeriti pokrećući naredbu "man netstat" ili "netstat --help". Dakle za pregled portova na serveru upišite:

# netstat -tupan

(ovo se isto može napisati "netstat -t -u -p -a -n", dakle sva ova "tupan" slova su pojedinačne opcije što možete pročitati u "man netstat" ili "netstat --help")

Ispis će biti sličan ovome:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      8902/portmap
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1747/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      3097/exim4
tcp        0      0 0.0.0.0:46884           0.0.0.0:*               LISTEN      8913/rpc.statd
tcp6       0      0 :::22                   :::*                    LISTEN      1747/sshd
udp        0      0 0.0.0.0:609             0.0.0.0:*                           8913/rpc.statd
udp        0      0 0.0.0.0:111             0.0.0.0:*                           8902/portmap
udp        0      0 0.0.0.0:54161           0.0.0.0:*                           8913/rpc.statd

Vidimo da su otvoreni portovi:
111 - portmap
22 - sshd (servis potreban ukoliko se namjeravate spajati ssh protkolom na server)
25 - exim4 (MTA - Mail Transfer Agent po defaultu instaliran na Debian)
46884 - rpc.statd

Ako nam je namjena servera web server, onda nam ne trebaju servisi poput portmap i rpc.statd
Njih isključujemo sljedećim naredbama:
 

# /etc/init.d/portmap stop
# /etc/init.d/nfs-common stop

Prilikom reboota ove će se skripte automatski startati, tako da ih trebamo disable-ati i pri bootanju. Lokacija skripti za startanje pri bootu nalazi se u /etc/rc?.d/ direktoriju. Postoji više tih direktorija s obzirom na runlevel koji pokrećemo. Te skripte tj. linkove na njih u /etc/rc?.d se mogu maknuti, preimenovati ili iskonfigurirati naredbom update-rc.d

Nakon što smo pogasili sve nepotrebne servise, output naredbe:
 

# netstat -tupan

..bi trebalo izgledati otprilike ovako:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1747/sshd                    
tcp6       0      0 :::22                   :::*                    LISTEN      1747/sshd 

Dakle, samo je ostao sshd servis za spajanje ssh protokolom na server i time smo osigurali da nam server nema otvorene nepotrebne portove te time smanjili mogućnost eksploatacije servera i iskorištavanja mogućih sigurnosnih rupa u aplikacijama na sustavu.
Ukoliko vam portmap i NFS ne trebaju možete ih deinstalirati sa sustava.
Nekad se na sustavu nađe i Avahi servis koji također možete slobodno zaustaviti i deinstalirati sa sustava.



Instalacija Apache servera:

Apache je najrašireniji web server, pouzdan, modularan, izvrsno dokumentiran i konfigurabilan prema širokom spektru zahtjeva.

Apache web server ćemo instalirati putem apt-get ili aptitude naredbe, Debianovog package managera:
 

# aptitude install apache2

(ukoliko vas pita da instalira neke dodatne pakete odgovorite s 'yes')

Sve konfiguracijske file-ove instalacija je postavila u /etc/apache2/ direktorij na serveru.
Defaultni direktorij za web sadržaj je postavljen na /var/www/
Sve postavke su konfigurabilne i prilagodljive.
Logovi su u direktoriju /var/log/apache2/

Postoje dva osnovna loga access.log (u koji se zapisuju svi zahtjevi prema web serveru) i error.log (u koji se upisuju sve greške uključujući i start/stop/restart Apache web servera).

provjerite pokazuje li netstat liniju s apache procesom:
tcp6       0      0 :::80                   :::*                    LISTEN      9479/apache2   

Ako da, server je startan i sad možete provjeriti radi li testna stranica Apache web servera sa sadržajem "It works!".
Troubleshooting:
Ako nema porta na kojem sluša Apache web server, nešto nije dobro te provjerite vrti li se ikoji Apache proces s naredbom:


# ps -fe | grep apache

rezultat mora biti s barem dvije ovakve linije ukoliko je server startan:
root      9479     1  0 15:33 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  9482  9479  0 15:33 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  9483  9479  0 15:33 ?        00:00:00 /usr/sbin/apache2 -k start
...ako nema takvih linija znači da server nije startan. Server se starta naredbom:
 

# /etc/init.d/apache2 start

(Najkorišteniji sufiksi za naredbu su start, stop, restart, reload, force-reload, za potpuni popis upišite samo "/etc/init.d/apache2")

Nakon toga bi se Apache web server trebao startati, što opet možete provjeriti "ps -fe" i "netstat" naredbama.
Ako i dalje nešto nije u redu, provjerite log /var/log/apache2/error.log u kojem bi trebalo pisati zašto se web server ne starta. Mogućnosti zašto se ne bi startao mogu biti svakakve, tako da ih neću tu nabrajati, već je najbolje, ako ne razumijete grešku, obratiti se nekoj web tražilici poput Google-a i Yahoo-a s errorom iz loga. Sigurno je već netko imao takav problem pa ćete najvjerojatnije naći rješenje.

Ukoliko ste Apache instalirali na lokalnom računalu stranica će biti dostupna na adresi:
http://localhost

Ukoliko ste Apache instalirali na remote računalu, da biste provjerili testnu stranicu u adress bar browsera upišite IP adresu tog udaljenog servera. Npr. ako ste instalirali Apache na udaljenom (remote) računalu tako što ste se prvo spojili ssh protokolom na udaljeno računalo i instalirali Apache, morali ste upisati naredbu:
 

# ssh udaljeni.host.tld

ili
 

# ssh x.x.x.x

gdje je x.x.x.x IP adresa udaljenog računala.
Ako s lokalnog računala želite pristupiti testnoj stranici na Apache web serveru instaliranom na udaljenom računalu u address bar browsera upisujete:
http://udaljeni.host.tld
ili
http://x.x.x.x
(gdje je x.x.x.x opet ona IP adresa iskorištena pri spajanju na ssh)

Ovo sve pretpostavlja da je Apache postavljen na istoj IP adresi kao i SSH protokol.
Na serveru vi imate mogućnost postavljanja više IP adresa za isti server ili za isti fizički mrežni interface u serveru. Ukoliko je Apache postavljen da radi na drugoj IP adresi, onda u browser morate upisati tu drugu IP adresu. Ta postavka se može provjeriti u datoteci /etc/apache2/ports.conf. Tražite Liniju u kojoj pise:
Listen 80
ili
Listen 0.0.0.0:80

Ukoliko piše npr.
Listen 192.168.5.5:80
...znači da Apache web server sluša samo na adresi 192.168.5.5 i u address bar web browsera se upisuje ta adresa ukoliko se želi pristupiti web stranici koju poslužuje Apache web server.
Ovo je sve osnovna konfiguracija i postoji još nekoliko načina da Apache web server bude dostupan na više adresa ili portova, no o tome u nekom budućem tutorialu i/ili radionici.

Kada smo utvrdili da se stranica prikazuje, web server ispravno radi.
Ta stranica ("It works!") smještena je u file-u /var/www/index.html.
Ukoliko će se servirati samo jedan web site, njegov sadržaj možete postaviti u /var/www direktorij i to će raditi odmah bez dodatne konfiguracije.
Apache zna da mora servirati taj file kao stranicu putem definicije iz /etc/apache2/sites-enabled/000-default u sekciji:

 

<Directory /var/www/>
#Options Indexes FollowSymLinks MultiViews
Options FollowSymLinks MultiViews
AllowOverride Indexes
Order allow,deny
allow from all
</Directory>

 

...tako Apache zna da treba servirati sadržaj iz direktorija /var/www; daljnje opcije možete pretražiti na Apache-ovim support stranicama: http://httpd.apache.org/docs/

Sve opcije su kofigurabilne i svi file-ovi će se koristiti onako kako vi to uredite.
Postavljanje više web stranica i detaljna konfiguracija Apache web servera bit će obrađena u nekom drugom tutorijalu.



MySQL server

MySQL je jednostavni oblik baze koju korisnici web stranica većinom koriste zbog jednostavnosti same strukture baze i jednostavnih potreba većine korisnika.
Obavezno postavljati uvijek drugačiji password za root korisnika MySQL baze od root korisnika na samom serveru. Također drugim korisnicima MySQL baze davati drugačiji password od FTP/SSH passworda.
MySQL bazu je poželjno "vrtiti" na localhostu, a ne na vanjskoj IP adresi servera.
Može se instalirati iz paketa jer se ne update-a toliko često.

# aptitude install mysql-server mysql-client

(ukoliko vas pita da instalira neke dodatne pakete odgovorite sa yes)
Tokom instalacije pitat će vas za password root korisnika MySQL baze (ne sistemskog root korisnika). Zapamtite root password i ne dajte root password ni jednom korisniku (oni će imati svatko svoj username i password). Vi kao administrator jedini smijete imati root password (ukoliko nemate još neku osobu kojoj ste dali administratorske ovlasti na serveru).

MySQL server je dostupan samo na localhostu po defaultu, nije preporučeno da se korisnici s cijelog interneta spajaju na MySQL zbog mogućnosti provale na server brute force attackom ali sporim tj. s delayem između spajanja. Naime, netko može slati zahtjeve za spajanjem na bazu pogađajući password i na kraju će uspjeti pošto MySQL server dopušta puno spajanja jer tako rade i sami zahtjevi na bazu.
Tako da je preporučljivo imati MySQL bazu na istom serveru kao i Apache web server na kojem servirate stranice koje dohvaćaju podatke iz baze. Ukoliko to nije moguće, MySQL server se može instalirati na drugom serveru, na kojem ćemo zbog zaštite dopustiti spajanje samo s web servera na kojem su stranice koje trebaju podatke s te baze.

Provjeru da li je MySQL server instaliran i startan također provjeravamo "netstat" i "ps -fe" naredbom:


# netstat -tupan | less

..treba dati ovakvu liniju između ostalih, ukoliko je MySQL server startan:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      10697/mysqld

...znači da se vrti na 127.0.0.1 adrese, što je samo lokalna IP adresa i ne može joj se pristupiti iz vana tj. s interneta i tako treba biti, kao što smo već spomenuli.
Ukoliko nema tog redka, startajte MySQL server naredbom:

# /etc/init.d/mysql start

Za manje instalacije ne trebate mijenjati postavke MySQL servera koje se nalaze u konfiguracijskim file-ovima u direktoriju:
/etc/mysql. Glavni konfiguracijski file je: /etc/mysql/my.cnf
Fileove baza MySQL sprema u /var/lib/mysql direktorij
Logovi MySQL servera su /var/log/mysql.log i /var/log/mysql.err

Sad ćemo testno kreirati jednog korisnika i jednu bazu kojoj ćemo dodijeliti (grant-ati) prava tom korisniku nad bazom. Ulogiramo se kao root korisnik na bazu (prije toga moramo biti u terminalu na serveru da bismo mogli pristupiti MySQL bazi, znači biti spojeni SSH protokolom)

# mysql -u root -p

..nakon čega nas pita za password koji smo postavili tokom instalacije mysql-server paketa

mysql> use mysql;
mysql> create user korisnik;
mysql> create database baza1;
mysql> update mysql.user set password=PASSWORD('zlipassword') where user='korisnik';
mysql> grant all privileges on baza1.* to 'korisnik'@'localhost' identified by 'zlipassword';
mysql> flush privileges;
mysql> quit;

Kako bismo istestirali jesmo li dobro postavili korisnika i bazu ponovno ćemo se ulogirati u MySQL ali s korisnikom kojeg smo kreirali:

# mysql -u korisnik -p

(upišemo 

password koji smo postavili, u ovom slucaju je to "zlipassword")


mysql> use baza1;

Tako znamo da možemo ući u bazu koju smo dali korisniku i to je to, sve radi :)

Zbog toga što neki korisnici žele do svojih baza s nekog udaljenog računala može se napraviti SSH tunel preko kojeg se onda može do baze. Za to je potrebno jedino imati sshd servis startan na serveru i korisniku se mora dati ssh username i lozinka (sistemski account). Korisnik također mora imati instaliran mysql-client (pretpostavka je da korisnik ima Linux operativni sustav za ovakve naredbe i sintaksu).

Korisnik na svojem računalu mora startati ssh konekciju prema našem serveru sa sljedećom sintaksom:

# ssh -L 12345:localhost:3306 Ova e-mail adresa je zaštićena od spam robota, nije vidljiva ako ste isključili JavaScript

(gdje je 12345:localhost lokalno računalo i lokalni port na koji ćemo tunelirati port 3306 s udaljenog računala/servera na koji se spajamo).
Nakon što je ssh konekcija uspostavljena spajamo se na mysql preko lokalnog računala i lokalnog porta 12345 na koji je tuneliran port 3306 (defaultni port MySQL baze) s udaljenog servera.

# mysql -h 127.0.0.1 -P 12345 -u root -p


PHP

PHP je skriptni jezik za pisanje dinamičkih (generirajućih, ne statički hardkodiranih) web stranica. Npr. .html stranica je statička jer je u njoj striktno napisano što treba biti na stranici. .php stranice generiraju sadržaj putem određenih naredbi iz postojećeg .html koda, sadržaja iz baze ili nekih drugih dokumenata i stranica. Danas je jedan od najpopularnijih jezika za pisanje web stranica jer pruža širok spektar mogućnosti manipuliranja podacima koje želimo servirati na web stranici.
PHP se razlikuje od verzije do verije i to mu je jedna od većih mana koje razvojni tim PHP skriptnog jezika još uvijek ne izbacuje i ne nalazi rješenje za takve probleme. Npr. stranica pisana sintaksom PHP verzije 4 neće uvijek raditi na serveru koji na sebi ima instaliran PHP verzije 5 jer sadrži neke drukčije naredbe, sintaksu i mogućnosti. Također, postoji razlika između verzije PHPa 5.2 i 5.3, stoga je poželjno provjeriti koja je verzija instalirana na serveru i prema njoj treba razvijati kod stranice.
PHP također možemo instalirati iz paketa tj. putem nekog package managera koji koristimo. Na Debian Linux OSu to biste napravili naredbom:

# aptitude install php5

Kako biste izbjegli mogućnost provale na server putem propusta u php kodu stranice, najbolje je instalirati najnoviju verziju PHPa na server, no za to ne postoje paketi u package manageru već je potrebno instalirati PHP kompajliranjem) iz izvornog koda (source code).

Potrebno je skinuti PHP izvorni kod koji nam je potreban da bismo ga kompajlirali i instalirali na server. U web browseru je potrebno otići na adresu: http://php.net/downloads.php, gdje odaberemo najnoviju stabilnu verziju za download i zapamtimo gdje je browser spremio podatke. Svejedno je hoćete li skinuti .tar.gz ili .tar.bz2 verziju jer su to samo načini komprimiranja podataka koje su razvojni timovi odlučili koristiti kod spremanja podataka za download. Niže će biti objašnjeno kako se raspakiravaju oba formata.

Kada su se podaci skinuli (npr. da su skinuti u /home/username/Downloads direktorij i da se skinuti file zove php-5.3.6.tar.bz2) pokrenemo sljedeću naredbu kako bi source kod PHP prebacili u direktorij namijenjen da sadrži source kodove programa koje koristimo na serveru:

# mv /home/username/Downloads/ /usr/src

zatim odemo u taj direktorij gdje ćemo otpakirati paket sa source kodom koji smo skinuli

# cd /usr/src
# tar -xjvf php-5.3.6.tar.bz2

(ukoliko smo skinuli .tar.gz verziju, paket ćemo raspakirati sljedećom naredbom:)

# tar -xzvf php-5.3.6.tar.gz

Nakon što smo to raspakirali uđemo u kreirani direktorij

# cd php-5.3.6

Ovdje počinje konfiguracija i kompajliranje samog izvornog koda. Za to su nam na sustavu potrebni određeni programi i paketi kako bi konfiguracija i kompajliranje prošli bez pogrešaka. Za to kao root korisnik trebamo instalirati sljedeće pakete:

# aptitude install make gcc binutils

(ovo su paketi potrebni za kompajliranje izvornog koda)

# aptitude install apache2-threaded-dev libbz2-dev libcurl4-gnutls-dev libxml2-dev

(ovo su paketi potrebni da bi se PHP mogao iskonfigurirati s nekim osnovim modulima s kojima će raditi tj. za koje će imati podršku; npr. libbz2-dev omogućuje php kodu da manipulira s .bz2 komprimiranim datotekama, dok libxml2-dev omogućuje manipulaciju i korištenje xml koda).

Nakon ovoga spremni smo za konfiguraciju php-a. Provjerimo jesmo li u direktoriju /usr/src/php-5.3.6 ili jednostavno uđemo u njega:

# cd /usr/src/php-5.3.6

PHP ćemo konfigurirati s nekim opcijama. Potpuni popis opcija možete dobiti pokrećući naredbu:

# ./configure --help

Ovdje smo odabrali neke opcije i možemo pokrenuti konfiguraciju:

# ./configure --with-bz2 --enable-ftp --with-zlib --enable-zip --with-curl --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-mysql

Ukoliko konfiguracija na kraju izbaci neke greške, te je greške potrebno riješiti prije nastavka jer se kod inače neće ispravno kompajlirati. Opet nam ovdje najbolji prijatelji mogu biti gugl i jahu u čije tražilice ćemo prepisati grešku koju nam konfiguracija javlja i provjeriti je li netko imao slič
an problem i eventualno rješenje na problem te ga primijenimo na našu konfiguraciju i instalaciju.

Nakon što se konfiguracija ispravno izvrši, možemo početi s kompajliranjem. To se izvodi jednostavnom naredbom:

# make

(ovo će malo potrajati i ispisivat će se razne naredbe po ekranu, što je normalno i treba pričekati završetak procesa)

Trebalo bi sve završiti bez grešaka. Ukoliko se greške ipak pojave, ponovite proceduru s gugl i jahu prijateljima.

Sljedećom naredbom instaliramo kompajlirani program na naš sustav tj. server:

# make install

(ova naredba će postaviti kompajlirane programske datoteke i direktorije u naš sustav tako da ih možemo korisiti i da sam server zna da one postoje u njegovom sustavu i kompletu programa kojim se koristi i koje pruža korisniku da ih koristi)

Radi li php možemo provjeriti jednostavnom naredbom koja služi za pregled verzije PHPa koja nam je instalirana na server:

# php -v

Ispis bi trebao izgledati otprilike ovako:
PHP 5.3.6 (cli) (built: May 24 2011 01:48:03)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

Kad smo to napravili, vrijeme je da konfiguriramo Apache web server kako bi mogao posluživati php kod na web stranicama.
Editiramo datoteku httpd.conf (/etc/apache2/httpd.conf) pomoću najdražeg editora (ja preferiram vim):

# vim /etc/apache2/httpd.conf

i upišemo u njega:


LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>


Nakon ovakvih izmjena potrebno je reloadati Apache web server:

# /etc/init.d/apache2 reload

Server se može i restartati umjesto reloadati:

# /etc/init.d/apache2 restart

Zatim ćemo napraviti vrlo jednostavnu stranicu s PHP kodom tj. file koji će Apache web server posluživati kao stranicu. U tom php kodu koristit ćemo ugrađenu funkciju u PHP koja ispisuje PHP postavke na serveru:

# cd /var/www

(uđemo u direktorij za koji znamo da Apache poslužuje kao web sadržaj)

# vim index.php

(editiramo novi file koji ćemo nazvati index.php)

i u njega upišemo:


<?php phpinfo(); ?>


Spremimo file i izađemo iz editora. Sad možemo u web browseru pozvati taj file i provjeriti funkcionira li sve. U address bar web browsera upišemo:
http://localhost/index.php
Pojavljuje se stranica na kojoj su ispisane PHP postavke s kojima smo konfigurirali, kompajlirali i instalirali PHP.

:)

Ukoliko imate primjedbe, pohvale, želite upozoriti na neispravnost nekog dijela ovog tutorijala, slobodno možete pisati na Forum u temu posvećenoj ovom tutorijalu.
 
Zadnja izmjena: 16-10-2014 12:05.