Http adgangskontrol med og uden .htaccess

Hvis du f.eks. udvikler et nyt site der endnu ikke er offentligt, eller vil have et ekstra lag af sikkerhed på et internt website er http baseret adgangskontrol, der er både fordele og ulemper ved at bruge .htaccess derfor gennemgår vi både metoden med og uden brug af .htaccess, først med: (/var/www/.htaccess)

AuthType Basic
AuthName "Nothing here for you to see"
AuthUserFile /var/htpasswd
Require valid-user

Efterfølgende opretter jeg en password fil i /var/htpasswd

root@lab1:/var/www# htpasswd -c /var/htpasswd mike
New password:
Re-type new password:
Adding password for user mike

hvis jeg vil oprette endnu en bruger ser det sådan her ud:

root@lab1:/var/www# htpasswd /var/htpasswd sofie
New password:
Re-type new password:
Adding password for user sofie

Resultatet:

.htaccess har nogle performancemæssige issues, særligt ved komplekse website, derfor fraråder mange at bruge det, derfor kan det nogengange give mening at flytte dine statements op i apache’s config fil istedet, det kan f.eks. se sådan her ud i /etc/apache2/sites-available/default:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName lab1.mikjaer.com
 
        DocumentRoot /var/www
 
        <Directory /var/www>
                AuthType Basic
                AuthName "Nothing here for you to see"
                AuthUserFile /var/htaccess
                Require valid-user
        </Directory>
 
</VirtualHost>

Der er ikke rigtigt meget at fortælle, det virker på samme måde, blot tillader denne metode at slå .htaccess fra og dermed klemme lidt mere ydelse ud af serveren.

Hvis du vil lave adgangskontrollen lidt mere raffineret kan du kræve specifikke brugere:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName lab1.mikjaer.com
 
        DocumentRoot /var/www
 
        <Directory /var/www>
                AuthType Basic
                AuthName "Nothing here for you to see"
                AuthUserFile /var/htaccess
                require user mike sofie
        </Directory>
 
        <Directory /var/www/admin>
                AuthType Basic
                AuthName "Nothing here for you to see"
                AuthUserFile /var/htaccess
                require user mike
        </Directory>
 
</VirtualHost>

Nu har mike og sofie adgang til /www men kun mike til /www/admin, og er mike først logget ind på /www skal han ikke taste koden igen når han tilgår /www/admin.

Udgivet i Apache, Knowledge Base, Old Base | Skriv en kommentar

Lav din egne fejl-sider på Apache

Der kan være flere årsager til at du gerne vil lave dine egne fejl-sider, markedsføring, brugervenlighed … dette indlæg handler ikke om hvorfor, men hvordan.

Apache understøttet direktivet “ErrorDocument” som kan sættes i .htaccess og /eller Virtualhost definitionen, i .htaccess kan det se sådan her ud:

ErrorDocument 500 /errors/500.html
ErrorDocument 500 "Beklager, det gik vidst ikke helt .. vi kigger på det :-)"
ErrorDocument 500 http://eksempel.dk/errors/500.html
ErrorDocument 404 /errors/500.html

og et eksempel på en virtualhost config med ovenstående i kunne være:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName lab1.dk

        DocumentRoot /var/www
        ErrorLog ${APACHE_LOG_DIR}/error.log

        ErrorDocument 500 /errors/500.html
        ErrorDocument 500 "Beklager, det gik vidst ikke helt .. vi kigger på det :-)"
        ErrorDocument 500 http://eksempel.dk/errors/500.html
        ErrorDocument 404 /errors/500.html

        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Webserveren skal selvfølgelig reloades efter ændringer i Virtualhost direktivet:

root@lab1:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting ..

 

Udgivet i Apache, Knowledge Base, Linux, Old Base | Skriv en kommentar

Optimering af hukommelsesforbrug i Apache

