Mám na VPS několik webů, některé aktualizované častěji, jiné ne. Stále jsem řešil problém s uživatelskými právy – něco upravím přes ssh, něco nakopíruji přes sftp, něco si redakční systém vytvoří sám. A problém je na světě. Soubory nahrané přes sftp mají práva uživatele, který data nakopíroval, redakční systém uložil soubory s právy uživatele, pod kterým beží Apache.
Řešení je několik – neřešit to a doufat, nastavovat práva ručně nebo pomocí scriptu, dát takový script do cronu. Nebo to vyřešit jednou provždy pomocí apache-mpm-itk.
Apache má několik modulů podle toho jak zpracovává požadavky:
Prefork – každý požadavek jeden proces, PHP může být přímo součástí Apache, není problém s částmi php, které nejsou thread save (nezvládnou běžet najednou ve více vláknech, např. ImageMagic), nejstarší modul a zatím asi nejpoužívanější
Worker – více procesů a každý proces má několik vláken, je zde problém s PHP, ne všechny části jsou thread save, musí se spouštět přes FastCgi
Event – podobně jako Prefork, každý požadavek je jeden proces, php může být součástí Apache. Navíc je odolný proti útoku Slowloris, server je méně zatěžován, nižšší paměťové nároky, jako výchozí je od Apache verze 2.4
ITK – vychází z Preforku, je oblíbený hlavně u hostingových společností, protože lze Apache říct, pod jakým uživatelem má běžet proces obsluhující daný virtualhost
Pokud je PHP součástí Apache, má to další výhodu – přímo ve virtual host lze zadávat directivy pomocí php_value hodnota, php_admin_value hodnota, php_flag hotnota On|Off atd. Při použití php_admin_* nepůjde nastavená hodnota přepsat v .htaccess.
Instalace a nastavení modulu ITK
Instalace je velice jednoduchá. U mne na Ubuntu server stačí:
sudo apt-get install apache2-mpm-itk
Pak v /etc/apache2/sites-available/nazevwebu.conf přidat do VirtualHost jméno uživatele a skupinu:
AssignUserID uzivatel skupina
Takto vypadá konfigurace virtualhostu:
<VirtualHost *:80> ServerName stranka.cz ServerAlias www.stranka.cz ServerAdmin petr@ok2cqr.com DocumentRoot /home/stranka/www <Directory /> Options FollowSymLinks AllowOverride All </Directory> AssignUserID stranka stranka ErrorLog /home/stranka/logs/error.log LogLevel warn CustomLog /home/stranka/logs/access.log combined </VirtualHost>
Znovu načteme konfiguraci
sudo service apache2 reload
a nastavíme správně vlastníka všech souborů
cd /home/stranka chown stranka.stranka * -R
Teď když budete kopírovat soubory přes SFTP nebo přes webové rozhraní, budou mít vždy nastavená správně práva (vlastníka).