Για να εγκαταστήσουμε τον apache
aptitude install apache2
Για να ελέγξουμε ότι εγκαταστάθηκε σωστά δοκιμάζουμε στην συνέχεια από έναν browser την διεύθυνση http://localhost
Η εκκίνηση/τερματισμός και η επανεκκίνηση του apache γίνεται όπως και σε όλες τις υπηρεσίες στο debian linux.Π.χ. gia την επανεκκίνηση
/etc/init.d/apache2 restart
(start/stop για εκκίνηση/τερματισμό) Εάν μας βγάλει το παρακάτω μήνυμα
Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
Για να εγκαταστήσουμε php
aptitude install php libapache2-mod-php
Εάν έχουμε και βάση δεδομένων mysql στο σύστημά μας θα χρειαστούμε την δυνατότητα επικοινωνίας της php με αυτή
aptitude install php-mysql
Για να ελέγξουμε ότι λειτουργεί η php δημιουργούμε ένα αρχείο /var/www/html/phpinfo.php
<html> <body> <?php phpinfo(); ?> </body> <html>
Το ελέγχουμε με http://localhost/phpinfo.php Για να εγκαταστήσουμε επίσης τον php debugger ώστε να έχουμε την δυνατότητα να καλέσουμε την php από command line (και να δούμε για παράδειγμα την έκδοση)
aptitude install php-db
aptitude install php-apc
Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini προσθέτωντας την παρακάτω γραμμή
apc.rfc1867 = 1
Τέλος επανεκκινούμε τον apache2
/etc/init.d/apache2 restart
aptitude install php5-dev make pecl install uploadprogress
Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini προσθέτωντας την παρακάτω γραμμή
extension=uploadprogress.so
Τέλος επανεκκινούμε τον apache2
/etc/init.d/apache2 restart
Για να μπορούμε να κάνουμε upload μεγάλα αρχεία πάνω από 2MB (π.χ. το component virtuemart στο joomla) θα πρέπει να ανέβάσουμε το όριο ασφαλείας που έχει η php. Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini
; Maximum allowed size for uploaded files. upload_max_filesize = 4M
Κατεβάζουμε τον loader από http://www.ioncube.com/loaders.php
cd /tmp/ wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
Αποσυμπιέζουμε στον φάκελο tmp
tar xvfz ioncube_loaders_lin_x86-64.tar.gz cd ioncube/ mkdir /usr/local/lib/ioncube
Μας ενδιαφέρει ο loader για την έκδοση της php που έχουμε
php -v
Εάν έχουμε π.χ. την php 5.3
mv ioncube_loader_lin_5.*.so /usr/local/lib/ioncube/ chown www-data.www-data -R /usr/local/lib/ioncube/
Προσθέτουμε στις πρώτες γραμμές του αρχείου /etc/php5/apache2/php.ini να φορτώνει τον ioncube loader
zend_extension=/usr/local/lib/ioncube/ioncube_loader_lin_5.3.so
Ελέγχουμε ότι τα αρχεία ρυθμίσεων του apache είναι ok
apache2ctl -t
Επανεκκινούμε τον apache2
/etc/init.d/apache2 restart
Εάν υπάρχει πρόβλημα
cp /tmp/ioncube/loader-wizard.php /home/weballdesign/public_html/www chown weballdesign.weballdesign /home/weballdesign/public_html/loader-wizard.php lynx wwww.weballdesign.gr/loader-wizard.php
Μόλις λυθεί
rm /home/weballdesign/public_html/loader-wizard.php
Για να εγκαταστήσουμε την perl και το module της στον apache2
aptitude install perl libapache2-mod-perl2 /etc/init.d/apache2 restart
Θα ρυθμίσουμε αρχικά τον apache να προβάλλει ένα συγκεκριμένο site όταν ανοίγουμε την διεύθυνση http://localhost.
Ήδη είναι ρυθμισμένος να εμφανίζει το περιεχόμενο του φακέλου /var/www/apache2-default κάνωντας ανακατεύθυνση όταν ανοίγουμε την διεύθυνση http://localhost στην διεύθυνση http://localhost/apache2-default. Η ρύθμιση αυτή είναι στο αρχείο /etc/apache2/sites-available/default.
Υπάρχουν πολλοί τρόποι να ρυθμιστεί ο apche να εξυπηρετεί sites. Ο τρόπος που επιλέγει η διανομή debian είναι αρκετά καλά δομημένος. Διαφέρει όμως από τους τρόπους ρύθμισης άλλων διανομών linux και συνήθως δεν υποστηρίζεται από εξωτερικά εργαλεία ρύθμισης του apache. Για το λόγο αυτό θα ακολουθήσουμε έναν πιο γενικό τρόπο ρύθμισης. Όλα τα sites θα τα καταγράψουμε στο αρχείο /etc/apache2/httpd.conf
Πριν ξεκινήσουμε θα πρέπει να απενεργοποιήσουμε το site που ήδη εξυπηρετείται
a2dissite 000-default /etc/init.d/apache2 restart
Αυτό διαγράφει τον συμβολικό δεσμό στο /etc/apache2/sites-enabled/000-default που δείχνει στο διαθέσιμο site /etc/apache2/sites-available/default.
Η λογική αυτή υπάρχει και για τα modules και οι εντολές που ενεργοποιούν απενεργοποιούν sites και modules είνα αντίστοιχα: a2ensite, a2dissite, a2enmod, a2dismod (πατήστε TAB μετά από καθεμία για να δείτε τα διαθέσιμα sites/modules)
Μετά από κάθε αλλή σε configuration file του apache είναι καλό να τρέχουμε πρώτα την παρακάτω εντολή πριν κάνουμε επανεκκίνηση. Θα ελέγξει την ορθότητα των configuration files, ώστε να αποφύγουμε την αποτυχία επανεκκίνησης του apache.
apache2ctl -t
Αντιγράφουμε τα περιεχόμενα ενός site σε έναν φάκελο π.χ. στον /var/www/mysite.
Στην συνέχεια προσθέτουμε στο αρχείο /etc/apache2/httpd.conf τις παρακάτω γραμμές. (Αφήνουμε και τις απενεργοποιημένες γραμμές που ξεκινούν με σχόλιο #, θα μας χρειαστούν αργότερα
NameVirtualHost *:80 <VirtualHost *:80> #ServerName myserver.mydomain.com #ServerAlias mydomain.com DocumentRoot /var/www/mysite <Directory /var/www/mysite> Options Indexes IncludesNOEXEC FollowSymLinks allow from all </Directory>
Μεγάλη Προσοχή !! Θα πρέπει να μην έχουμε πουθενά αλλού γραμμή NameVirtualHost και όλα τα VirtualHost να είναι <VirtualHost *:80>(http.conf, apache2.conf sites-available/default κτλ). Είναι αιτία των παρακάτω λαθών
_default_ VirtualHost overlap on port 80, the first has precedence
και
VirtualHost *:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results
cd /etc/apache2
Για να δημιουργήσουμε μια αίτηση πιστοποιητικού (1024bit)που θα την στείλουμε σε μία εταιρεία ώστε να μας εκδόσει πιστοποιητικό
/usr/lib/ssl/misc/CA.sh -newreq
Θα δημιουργηθούν τα αρχεία
Το πιστοποιητικό που θα μας εκδοθεί μπορούμε να το σώσουμε στο αρχείο newcert.pem και το intermediate (από τον πάροχο) στο αρχείο newca.pem.
Για 2048bit encryption εκτελούμε
Για δημιουργία private key
openssl genrsa -out newkey.pem 2048
Για δημιουργία αίτησης
openssl req -new -key newkey.pem -out newreq.pem
Αλλιώς για να δημιουργήσουμε ένα αυτουπογραφόμενο πιστοποιητικό
/usr/lib/ssl/misc/CA.sh -newcert
Θα δημιουργηθούν και τα 3 παραπάνω αρχεία
Για να βγάλουμε το password
cp newkey.pem newkey.pem.org openssl rsa -in newkey.pem.org -out newkey.pem
Τέλος ρυθμίζουμε ανάγνωση μόνο από root
chmod 400 newkey.pem newcert.pem
Αλλες εντολές που μπορούμε να εφαρμόσουμε για άλλες ενέργειες
/usr/lib/ssl/misc/CA.sh -newca /usr/lib/ssl/misc/CA.sh -sign
Τροποποιούμε το conf αρχείο που μας ενδιαφέρει π.χ. /etc/apache2/sites-available/mydomain.gr
#Always https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA]
<VirtualHost *:443> ServerName www.mydomain.gr .. #whatever http virtualhost had .. SSLEngine on SSLCertificateFile /etc/apache2/newcert.pem SSLCertificateKeyFile /etc/apache2/newkey.pem SSLCACertificateFile /etc/apache2/newca.pem </VirtualHost>
Μπορεί να γίνει ανά domain
Εγκαθιστούμε το module
apt-get install libapache2-mod-bw
Το ενεργοποιούμε
a2enmod bw
Εισάγουμε τα παρακάτω directives στο conf αρχείο του site
<VirtualHost *:80> ServerName download.mysite.gr
BandwidthModule On ForceBandWidthModule On #400 KB/s Bandwidth all 409600
DocumentRoot /home/mysite/public_html/files ErrorLog /home/mysite/logs/error_log CustomLog /home/mysite/logs/access_log combined </VirtualHost>
Σε περίπτωση που το site μας μεταφέρεται ή διάφορα αρχεία του μετονομάζονται, είναι πιθανόν συνδέσμοι από το google ranking ή από αλλού να μην είναι πλέον έγκυροι
Αν θέλουμε να διατηρηθούν προσωρινά ως έγκυροι, π.χ. λόγω ranking και χωρίς να καταλαβαίνει ο χρήστης πρόβλημα κάνουμε redirect σε url
ErrorDocument 404 http://www.mydomain.com
Αν θέλουμε να διαγραφούν σιγά σιγά από το google και γενικά να εμφανίζεται ένα κατατοπιστικό μύνημα στον χρήστη στέλνουμε σε τοπικό αρχείο
ErrorDocument 404 /404.php
Παράδειγμα τέτοιου αρχείου είναι το παρακάτω
<?php // Change this to your site url $homeUrl = 'http://www.gplatamon.com/'; // Add the 404 header to not confuse search engines header("HTTP/1.0 404 Not Found"); $arPath = explode('/', $_SERVER['REQUEST_URI']); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 Error - Page not found</title> <meta http-equiv="refresh" content="10;url=<?php echo $homeUrl;?>" /> <style type="text/css"> *{margin:0px;padding:0px;} body{background-color:#F9F9F9;color:#111;font: normal 95%/130% "Trebuchet MS", Verdana, Arial, sans-serif;margin:0px;padding:20px 0px;} a {color:#6699CC;text-decoration:none;border-bottom: 1px solid #EEE;} h1{color:#333;font:normal 1.7em Georgia, "Times New Roman", Times, serif;margin:0px;padding:0px;} h2,h3{color: #6699cc;font: normal 1.25em Georgia, "Times New Roman", Times, serif;margin: 20px 0px;padding: 0px;} ul{margin:10px 20px;} li{list-style:disc;} #wrapper{background-color:#FFFFFF;border:1px solid #DDDDDD;margin:auto;width:40em;} #header {background:#D5D5D5;border-bottom:1px solid #DDD;color:#888;font-size:85%;margin:0px;padding:3px 10px;} #body{padding:10px;} #goog-wm { } #goog-wm h3.closest-match { } #goog-wm h3.closest-match a { } #goog-wm h3.other-things { } #goog-wm ul li { } #goog-wm li.search-goog { display: block; } .comment{color:#999;} </style> </head> <body> <div id="wrapper"> <div id="header"> <a style="text-transform:uppercase;" href="<?php echo $homeUrl;?>"><?php echo str_replace(array('http://', 'www.', '/'), '', $homeUrl);?></a> → Page not found</div> <div id="body"> <h1>[404] Page not found</h1> <p> </p> <p>Sorry, the file <?php echo $_SERVER['REQUEST_URI'];?> was not found on this server.</p> <p>Please ensure that you have entered the url correctly. If you did so, then probably the file was removed from the server.</p> <p>You will be redirected to our homepage in 10 seconds.</p> <ul> <li><a href="<?php echo $homeUrl;?>">Click here to go to the homepage.</a></li> </ul> <br><br><br> <h1>[404] Δεν βρέθηκε η σελίδα</h1> <p>Δυστυχώς, η σελίδα <?php echo $_SERVER['REQUEST_URI'];?> δεν βρέθηκε.</p> <p>Παρακαλώ σιγουρέψτε ότι εισάγατε σωστή την διεύθυνση. Εάν την έχετε εισαγάγει σωστά είναι πιθανό ότι η διεύθυνση δεν είναι πλέον έγκυρη.</p> <p>Θα μεταφερθείτε στην αρχική μας σελίδα σε 10 δευτερόλεπτα..</p> <ul> <li><a href="<?php echo $homeUrl;?>">Πατήστε εδώ για να μεταφερθείτε στην αρχική.</a></li> </ul> <!--<li><a href="javascript:history.back();">Click here to go back.</a></li> <li><a href="<?php echo $homeUrl;?>/contact.php">Click here to contact us.</a></li> </ul> <div id="leftContent"> <script type="text/javascript"> var GOOG_FIXURL_LANG = 'en'; var GOOG_FIXURL_SITE = '<?php echo $homeUrl;?>'; </script> <script type="text/javascript" src="http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script> </div>--> </div> </div> </body> </html>
Ένα από τα πιο ισχυρά και βέβαια, από τα πιο πολύπλοκα features του apache
Αυτό μπορεί να φανεί αρκετά χρήσιμο σε πολλές περιπτώσεις. Αρκεί να προσθέσουμε τα παρακάτω
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.domain.com/$1 [L,R]
Για να εγκαταστήσουμε το module
aptitude install apache2-suexec
Για να δούμε πληροφορίες εκτελούμε
/usr/lib/apache2/suexec -V
Για να αλλάξουμε τον προκαθορισμένο φάκελο κάτω από τον οποίον εκτελούνται cgi και php μέσω suexec, εγκαθιστούμε το πακέτο apache2-suexec-custom αντί το apache2-suexec
aptitude install apache2-suexec-custom
Στην συνέχεια τροποποιούμε το αρχείο /etc/apache2/suexec/www-data αλλάζοντας την 1η γραμμή του από /var/www/ π.χ. σε /home
Σε συνδυασμό με την suexec μπορούμε να χρησιμοποιήσουμε το module fcgid το οποίο εκτελεί τα php scripts με δικαιώματα του χρήστη και όχι του apache και είναι αρκετά γρήγορο σε σχέση με τα cgi
Για την εγκατάσταση
apt-get install libapache2-mod-fcgid php-cgi a2dismod php a2enmod fcgi service apache2 restart
Στην συνέχεια προσθέτουμε στο configuration αρχείο του apache που αφορά το domain που θέλουμε στην ενότητα public_html Directory
<Directory /home/testdom/public_html> Options Indexes IncludesNOEXEC FollowSymLinks AddHandler fcgid-script .php Options +ExecCGI FCGIWrapper /home/testdom/fcgi-bin/php5.fcgi .php allow from all AllowOverride All </Directory>
Δημιουργούμε τον φάκελο /home/testdom/fcgi-bin και μέσα του το αρχείο php5.fcgi:
#!/bin/bash PHPRC=/etc/php5/apache2/php.ini export PHPRC umask 027 exec /usr/bin/php-cgi
Του δίνουμε δικαιώματα εκτέλεσης και επανεκκινούμε τον apache
chmod +x /home/testdom/fcgi-bin/php5.fcgi /etc/init.d/apache2 restart
Για νέους χρήστες μπορούμε να προσθέσουμε αυτόν τον φάκελο και το αρχείο στο /etc/skel/
Τα αρχεία της εφαρμογής που εκτελούμε καθώς και το fcgi wrapper θα πρέπει να έχουν ιδιοκτήτη τον χρήστη και να μην υπάρχει η δυνατότητα εγγραφής από την ομάδα ή από τους άλλους. Ειδάλλως η suexec δεν θα τα εκτελέσει To log της suexec είναι στο φάκελο /var/log/apache2/
a2enmod dav_fs dav
Θα δημιουργήσουμε ένα αρχείο .htaccess (ή θα βάλουμε τις ρυθμίσεις κατευθείαν στο conf αρχείο του apache)
AuthUserFile /home/testuser/.htpass AuthGroupFile /dev/null AuthName "Restricted Area, pls provide username and password" AuthType Basic require valid-user
Το αρχείο .htpass θα δημιουργηθεί ως εξής :
cd ~testuser htpasswd -c .htpass testuser
Για προσθήκη περισσότερων χρηστών
htpasswd .htpass otherusername
Εάν θέλουμε να παρακολουθήσουμε τις συνδέσεις που γίνονται στους virtual hosts που έχουμε τότε μπορούμε να ενεργοποιήσουμε το module mod_status
a2enmod status
Στην συνέχεια τροποποιούμε το αρχείο /etc/apache2/mods-enabled/status.conf εισάγωντας στο Location directive τις ip από τις οποίες μπορούμε να έχουμε πρόσβαση
<Location /server-status> SetHandler server-status Order deny,allow Deny from all .. Allow from 127.0.0.1 ::1 Allow from 111.222.111,222 ::1 .. </Location>
Ενεργοποιούμε επιπλέον πληροφορίες με
ExtendedStatus On
Τέλος επανεκκινούμε τον apache
service apache2 restart
Μπορούμε πλέον να δούμε τις πληροφορίες από έναν browser στην διεύθυνση
http://[www.mydomain.com]/server-status
Πατώντας F5 ανανεώνουμε ή εάν θέλουμε αυτόματη ανανέωση
http://[www.mydomain.com]/server-status?refresh=10
Εάν έχουμε πρόσβαση ssh, μπορούμε να τα δούμε και από κονσόλα με
lynx localhost/server-status