Ydelsen på din webserver har rigtigt meget at gøre med hvor meget RAM den får lov at bruge, Apache har forskellige måder at styre hukommelsen på men Debian (som jeg for det meste altid tager udgangspunkt i) bruger den metode som hedder mpm_prefork, og den virker simpelthen ved at starte et bestemt antal Apache processer til at håndtere indkommende forbindelser, og skrue op og ned for antallet eftersom behovet er til det.

Indstillingerne er i /etc/apache2/apache2.conf

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Og det der sker med denne konfiguration er at der ved Apache’s opstart startes 5 processer, som står og venter på indkomne forespørgsler. Derudover angiver vi et min- og et maxantal ubenyttede processer der må være på maskinen. Det vil sige hvis der er 10 processer og kun 1 af dem er i brug, så lukker den yderligere 4 ned sådan at der kun er 5 ubenyttede.

Ligeledes, hvis der er 4 processer i brug så startes der automatisk 5 mere fordi der er en regel om at der altid skal stå 5 processer klar i tilfælde af at der kommer et peak i indgående forbindelser.

Tricket er efterfølgende at finde ud af hvor meget din typiske Apache process fylder i hukommelsen og dividere det med mængden af ledig ram (eller den mængde du ønsker Apache skal ha lov at konsumere) i maskinen, og tilpasse indstillingerne herefter. Så nu er spørgsmålet bare hvordan man finder ud af hvor meget ram Apache bruger pr. process, her tager jeg udgangspunkt i at du bruger mod_php i modsætning til f.eks. fast_cgi der spawner yderligere processer, mens mod_php som udgangspunkt kun starter en:

root@lab1:~# ps aux | grep 'apache2\|COMMAND'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       365  0.0  0.2 178856 11656 ?        Ss   Feb10  42:25 /usr/sbin/apache2 -k start
www-data  5463  0.1  0.3 183580 14140 ?        S    21:31   0:03 /usr/sbin/apache2 -k start
www-data  5472  0.2  0.2 182836 11960 ?        S    21:31   0:06 /usr/sbin/apache2 -k start
www-data  5937  0.1  0.2 180768 11428 ?        S    21:32   0:03 /usr/sbin/apache2 -k start
www-data  5999  0.1  0.3 185892 14860 ?        S    21:33   0:03 /usr/sbin/apache2 -k start
www-data  6102  0.2  0.2 180748 11392 ?        S    21:35   0:06 /usr/sbin/apache2 -k start
....

Løb listen igennem og find den apache process med det højeste real-memory forbrug (RSS) og læg lidt buffer til, i ovenstående eksempel ville jeg afsætte 16.000kb til hver process, altså 16MB.

Serveren har 16GB ram, Linux og MySQL bruger ca. 4GB så vi har 12GB tilbage til Apache:

12288 / 16 = 768

Jeg laver derfor config fil der ser cirka sådan her ud :

<IfModule mpm_prefork_module>
    StartServers          500
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit          500
    MaxClients           500
    MaxRequestsPerChild   0
</IfModule>

Efterfølgende kan du overvåge serveren med Apache-Status, det er her du ser det hvis du har oprettet for mange servere der ikke bliver brugt. Man kan argumentere for at hvis serveren ikke laver andet end webhosting så sker der ikke noget ved at binde en masse ram til passive apache processer, men hvis resourcerne kan bruges bedre til f.eks. en mail- eller filserver bør du sætte den op således at den frigiver de resourcer den ikke bruger.

Hvis du har oprettet og bruger for mange servere vil du se det ved at serveren bliver enormt langsomt og begynder at bruge store mængder swap-space, generelt bør en webserver være sat op sådan at den ikke bruger swap overhovedet.

Der er ikke nogen one-way-fits-all løsning, du er nødt til at prøve dig frem, lave små ændringer, måle på resultatet, ændre lidt mere og måle igen. Dette er ikke en komplet guide, men et vigtigt første skridt.

Held og lykke 🙂

Udgivet i Apache, Knowledge Base, Linux, Old Base | Skriv en kommentar

.htacces is a bitch, rewrite regler direkte i VirtualHost

Som du sikkert ved er .htaccess en performance-klods om benet, den betyder at webserveren skal søge samtlige undermapper rekursivt igennem hvergang den foretager en forespørgsel. Derfor giver det mening at forsøge at skaffe sig af med .htaccess filer, og hvis man f.eks kører WordPress kan det gøres ved at flytte WordPress’ mod_rewrite statements i VirtualHost direktivet.

Start med at cut’n’paste indholdet af .htacces

root@specialhosting:~# vi /var/www/.htaccess

I 95% af tilfældend vil det se ud som flg.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Indsæt linierne i din virtualhost :

root@specialhosting:~# vi /etc/apache2/sites-enabled/000-default

I mit tilfælde så det sådan her ud:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

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

                <IfModule mod_rewrite.c>
                        RewriteEngine On
                        RewriteBase /
                        RewriteRule ^index\.php$ - [L]
                        RewriteCond %{REQUEST_FILENAME} !-f
                        RewriteCond %{REQUEST_FILENAME} !-d
                        RewriteRule . /index.php [L]
                </IfModule>

        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Derefter slettede jeg min .htaccess fil og genstartede apache, og konstaterede at min blog fungerede endnu:

root@specialhosting:~# rm /var/www/.htaccess
root@specialhosting:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
root@specialhosting:~#

Og et par klik rundt på nogle af min blogs undersider verificerede at alt var i sin skønneste orden, nemt og ligetil 😀

Udgivet i Apache, Knowledge Base, Linux, Old Base | Skriv en kommentar

Webalizer, analyser dine logfiler

Webalizer er et værktøj der tager din standard apache logfiler som input og laver statistik med grafer og charts over dine besøgende, deres browsere, hvor de kommer fra osv. Værktøjet er nemt at bruger og på under 20 minutter er du igang med at få vigtig information ad fra din logfiler.

Som sædvanlig er selve installationen til at komme over, først installerer vi softwaren og opretter et bibliotek til de færdige statistik filer. Statistikken kommer i form af en række html filer med billeder til, så det nemmeste er at lægge dem i webdiret. Man kan selvfølgelig sætte adgangsbegrænsning på mappen, men den finte gemmer vi lige til en anden dag.

root@lab1:~# apt-get install webalizer geoip-database
root@lab1:~# mkdir /var/www/wa
root@lab1:~# chmod 755 /var/www/wa/

Herefter kører du manuelt værktøjet op imod dine apache log filer, sådan her:

root@lab1:~# webalizer -o /var/www/wa /var/log/apache2/access.log
Webalizer V2.01-10 (Linux 2.6.32-5-amd64) locale: en_US.UTF-8
Using logfile /var/log/apache2/access.log (clf)
Using default GeoIP database
Creating output in /var/www/wa
Hostname for reports is 'lab1'
History file not found...
Generating report for May 2012
Generating summary report
Saving history information...
54 records in 0.50 seconds

Scriptet er indrettet sådan at det selv holder styr på hvilke data som allerede er medtaget i statistikken, dvs hvis vi kører den igen medtager den kun ændringerne siden sidste kørsel, det betyder også at vi kan køre den på historiske logfiler og opsamle data, og webalizer understøtter endda at læse pakkede logfiler:

root@lab1:~# webalizer -o /var/www/wa access.log.3.gz
Webalizer V2.01-10 (Linux 2.6.32-5-openvz-amd64) locale: en_US
Using logfile access.log.3.gz (gzip-clf)
Using default GeoIP database
Creating output in /var/www/wa
Hostname for reports is 'cougarcentral'
Reading history file... webalizer.hist
Generating report for April 2012
Generating summary report
Saving history information...
7001352 records (1 bad) in 2631.50 seconds, 2660/sec

Og på den måde kan du bygge statistikker fra før du lærte webalizer at kende, værktøjet er svært at beskrive uden at afsløre fortrolige data, jeg ville gerne lægge en hel rapport frem men alle de interesante data kan jeg desværre ikke dele her, men du kan få et par eksempler:

og lidt mere

Hvis du gerne vil have den opdateret automatisk så kan du lave et cronjob:

root@cougarcentral:~# cd /etc/cron.daily/
root@cougarcentral:/etc/cron.daily# echo '#!/bin/sh' > webalyzer
root@cougarcentral:/etc/cron.daily# echo 'webalizer -o /var/www/wa /var/log/access.log' > webalyzer
root@cougarcentral:/etc/cron.daily# chmod 755 webalyzer

Happy analysing 😉

Udgivet i Apache, Knowledge Base, Old Base | Skriv en kommentar

Sikker opsætning af Apache på webserver med flere domæner. Fcgid / Fastcgi / Suexec

Jeg havde en kunde der skulle bruge en relativt simpel opsætning med 3 webhoteller på en server, og pludselig kom der et spørgsmål jeg ikke havde forventet. “Hvad nu hvis en af mine sider bliver hacket, bliver de andre så også automatisk hacket?” og nej det gør de selvfølgelig ikke, det er logik … for en som mig. Men hvis man har brugt discount udbydere der afvikler alle websites med de samme privilegier og har set dem blive hacket et par gange kan jeg selvfølgelig godt forstå at man tror det er tilfældet.

Men det er det heldigvis ikke, en korrekt opsat webserver tilader ikke de individuelle brugere at tilgå hinandens data, så derfor besluttede jeg mig at skrive dette indlæg / denne guide til atsætte apache op.

En kort disclaimer er vel på sin plads: der er ikke nogen enkelt handling der kan gøre noget “sikkert”, ligesom sikkerhed ikke er absolut, alting udvikler sig og der skal laves cost-benefit analyser osv.osv. Men den her metode er ihvertfald et rigtigt godt udgangspunkt.

Kort beskrevet vil jeg sætte en Debian 6.0 op med Apache2, PHP, Fcgi, Suexec, Proftpd, Mysql og Phpmyadmin. Ud ad til vil det for en ordinær webudvikler ligne et ganske almindeligt webhotel, så brugeren behøver ikke tilegne til yderligere evner end dem han i forvejen har. Vi starter ud med en frisk installeret Debian 6.0 med SSH installeret, hvis ikke du selv kan finde ud af at lave den del så bør du finde en anden guide og starte der, det bliver ihvertfald ikke gennemgået her.

Grundlæggende opsætning af Apache med virtualhosts:

Den her del er det de fleste typisk laver når de sætter Apache op, så den går vi hurtige igennem. Jeg vil oprette site1.lab1.mikjaer.com og site2.lab1.mikjaer.com og så et default-webdir til sider der ikke matcher de to ovenstående.

Først installerer jeg apache og vim

root@lab1:~# apt-get install apache2 vim

Herefter bør webserveren køre, det kan bekræftes ved at besøge http://lab1.mikjaer.com nu mangler vi bare at opsætte et par virtuelle hosts, Debians initscripts er opbygget således at det faktisk er dejlig nemt, i /etc/apache2/sites-available ligger en fil der hedder default, den kopierer jeg til en ny fil der hedder site1:

root@lab1:~# cd /etc/apache2/sites-available/
root@lab1:/etc/apache2/sites-available# cp default site1

Derefter åbner jeg filen i min favoriteditor (vim), den ser således ud:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

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

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Først retter jeg i linie 4 så DocumentRoot nu bliver /var/www/site1/htdocs dernæst i linie 9 så der står <Directory /var/www/site1/htdocs> og så retter jeg linie 24 og 30 så der står site1- foran log-filnavnene, så sletter jeg linie 16-22 og tilføjer “ServerName site1.lab1.mikjaer.com” lige efter linie 2, så ser filen således ud:

