Můj vlastní webserver (Debian + Apache)

Publikoval admin v

Zkoušel jsem si nainstalovat svůj webový server. Prvně jsem zkusil Ubuntu, ale na serveru s virtuálními stroji neměli poslední verzi. Pak jsem pátral po CentOS, protože by mělo mít některé lepší vlastnosti jako je omezení root adresáře i pro SFTP (pro FTP je to jednoduché všude). Z diskuzí jsem se dozvěděl, že práce s CentOSem není úplně tak uživatelsky přívětivá, když je člověk zvyklý ma Ubuntu. Takže jsem pak zapátral po Debianu a vzhledem k tomu, že Ubuntu je na něm postavené, ale staví se i na jeho nestabilních verzích, tak jsem zkusil Debian, který byl na diskuzích doporučen před Ubuntu.

Dynamické VirtualHosts

Abyste nemuseli pro každý nový web přidávat do konfigurace Apache web serveru nového virtual hosta, pomůže vám modul mod_vhost_alias.

Stačí aktivovat tento modul a upravit následující soubor:

#/etc/apache2/httpd.conf# mapuje domenu subdomain.example.cz do adresar /home/example.cz/webs/subdomain# takze pro www.example.cz je nutná struktura /home/example.cz/webs/www# pro url www.test.example.cz by mela fungovat struktura /home/example.cz/webs/www.test# pro url example.cz je treba vytvorit adresa /home/example.cz/webs/_VirtualDocumentRoot /home/%-2.0.%-1/webs/%-3+

Výše uvedenou strukturu jsem zvolil, aby byli oddělené weby, aby mohl mít jeden uživatel více subdomén. Pomocí dalšího nastavení lze nastavit root adresáře pro jednotlivé uživatele pro přístup přes SFTP, takže pokud bude existovat administrátor nějaké subdomény, tak se nastaví přístup pouze do adresáře subdomény.

Pokud bude na doménu nastavený záznam *.server.cz, tak může admin domény vytvářet subdomény bez omezení.

Virtual hosts pod kontrolou a bez restartu

Toto může být jedna z konfigurací, která také využívá VirtualDocumentRoot, takže si pak každý uživatel může vytvářet poddomény podle potřeb.

<VirtualHost *:80>
        ServerName www.example.cz
        ServerAlias radekzilka.cz *.example.cz

        # DocumentRoot /home/example.cz/webs/www
        VirtualDocumentRoot /home/%-2.0.%-1/webs/%-3+


        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
</VirtualHost>

Pro znovu načtení konfigurace stačí spustit /etc/init.d/apache2 reload.

SSH

Instalací ssh se zabývat nebudu protože na virtuálním stroji musí být nainstalován. Nicméně je dobré

  1. vytvořit uživatele pomocí „adduser“, pak
  2. otestovat, jestli se nový uživatel připojí přes SSH
  3. nastavit v souboru /etc/ssh/sshd_config volbu „PermitRootLogin no“

Pak se můžete stále přihlásit přes SSH jako nový uživatel a následně použít příkaz „su“ pro spuštění terminálu s právy roota. Přikaz „sudo“ nemusí někdy fungovat.

Dále by možná bylo vhodné omezit SSH jenom pro určité uživatele. Stačí přidat do /etc/ssh/sshd_config volbu „AllowUsers uzivatel1 uzivatel2 …“, ale tím se bohužel vypne i SFTP přístup pro ostatní uživatele, což je nežádoucí

Řešením je nastavení uživateli jako výhozí sftp shell a přidat shell do známých shellů. Uživatel se sice jakoby přihlásí, ale nemůže nic dělat

usermod -s /usr/lib/sftp-server username

echo ‚/usr/lib/stfp-server‘ >> /etc/shells

FastCGI

Zapnout apache moduly

a2enmod fastcgi

a2enmod fsgid

a2dismod php5   (vypnout původní modul)

Dále vytvořit soubor php-fcgi-wrapper:

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_CHILDREN=3   # při přístupu na vhosta to spustí 3 php procesy, které zaberou paměť
exec /usr/lib/cgi-bin/php

Nastavit u virtual hostů

<VirtualHost *:80>
        ServerName www.myserver.cz
        ServerAlias myserver.cz *.myserver.cz

        #DocumentRoot /home/radekzilka.cz/webs/www
        VirtualDocumentRoot /home/%-2.0.%-1/webs/%-3+
#       SuexecUserGroup myuser myusergroup


        <Directory />
                AddHandler fcgid-script .php
#                Options FollowSymLinks
                Options +ExecCGI
                FCGIWrapper /home/user/..../php-fcgi-wrapper .php
                AllowOverride All
        </Directory>
</VirtualHost>

Podobně se pak musí nastavit i konfigurace pro phpmyadmina, aby

Později by se to mělo spojit s suexec, aby se každý požadavek spouštěl pouze pod uživatelem dané domény, tím se zamezí čtení dat z cizích webů na stejném serveru.

suexec

konfigurace vhosta:

<VirtualHost *:80>
ServerName knihovna.polna.cz

# DocumentRoot /home/polna.cz/webs/knihovna
VirtualDocumentRoot /home/%-2.0.%-1/webs/%-3+
SuexecUserGroup polna.cz polna.cz
 

FcgidMaxRequestLen 15728640


<Directory />
AddHandler fcgid-script .php
# Options FollowSymLinks
Options +ExecCGI
FCGIWrapper /var/www/polna.cz/php-fcgi-wrapper .php
AllowOverride All
</Directory>
</VirtualHost>

V případě chyby zkontrolovat /var/log/apache/error.log a /var/log/apache/suexec.log.

Při použití SuexecUserGroup musí být FCGIWrapper v DocumentRootu server (nikoliv DocumentRoot vhosta). Je pak ale povolené adresáře pro vhosta nalinkovat kamkoliv a DocumentRootu nasměrovat na ten link nebo někam uvnitř.

Dále je pak nutné, aby adresář, kde je uložený wrapper měl stejného vlastníka a skupinu, jako je nastavené u SuexecUserGroup a pak taky aby wrapper neměl nastavené SUID nebo GUID.

SSL

V debianu sqeeze stačí zapnout SSL mod pomocí „a2enmod ssl“ a pak stačí zapnout ssl konfiguraci pro vhosty „a2ensite default-ssl“.

Další podrobnosti lze přečíst v souboru /usr/share/doc/apache2.2-common/README.Debian.gz

Není potřeba dělat žádné složité generování klíčů pomocí SSL.

.htaccess

Nezapomeň povolit v nastavení virtual hostů AllowOverride All.

Autentizace

cut -f 1,2 -d : /etc/shadow > .htpasswd
#.htaccess
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /etc/apache2/.htpasswd
#Require user radek radezilka.cz
#Require valid-user

Čas na serveru

nastavení správné časové zóny: dpkg-reconfigure tzdata

aktualizace přesného času: apt-get install ntpdate

Zálohování

zálohování: tar czvf abcfolder.tar.gz abcfolder

skript pro stažení záloh, ale chtělo by to HTTPS, viz výše SSL

MySQL

nastavení UTF8 přímo v nastavení serveru /etc/mysql/my.cnf

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci