FollowSymlinks σε cgi-bin directory στον Apache

Alexandros Kosiaris alex at noc.grnet.gr
Mon Apr 27 11:19:07 EEST 2009


> Το πακέτο awstats του fedora κάνει ένα central setup, δηλαδή, όλα τα
> configurations στο /etc/awstats/, όλα τα databases στο
> /var/lib/awstats/, το processing γίνεται με το awstats_updateall.pl κτλ.
> Το μόνο στραβό είναι ότι για να τρέξει κανείς το awstats.pl ως cgi
> script, θα πρέπει να έχει το awstats.pl και το configuration αρχείο στο
> cgi-bin directory. Οπότε είναι απαραίτητο είτε να χρησιμοποιηθούν
> symlinks ή να μεταφέρονται τα αρχείο αυτά από το κεντρικό installation
> στο cgi-bin του κάθε χρήστη κάθε φορά που γίνεται αναβάθμιση του πακέτου
> awstats ή που γίνονται αλλαγές στο configuration αρχείο για κάποιο vhost.

Με μπέρδεψες λιγάκι. Τα configurations είναι το /etc/awstats αλλά πρέπει
να βρίσκεται το configuration στο cgi-bin directory ? Κάτι δεν λες καλά
εδώ...

Από εκεί και πέρα το να μετακινούνται(ή κοπιάρονται) τα αρχεία είναι
εντομάκι που περιμένει να σε δαγκώσει. Και τα symlinks εκτός εάν
φτιάξεις σταθερή διαδικασία που θα την τηρείς ευλαβικά κάποια φορά θα τα
ξεχάσεις. Μπορείς να κάνεις μία παρασπονδία όμως φτιάχνοντας πχ ένα
ειδικό cgi directory που θα περιέχει μόνο το awstats και θα είναι shared
μεταξύ των vhosts.Πχ

Εκτός των vhost declarations

Alias /awstats "/usr/local/www/awstats/cgi-bin/"
<Location /awstats>
    AddHandler cgi-script .pl
    Options +ExecCGI
    DirectoryIndex awstats.pl
</Location>

<Directory "/usr/local/www/awstats/">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

> 
>> Κακώς ο apache σου εκτελεί όλα τα php scripts ανεξαρτήτως virtualhost.
>> Είτε με το mod_php είτε μέσω CGI μπορείς να αποφασίσεις ποια
>> virtualhosts θα έχουν η όχι δυνατότητα να έχουν PHP
> 
> Πάλι όμως, θεωρητικά τουλάχιστον, δύο χρήστες, των οποίων τα
> virtualhosts υποστηρίζουν php scripts, δε θα μπορούν να βλέπουν ο ένας
> το περιεχόμενο των αρχείων του άλλου;
Ναι έχεις δίκιο. Αλλά μπορείς να βάζεις ένα

php_admin_value open_basedir "/path/to/vhost:/path/to/shared/dirs/:ktl"

Στο definition του VirtualHost.Tρελό scaling δεν κάνει προφανώς κάτι
τέτοιο αλλά εάν δεν έχεις να προσθαφαιρείς 20 vhosts την ημέρα είναι οκ.

> 
> Πάντως. τώρα που χρησιμοποιώ το mod_fcgid δεν εκτελεί παντού php
> scripts. (γραφω το config παρακάτω)
> 
>> Παραδείγματος χάρη εγώ χρησιμοποιώντας mod_cgid(και όχι mod_fcgid γιατί
>> απλά δεν ασχολήθηκα ποτέ να το στήσω) έχω ANA Directory ANA VirtualHost
>> που με ενδιαφέρει το απλό(και OXI μέσα στο κεντρικό configuration σε
>> κάνα <Directory /> directive)
>>
>> <VirtualHost TADE>
>> <Directory DEINA>
>> 	Action php4-script /cgi-bin/php4
>> 	AddHandler php4-script .php
>> </Directory>
>> </VirtualHost>
>>
>> Προφανώς πολύ εύκολα κάνεις το ίδιο με mod_php
>> 	AddType application/x-httpd-php .php
>>         AddType application/x-httpd-php-source .phps
>>
>> Το /cgi-bin είναι ένα κοινό script-alias για όλα τα virtualhosts. Εκεί
>> μέσα υπάρχει μόνο το php4 cgi και τίποτε άλλο(και εάν δεν έχεις root στο
>> μηχάνημα δεν μπαίνει και τίποτε άλλο εκεί)
> 
> Το mod_cgid τρέχει την php ως FastCGI ή ως απλό CGI script; (δεν ξέρω κι
> αν χρησιμοποιώ σωστά τους όρους) Δηλαδή, όταν εκτελείται ένα php script,
> ο apache δημιουργεί ένα process της php, το οποίο εξυπηρετεί περισσότερα
> του ενός http requests?

To mod_cgid κάνει ένα από τα apache children να ανοίγει ένα socket στο
filesystem και να περιμένει connections από τα υπόλοιπα με τα cgis που
θέλουν να εκτελεστούν. Μετά κάνει εκείνο spawn τα processes. Ο λόγος που
γίνεται αυτό είναι γιατί εάν έχεις multi-threaded server όταν γίνεται
fork ένα καινούριο process τότε κοπιάρονται και τα threads. Οπότε δεν
εξυπηρετεί περισσότερα requests αλλά μειώνει το κόστος του να φτιάχνεις
παιδιά.
Δεν είναι χρήσιμο εκτός εάν έχεις multi-threaded server αλλά από τα
πράγματα μάλλον θα έχεις κέρδος εάν ενεργοποιήσεις το multi threaded
server σε σύστημα με πολλά vhosts. Αλλά δεν είναι το ίδιο με το FastCGI.

> 
> Το mod_fcgid το χρησιμοποιώ χονδρικά όπως παρακάτω. Έχω δει κάποια πολύ
> μυστήρια setups, αλλά αυτό είναι πιστεύω το πιο απλό που μπορεί να κάνει
> κανείς.
> 
> Στον main server:
> 
>   LoadModule fcgid_module modules/mod_fcgid.so
>   AddHandler fcgid-script .php
>   FCGIWrapper /usr/bin/php-cgi .php
> 
> Και σε κάποιο directoryA σε κάποιο virtualhostA, το μόνο που κάνω είναι
> να προσθέτω το option ExecCGI. Πχ
> 
>   <Virtualhost A>
>     <Directory /path/to/Α>
>       Options +ExecCGI
>     </Directory>
>   </Virtualhost>
> 
> Πιθανότατα το 'FCGIWrapper /usr/bin/php-cgi .php' να είναι πολύ πιο
> σωστό να μπει μέσα στο <Directory> όπου θα εκτελούνται τα php scripts.

Ε το τυπικό setup έχεις. Εντάξει αυτό για το directory ισχύει αλλά οκ,
εύκολα φτιάχνεται.

> 
>>> Τρέχω την php ως fastcgi μέσω του mod_fcgid. Αν χρησιμοποιούσα το
>>> mod_php θα μπορούσα να κάνω χρήση του παραπάνω directive (SuexecUserGroup)?
>> Τσου. Το mod_php σημαίνει ότι ο κώδικας εκτελείται από τον apache και
>> άρα δεν έχει νόημα το suexec μία και είναι μόνο για CGI. Για mod_php
>> χρησιμοποιείς open_basedir και παλιότερα έβαζες και safe_mode αλλά είναι
>> πλέον deprecated και δεν σου προτείνω να το χρησιμοποιήσεις.
> 
> Μάλιστα. Δεν έχω σκοπό να χρησιμοποιήσω ξανά το mod_php. Ένας επιπλέον
> λόγος είναι ότι με το mod_fcgid μπορώ πλέον να χρησιμοποιήσω το threaded
> MPM του apache.

E πρακτικά αυτό, το performance και η δυνατότητα να έχεις ταυτόχρονα
πολλές διαφορετικές εκδόσεις php στον ίδιο server είναι οι λόγοι να
έχεις threaded MPM. Μόνο πρόβλημα εάν θυμάμαι καλά είναι ότι δεν
δουλεύουν μετά τα persistent connections προς βάσεις δεδομένων.

> 
> Ευχαριστώ για την αναλυτική απάντηση
> 
:-)
> 


-- 
Alexandros Kosiaris 	Network Operation Center , GRNET S.A.
e-mail : alex at noc.grnet.gr
Public Key Fingerprint :
D6B1 0634 BE65 719C 6C95  7492 8201 4B46 C478 F074




More information about the Linux-greek-users mailing list