<VirtualHost *:80>
         ServerAdmin webmaster@localhost
         ServerName site1.lab1.mikjaer.com

         DocumentRoot /var/www/site1/htdocs
         <Directory />
                 Options FollowSymLinks
                 AllowOverride None
         </Directory>
         <Directory /var/www/site1/htdocs>
                 Options Indexes FollowSymLinks MultiViews
                 AllowOverride None
                 Order allow,deny
                 allow from all
         </Directory>

         ErrorLog ${APACHE_LOG_DIR}/site-error.log

         # Possible values include: debug, info, notice, warn, error, crit,
         # alert, emerg.
         LogLevel warn

         CustomLog ${APACHE_LOG_DIR}/site-access.log combined
 </VirtualHost>

Gem filen, og åben derefter /etc/apache2/sites-available/site1 som ser således ud:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

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

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Tilføj lige efter linie 2 linien “ServerName lab1.mikjaer.com”, gem filen og opret herefter mappen /var/www/site1/htdocs med en midlertidig index.html fil i, aktiver det nye site og genstart apache således:

root@lab1:~# mkdir -p /var/www/site1/htdocs
root@lab1:~# echo Dette er site1 > /var/www/site1/htdocs/index.html
root@lab1:~# a2ensite site1
Enabling site site1.
Run '/etc/init.d/apache2 reload' to activate new configuration!
root@lab1:~# /etc/init.d/apache2 reload
Reloading web server config: apache2.

Nu burde du kunne verificere at opsætningen indtil videre virker ved at gå ind på http://lab1.mikjaer.com og http://site1.lab1.mikjaer.com og konstatere at de to URL’s viser noget forskelligt. (du skal selvfølgelig have sat DNS op selv og sørge for at de subdomæner du har valgt peger på din servers IP Adresse).

Apache vælger VirtualHost efter først-til-mølle princippet, den første dekleration der matcher den url brugeren har skrevet bliver den aktuelle. Dvs hvis du først har *.domæne.dk og sidenhen har test.domæne.dk vil test.domæne.dk altså aldrig blive vist. Hvis ikke nogen matcher vises den første virtualhost, det er derfor at default config filen er prefixet med 000, netop fordi at så loades den altid først. Typisk ønsker du at erstatte den enten med dit primære site, eller en splash-screen der fortæller at siden ikke findes.

Privilege seperation med fcgi og suexec

Vi starter med at opgradere det setup vi har ligenu, vi skal bruge en php fortolker og de to Apache moduler, fcgid og suexec, kommandoen kommer ikke bag på de fleste:

root@lab1:~# apt-get install libapache2-mod-fcgid apache2-suexec-custom php5-cgi

Og så skal de aktiveres:

root@lab1:~# a2enmod fcgid suexec actions
Module fcgid already enabled
Enabling module suexec.
Enabling module actions.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Og fcgid skal konfigureres, opret filen /etc/apache2/conf.d/php5-fcgid.conf og indsæt flg i den:

AddType application/x-httpd-php .php

AddHandler php-fcgi .php
Action php-fcgi /fcgi-bin/php5-fcgi

Alias /fcgi-bin/ /var/www/

<Location /fcgi-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
</Location>

Filen /var/www/php5-fcgi oprettes ligeledes med flg. indhold:

#!/bin/sh
exec /usr/bin/php5-cgi

Den første fil indeholder standard værdier for fcgid og php5-fcgi er den wrapper som bruges til at udføre php scripts med, det er også her det f.eks. er muligt at inkludere en specialtilpasset php.ini fil.

Så oprettes den bruger der skal eje og udføre site1’s filer og php-scripts:

