LinuxFanClub wiki

Υπηρεσίες, Προγραμματισμός, Εκπαίδευση ..

User Tools

Site Tools


el:linux:debian:server:apache

Apache - Εξυπηρετητής ιστοσελίδων

Εγκατάσταση apache2

Για να εγκαταστήσουμε τον 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

βλ.Ρύθμιση δικτύου

Εγκατάσταση πρόσθετων modules

php

Για να εγκαταστήσουμε php

aptitude install php5 libapache2-mod-php5

Εάν έχουμε και βάση δεδομένων mysql στο σύστημά μας θα χρειαστούμε την δυνατότητα επικοινωνίας της php με αυτή

aptitude install php5-mysql

Για να ελέγξουμε ότι λειτουργεί η php δημιουργούμε ένα αρχείο /var/www/phpinfo.php

<html>
  <body>
    <?php phpinfo(); ?>
  </body>
<html>

Το ελέγχουμε με http://localhost/phpinfo.php Για να εγκαταστήσουμε επίσης τον php debugger ώστε να έχουμε την δυνατότητα να καλέσουμε την php από command line (και να δούμε για παράδειγμα την έκδοση)

aptitude install php-db

apc

aptitude install php-apc

Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini προσθέτωντας την παρακάτω γραμμή

apc.rfc1867 = 1

Τέλος επανεκκινούμε τον apache2

/etc/init.d/apache2 restart

PECL uploadprogress library

aptitude install php5-dev make
pecl install uploadprogress

Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini προσθέτωντας την παρακάτω γραμμή

extension=uploadprogress.so

Τέλος επανεκκινούμε τον apache2

/etc/init.d/apache2 restart

Ρυθμίσεις php

Για να μπορούμε να κάνουμε upload μεγάλα αρχεία πάνω από 2MB (π.χ. το component virtuemart στο joomla) θα πρέπει να ανέβάσουμε το όριο ασφαλείας που έχει η php. Τροποποιούμε το αρχείο /etc/php5/apache2/php.ini

; Maximum allowed size for uploaded files.
upload_max_filesize = 4M

ioncube

Κατεβάζουμε τον 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

Για να εγκαταστήσουμε την perl και το module της στον apache2

aptitude install perl libapache2-mod-perl2
/etc/init.d/apache2 restart

Εξυπηρέτηση site

Θα ρυθμίσουμε αρχικά τον 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

Αντιγράφουμε τα περιεχόμενα ενός 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

SSL - TLS Ρυθμίσεις

cd /etc/apache2

Για να δημιουργήσουμε μια αίτηση πιστοποιητικού (1024bit)που θα την στείλουμε σε μία εταιρεία ώστε να μας εκδόσει πιστοποιητικό

/usr/lib/ssl/misc/CA.sh -newreq

Θα δημιουργηθούν τα αρχεία

  • newreq.pem (που θα στείλουμε στην εταιρεία)
  • newkey.pem (Το κλειδί μας που μαζί με το πιστοποιητικό της εταιρείας είναι μοναδικό ζεύγος)

Το πιστοποιητικό που θα μας εκδοθεί μπορούμε να το σώσουμε στο αρχείο 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

ssl conf directives

Τροποποιούμε το 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>

Προχωρημένα

Περιορισμός bandwidth

Μπορεί να γίνει ανά 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>

mod_rewrite

Ένα από τα πιο ισχυρά και βέβαια, από τα πιο πολύπλοκα features του apache

Αλλαγή domain.com σε www.domain.com

Αυτό μπορεί να φανεί αρκετά χρήσιμο σε πολλές περιπτώσεις. Αρκεί να προσθέσουμε τα παρακάτω

RewriteCond %{HTTP_HOST}   !^www\.domain\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.domain.com/$1 [L,R]

mod_suexec

Για να εγκαταστήσουμε το 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

mod_fcgid

Σε συνδυασμό με την 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/

Protected Web Dirs

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

mod_status

Εάν θέλουμε να παρακολουθήσουμε τις συνδέσεις που γίνονται στους 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

Πηγές

el/linux/debian/server/apache.txt · Last modified: Y/m/d H:i by vagk