Problem sa kojim se većina korisnika Ubuntua srela kada su pokušali da instaliraju neku PHP skriptu (Wordpress, Joomla, Drupal, Mediawiki...) na svom računaru je da sve direktorijume ili datoteke koje napravi skripa ne možete da menjate jer ne pripadaju vama.Kod podrazumevane instalacije LAMP-a (Linux, Apache, MySQL, PHP) kada u skripti uradite upload npr. slike, kao datoteka ona se usnimi (tačnije skripta je usnimi) sa vlasništvom korisnika www-data, i time automatski vam ne dozvoljava da je obrišete ili promenite već to možete samo iz skripte a skripte ponekad i nemaju tu funkciju. Isto tako čest slučaj je i kada skripta zahteva cache direktorijum koji će biti upisiv. Najlakše je zaobići sa promenom dozvola na 777, ali posle kada sajt prebace na javni server ljudi obično zaborave da vrate na 755, i još mnogo sličnih primera.
Jedan od načina koji korisnici koriste da zaobiđu ovaj problem je promena vlasništva na korisnika www-data (naredbom shown-R www-data:www-data *) i non-stop vraćanje na svoj nalog da bi napravili izmene, ili već pomenuta promena dozvola na 666 za datoteke i 777 za direktorijume, ali obe zaobilaznice generišu nove smetnje. Na IP Plus Hosting smo već podesili da su sve datoteke i direktorijumi u svakom trenutku vaše vlasništvo, bilo da ih generiše skripta ili ih sami postavite preko FTP-a ili SSH. Zato je naravno poželjno da istu udobnost imamo i na svom računaru dok pravimo sajt, pa je u tu svrhu i napravljeno ovo uputstvo.
Tehničko objašnjenje
Problem koliko god nelogično zvuči ipak ima logično objašnjenje: server Apač se na svim linuks sistemima instalira uz otvaranje novog sistemskog korisnika (www-data na Ubuntu a na RPM sistemima je to uglavnom httpd) koji pokreće sam program i tako se pojavljuje i u listi procesa (što možete proveriti komandom top). Mada korisnicima kada ručno pokrenu Apač izgleda kao da su ga sami pokrenuli, u stvari su pokrenuli skriptu koja je naložila korisniku www-data da pokrene /usr/sbin/apache2. PHP se podrazumevano instalira kao Apačov modul mod_php i time je Apač proširen podrškom za rad sa PHP skriptama. Pošto je Apač pokrenut od strane korisnika www-data, on sada ima na raspolaganju i PHP naredbe i funkcije, tako da će sve što napravi biti pod njegovim vlasništvom - upravo nam to komplikuje udoban rad jer bismo mi voleli da svaka datoteka koju ovaj proces napravi bude naše vlasništvo a ne www-data.
Pored osnovnog mod_php-a postoje dva načina da se PHP instalira a da se ceo posao dešava preko našeg korisničkog naloga, jedan je pomoću mod_suphp-a drugi pomoću mod_fcgid-a. Drugi je trenutno pouzdaniji, mi ga koristimo na našim serverima, ali je zato i teži za podešavanje. Mod_suphp je lakši, a pošto je rezultat što se tiče korišćenja isti, ovde ću opistati njegovu instalaciju i podešavanje koje se odnosi na razvoj ili lični računar gde sigurnost servera nije prioritet pošto će samo vlasnik računara, ili najdalje korisnici lokalne mreže, imati pristup. Druga prednost je što će postavka Apača biti potpuno univerzalna i za prebacivanje na mod_php će biti potrebno ukucati samo dve komande. Ovu opciju mi je drago što sam uspeo da zadržim jer za webmastera može da bude veoma važno da ima na raspolaganju i mod_php varijantu za testiranje sajtova koji se nalaze kod provajdera gde ne postoji mogućnost mod_suphp-a ili mod_fcgid-a.
Instalacija LAMP-a sa suPHP-om
Za operativni sistem smo odabrali Ubuntu jer je najrasprostanjeniji linuks na našim prostorima sa velikom grupom korisnika lokalne zajednice na www.ubuntu-rs.org/forum . Instalirajte Ubuntu Server ( http://www.ubuntu.com/business/get-ubuntu/download ) na zasebnu ili virtuelnu mašinu sa podrazumevanim opcijama bez dodatnih paketa i onda sledite ovo uputstvo.
Kao prvi korak instaliraćemo Apache, PHP5, MySQL i osnovne pakete koji su potrebni za većinu PHP skripti, komanda glasi:
sudo apt-get install apache2 libapache2-mod-php5 php5 php5-mysql php5-gd php5-mcrypt mysql-server mysql-client
echo "ServerName localhost" | sudo tee /etc/apache2/conf.d/servername U toku instaliranja paketa MySQL će tražiti lozinku za svoj root nalog (2x radi potvrde). Ovo je standardna procedura za instalaciju LAMP-a na Ubuntu i kao prvi korak bih napravio instalaciju mod_userdir modula koji omogućava svakom korisniku na sistemu da u svom Home direktorijumu napravi public_html i u njemu postavi svoj sajt (ovo je zvanični način da u /home/korisničko_ime držite svoje sajtove):
sudo a2enmod userdir
mkdir ~/public_html
sudo /etc/init.d/apache2 restart Sada prelazimo zamenu podrazumevanog Apačovog modula mod_php sa mod_suphp-om koji će nam omogućiti izvršavanje skripti pod našim korisničkim nalogom umesto pod sistemskim www-data. Dakle, isključujemo podrazumevani mod_php, instaliramo i uključujemo mod_suphp:
sudo a2dismod php5
sudo apt-get install libapache2-mod-suphp suphp-common
sudo a2enmod suphp
sudo /etc/init.d/apache2 restart Poslednjom naredbom smo restartovali Apač i time aktivirali sve promene.
Za Apač 2.4 dodajemo aktiviranje suPHP-a nad svim lokacijama u /etc/apache2/mods-available/suphp.conf
<Directory />
suPHP_Engine on
</Directory> "Require all denied" pretvaramo "Require all granted" u direktivi Directory / u /etc/apache2/apache2.conf.
Stare verzije (v2.2 i niže) ove komande dobijaju preko vhost-a pa su koraci malo obimniji:
Pravimo novi virtuelni host koji će sve direktorijume u ~/public_html/imesajta prikazivati na adresama http://localhost/imesajta. Drugi bitan elemnt instalacije je što suPHP podrazumevano radi samo u virtuelnih hostovima. Napravićemo novi virtuelni host po uzoru na default koji je napravljen instalacijom Apača. Komande su (komentar od # do kraja reda ne treba prekucavati i služe samo kao pojašnjenje):
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mojvhost # kopiranje default v. hosta
sudo nano -w /etc/apache2/sites-available/mojvhost # otvaranje editora u kome na dva mesta treba promeniti /var/www u /home/ivan/public_html (umesto ivan ukucajte vaše korisničko ime)
sudo a2dissite default # isključujemo default virtuelni host
sudo a2ensite mojvhost # uključujemo novi virtuelni host
sudo /etc/init.d/apache2 restart # restartujemo Apač da bi promene postale aktivne Ovo bi bila osnovna postavka sistema ali za većinu ovde nedostaje alatka za upravljanje bazama PHPMyAdmin koja je po Ubuntovoj podrazumevanoj instalaciji podešena za mod_php. Ostali razlozi su što se podrazumevana instalacija ne korisni su: ne nalazi u /var/www ili /home/$HOME/public_html, datoteke su vlasništvo root-a, i skripta nije na virtuelnom hostu. Zbog svih ovih nedostataka opredelio sam se za ručnu instalaciju skripte sa sajta ( http://www.phpmyadmin.net/home_page/downloads.php ) a izgubio sam samo prednost automatskog ažuriranja koje u slučaju lične primene nije previše korisna opcija jer, ponavljam, sistemu se pristupa samo u lokalu. PHPMyAdmin inače dosta retko dobija nove mogućnosti i sve nadogradnje se uglavnom odnose na sigurnosne propuste koji bi da je reč o javnom serveru bile presudne. Ovako ipak skidamo najnoviju verziju sa sajta i stavljamo je u ~/public_html/phpmyadmin Standardna instalacija iz Ubuntuove riznice nam ne odgovara iz nekoliko razloga koje ješ Alan Hartless opisao na svom blogu . Neko vreme sam koristio njegovo rešenje jer omogućava nadogradnju PHPMyAdmin-a zajedno sa sistemom, ali pošto ni moje ni njegovo rešenje nisu za primenu na javnom serveru napravio sam jednostavniju i fleksibilniju varijantu koja daje iste rezultate. Koristiću izvorni kod sa http://www.phpmyadmin.net/home_page/downloads.php i dobiti funkcionalno razvojno okruženje bez ikakvih dodatnih promena podešavanja
Ograničenja suPHP-a o kojima treba voditi računa su:
- morate da koristite Apačov virtuelni host
- dozvoljeni direktorijumi su /var/www i ~/public_html (~ označava vašu Ličnu fasciklu - Home)
- skripte mogu da izvšavaju korisnici i grupe sa ID-jem većim od 100 (ova vrednost je verovatno ostala od Fedore jer je kod Ubuntua korisnički ID od 1000 pa naviše)
- nije dozvoljeno korišćenje simboličkih linkova
Vodite računa da se podešavanja PHP-a sa instaliranim suPHP-com više ne nalaze u /etc/php5/apache2/php.ini već u /etc/php5/cgi/php.ini, što se vidi iz funkcije phpinfo(), ali pošto će uputstva sa interneta verovatno pominjati default putanju ovo sigurno ne treba zaboraviti. Odmah preporučujem da povećate php upload pošto je podrazumevana vrednost 2M što je danas vrlo tesno za rad.
PHPMyAdmin
PHPMyAdmin se na Ubuntu instalira u /usr/share/phpmyadmin pri tom praveći prečicu http://localhost/phpmyadmin koja usmerava na njegov direktorijum /usr/share/phpmyadmin. Pošto je ova default instalacija PHPMyAdmin-a prilagođena Apačovom mod_php modulu, koji smo zamenili, moramo nekoliko prepravki napraviti da bi i on "proradiće". Prvo ćemo reći suPHP-u da bude aktivan u PHPMyAdmin-ovom direktorijumu. U /etc/apache2/mods-available/suphp.conf iznad</IfModule> dodajte sledeće redove: # Uključujem suPHP u PMA direktorijumu <Directory /usr/share/phpmyadmin> suPHP_Engine on </Directory> A onda još nekoliko izmena u /etc/suphp/suphp.conf, redove:
docroot=/var/www:${HOME}/public_html
check_vhost_docroot=true
min_uid=100 min_gid=100 treba promeniti u:
docroot=/var/www:${HOME}/public_html:/usr/share/phpmyadmin
check_vhost_docroot=false
min_uid=33 min_gid=33 Objašnjenje:
- docroot - opet dodajemo PHPMyAdmin-ov direktorijum
- check_vhost_docroot - kod javnog servera ovo nikako ne bi smelo da se menja, ali pošo je ovde reč o razvojnoj mašini neće napraviti nikakav problem. Inače, postoji i druga varijanta kada se zadrži ova provera ali se onda izvorna konfiguracija /etc/apache2/conf.d/phpmyadmin.conf mora pretvoriti u virtuelni host
- min_uid - minimalni identifikacioni broj korisnika. Apache se na serveru pokreće kao sistemski korisnik www-data i ima identifikacioni broj 33. Podrazumevani 100 je verovatno ostao od Fedore pošto su tamo korisnički nalozi od 100 pa naviše, što znači da bi na Ubuntu bez ovog prilagođavanja PHPMyAdmin-u trebalo da stoji 1000
- min_gid - isto kao min_uid, samo važi za grupu www-data
Ako sada restartujete Apache (komanda sudo /etc/init.d/apache2 restart) primetićete da i dalje imamo zabranjen pristup localhost/phpmyadmin. To je zato što su PHPMyAdmin-ove datoteke vlasništvo root-a, čiji je uid 0 - dakle manji od dozvoljenog 33 (izvorne datoteke u /usr/share/phpmyadmin). Mislim da nije veliki problem da ih prebacimo da budu vlasništvo www-data, čime će biti izvršavane od strane suPHP-a, i da pri tom zadržimo mogućnost da se, kada izađe nova verzija PHPMyAdmin-a, nadograde sistemski. Komanda je:
sudo chown -R www-data:www-data /usr/share/phpmyadmin Ovaj poslednji korak - nadogradnja PHPMyAdmin-a - još uvek nisam potvrdio, čekam da se nova verzija pojavi u nadogradnjama pa da vidimo da li je APT vratiti vlasništvo na root-a ili ostaje kako smo podesili. Ako i prebaci vlasništvo na root-a samo treba ponoviti poslednju komandu sudo chown.... i PHPMyAdmin će opet biti funkcionalan.