root@lab1:~# adduser site1
Adding user `site1' ...
Adding new group `site1' (1001) ...
Adding new user `site1' (1001) with group `site1' ...
Creating home directory `/home/site1' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for site1
Enter the new value, or press ENTER for the default
  Full Name []:
  Room Number []:
  Work Phone []:
  Home Phone []:
  Other []:
Is the information correct? [Y/n] y

Brugeren skal have fjernet muligheden for at logge ind, dette gøres ved at sætte dens shell til /sbin/nologin og homedir skal sættes til /var/www/site1, fcgid wrapperen skal flyttes ind i brugerens homedir og til sidst skal brugeren tildeles rettighederne over /var/www/site1 som nu er dens homedir:

root@lab1:~# usermod site1 -s /sbin/nologin
root@lab1:~# usermod site1 -d /var/www/site1
root@lab1:~# cp /var/www/php5-fcgi /var/www/site1/
root@lab1:~# chown -R site1:site1 /var/www/site1/
root@lab1:~# chmod 755 /var/www/php5-fcgi

Til sidst skal vi lige tilføje et par linier i /etc/apache2/sites-available/site1 for at aktivere suexec pluginet for site1’s virtualhost, det drejer sig om linie 17 og linie 18:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName site1.lab1.mikjaer.com

        DocumentRoot /var/www/site1/htdocs
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/site1/htdocs>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        Alias /fcgi-bin/ /var/www/site1/
        SuexecUserGroup site1 site1

        ErrorLog ${APACHE_LOG_DIR}/site-error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/site-access.log combined
</VirtualHost>

Til sidst for at teste slette vi den gamle index.html …

root@lab1:~# rm /var/www/site1/htdocs/index.html

… og opretter en index.php i /var/www/site1/htdocs/index.php

<? system("id"); ?>

Genstart apache:

root@lab1:~# /etc/init.d/apache2 restart
Reloading web server config: apache2.

og naviger ind på http://site1.lab1.mikjaer.com/, resultatet skulle gerne se nogenlunde sådan her ud:

uid=1001(site1) gid=1001(site1) groups=1001(site1)

Hvis det ikke er tilfældet kan det hjælpe at kigge i /var/log/apache2/suexec.log som fortæller dig hvad der går galt, typisk handler det om forkerte rettigheder.

Nu kører dine php scrips med en specifik Unix bruger og du kan tildele en unik unix bruger pr. vhost, så har du faktisk klaret selve seperationen. Nu mangler du kun lidt brugervenligshed …

Opsæt ProFtpd, Mysql og Phpmyadmin
Igen, vi kører debian så no big deal her:

root@lab1:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 51
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database site1;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on site1.* to "site1"@localhost identified by "site1kode";
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

Du kan teste database adgangen med:

root@lab1:~# mysql -usite1 -psite1kode site1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 52
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| site1              |
+--------------------+
2 rows in set (0.00 sec)

mysql> quit
Bye

Til sidst mangler vi at sætte ftp op, først tildeler vi brugeren en kode:

root@lab1:~# passwd site1
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Og verificerer at koden IKKE virker til SSH Login:

root@lab1:~# ssh site1@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is c9:74:e4:8d:20:22:3d:94:96:41:b8:62:c7:37:2d:43.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
site1@localhost's password:
Permission denied, please try again.

For at tillade ftp login redigerer vi i /etc/proftpd/proftpd.conf, og fjerner udkommenteringen (#-mærket) ved linie 37 så der står:

#
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.
# 

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6                         on
# If set on you can experience a longer connection delay in many cases.
IdentLookups                    off 

ServerName                      "Debian"
ServerType                      standalone
DeferWelcome                    off 

MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on  

TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200

DisplayLogin                    welcome.msg
DisplayChdir                    .message true
ListOptions                     "-l"

DenyFilter                      \*.*/

# Use this to jail all users in their homes
# DefaultRoot                   ~   

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
RequireValidShell             off 

# Port 21 is the standard FTP port.
Port                            21

(bemærk, kun en del af filen er vist her)

Genstart proftp og test login via ftp:

root@lab1:~# /etc/init.d/proftpd restart
Stopping ftp server: proftpd.
Starting ftp server: proftpd.
root@lab1:~# ftp localhost
Connected to localhost.
220 ProFTPD 1.3.3a Server (Debian) [::ffff:127.0.0.1]
Name (localhost:root): site1
331 Password required for site1
Password:
230 User site1 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxr-xr-x   2 site1    site1        4096 May  7 16:44 htdocs
-rwxr-xr-x   1 site1    site1          33 May  7 16:35 php5-fcgi
226 Transfer complete
ftp>

Til sidst kan du teste at phpmyadmin kører ved at gå ind på http://site1.lab1.mikjaer.com/phpmyadmin/ , standard indstillingen i Debian er at phpmyadmin kan tilgåes på alle domæner ved at skrive /phpmyadmin bagefter.

Jeg håber du kan bruge guiden, jeg ved at jeg tager 5-7.000kr for at lave sådan en opsætning, så hvis du kan selv har du da ihvertfald sparet det 🙂

Har du nogen spørgsmål eller noget du gerne vil have uddybet? Så skriv en kommetar 🙂

Udgivet i Apache, Knowledge Base, Old Base | Skriv en kommentar

Apachetop, hvad laver din webserver?

Apachetop er et værktøj der giver et realtime indblik i en Apache server aktivitet, hvor mange forbindelser og hvilke adresser bliver tilgået, hvor meget data og cpu kraft bliver pt forbrugt, Apachetop ligger i Debian’s repository og beskrives således “Realtime Apache monitoring tool”, værktøjet installeres med et simpelt:

# apt-get install apachetop

og såfremt din apache er sat op ifht. Debian’s forskrifter vil den virke out of the box.

Værktøjet vil herefter løbende læse og analysere din logfiler og på baggrund af det give dig realtime data om det arbejde din webserver udfører, det kan eksempelvis se således ud:

Den vigtigste værdi her er i linie 2 hvor der i mit eksempel står 326 reqs (2.3/sec) og som er et tal for antal forespørgsler i sekundet, et tal der kombineret med viden om de scripts der kører på serveren kan hjælpe dig med at målrettet din indsats i forbindelse med optimering af både server og kode.

De nederste linier viser de mest tilgåede URL’s på serveren samt detaljer om disse, hvor tit de udføres, hvor mange data de generere og hvor hurtigt disse sendes afsted. Apachetop er et af mine faste værktøjer i værktøjskassen når jeg arbejder med optimering af webservere og webapplikationer.

Udgivet i Apache, Knowledge Base, Linux, Old Base | Skriv en kommentar

Overblik over belastning på en Webserver med flere websites

Typisk har man flere hundrede websites (nogle mere ublu konkurrenter har endda både 5 og 10.000) per fysiske server, og det kan ofte være svært at finde ud af præcis hvilke webhoteller der belaster serveren. Det har vi selv slåsset en det med indtil vi fandt det her lille lækre Python script:

Den er afhængig af at /server-status virker på maskinen, men derefter er det bare at downloade og køre scriptet:

web01:~# wget http://www.fr3nd.net/stuff/projects/apache-top/apache-top.py
--2012-05-08 02:37:28--  http://www.fr3nd.net/stuff/projects/apache-top/apache-top.py
Resolving www.fr3nd.net... 87.98.226.159
Connecting to www.fr3nd.net|87.98.226.159|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12849 (13K) [text/plain]
Saving to: `apache-top.py'
 
100%[=========================================================>] 12.849      --.-K/s   in 0,03s   
 
2012-05-08 02:37:28 (489 KB/s) - `apache-top.py' saved [12849/12849]
 
web01:~# chmod 755 apache-top.py
web01:~# ,/apache-top.py -u http://localhost/server-status

 

Udgivet i Apache, Knowledge Base, Old Base | Skriv en kommentar

Apache-status, hvad er det og hvordan virker det?

Apachestatus er et sødt lille værktøj der kan vise dig, realtime, hvad der sker i maven på din Apache, det er det mest detaljerede værktøj primært fordi det ligger som en del af Apache og kan derfor vise hvilke tråde der laver hvad, det er meget rart når man fejlfinder spidsbelastede servere.

Værktøjet virker faktisk out of the box på nyinstallerede Debian maskiner, typisk går det dog ret hurtigt til i andre konfigurationer primært fordi det konflikter med både VirtualHosts og mod_rewrite, hvilket nok bruges på 80% af alle installationer i verden.

For at omgå virtualhosts, skal du tage din default-virtualhosts (den som vises når du indtaster din servers ip i browseren) og indsætte flg. stump kode: (udskift v.z.y.x med din egen ip adresse)

<Location /server-status>
     SetHandler server-status
     Order deny,allow
     Allow from 127.0.0.1 ::1 v.x.y.z
 #    Allow from 192.0.2.0/24
 </Location>
Resultatet kan se ud som flg:
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName lab1.dk
        ServerAlias *.lab1.mikjaer.com
        DocumentRoot /var/www
 
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
 
        <Location /server-status>
                SetHandler server-status
                Order deny,allow
                Allow fro 127.0.0.1 ::1 v.x.y.z
        </Location>
 
</VirtualHost>

Genstart apache:

root@lab1:~# /etc/init.d/apache2 reload
Reloading web server config: apache2.

Og tjek http://lab1.mikjaer.com/server-status i en browser, hvis ikke du får noget resultat skyldtes det sikkert mod_rewrite, f.eks. er WordPress kendt for at hijacke /server-status, det kan fixes ved at tilføje flg. linie 5, i WordPress’ .htaccess fil.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !=/server-status
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Hvis du løbende ønsker at blive opdateret på Apache-status kan du åbne flg. url i din browser: http://lab1.mikjaer.com/server-status?refresh=1 så vil den automatisk reloade hvert sekund, alternativt kan du også køre flg. kommando:

root@lab1:~# watch -n 1 apachectl status
Hvilket har samme effekt, blot i en consol.

Happy tuning ?

Udgivet i Apache, Knowledge Base, Old Base | Skriv en kommentar

Linux IPTables double NAT, SNAT / DNAT, portforwarding without default gateway

#!/bin/bash

# eth1 – inet – 195.184.117.131

# We asume that eth0 is on a private RFC1918 lan on which we are connected to as an ordinary client.
# we also asume that eth1 is connected to the internet with a public routable ip adress.
# This script will then setup, so called, double nat (proxying) to allow people on the internet to access
# systems on the inside by connection to eth1_ip and get forwardet to target_ip on the inside
# according to portnumbers as specified in the ports array down below.

eth0_ip=`ifconfig eth0 | head -n2 | tail -n1 | cut -d : -f 2 | cut -d \ -f 1`
eth1_ip=`ifconfig eth1 | head -n2 | tail -n1 | cut -d : -f 2 | cut -d \ -f 1`

# This is the ip on the inside that all requests will be directed to (sorry the scripts does not currently
# allow for multiple inside ip’s … if you need this you need to uncomment the “iptables -t nat -F line
# and run mutilple copies of the script)

target_ip=192.168.0.101

# Port 8080 on the public side will be forwardet to 80 on the internal side
ports=( 8080:80 20:20 30:30 )

# This should be removed if you want this to work with other rules / an existing script
iptables -t nat -F

# This loops through the ports array
for port in ${ports[@]}
do
# This splits the ports array

public_port=`echo $port | cut -d : -f 1`
private_port=`echo $port | cut -d : -f 2`

# … and apply the rules

iptables -t nat -A PREROUTING -i eth1 -p tcp -d $eth1_ip –dport $public_port -j DNAT –to-destination $target_ip:$private_port
iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source $eth0_ip

done

Udgivet i Knowledge Base, Linux, Networking, Old Base | Skriv en kommentar