Různé verze PHP v rámci adresářové struktury


Občas je potřeba v různých adresářích mít různé verze PHP. Například když máte domena.cz/blog (jako WordPress s PHP 8.x) a domena.cz/shop (třeba jako Prestashop s PHP 7.x). Toto chování lze docílit pomocí úpravy našich defaultních configů a s pomocí funkcionality subdomén. Subdoménová funkcionalita je dostupná od operačního systému Debian Bookworm a novější.

Příklad nastavení pro ukázkovou doménu vhtest.cz

V nastavení domény je potřeba nejprve založit subdomény.

Takto vypadá defaultní config subdomény v Apache. Je tam toho fakt hodně i se scrollbarem:

Následně je potřeba ho upravit takto jednoduše:

Textově takto. Musíte nahradit doménu a adresář za svou reálnou doménu a adresář. V našem příkladu je to /sedmicka.

  Alias /sedmicka "/www/hosting/vhtest.cz/sedmicka/"
  <Directory /www/hosting/vhtest.cz/sedmicka>
    <IfModule mod_proxy_fcgi.c>
      <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php7.4-fpm-vhtest.cz_sedmicka.sock|fcgi://localhost"
      </FilesMatch>
    </IfModule>
  </Directory>

V hlavním configu Apache celé domény je potřeba následující změna linkování subdomén:

IncludeOptional sites-available/subdomains/vhtest.cz_*.conf

Tento Include je potřeba přesunout do hlavního sekce Macro

# ################ Macro vhtest.cz ####################
<Macro vhtest.cz>
  ServerAdmin postmaster@vhtest.cz
  ErrorLog /var/log/apache2/vhtest.cz/error-vhtest.cz.log
  CustomLog /var/log/apache2/vhtest.cz/access-vhtest.cz.log combined

## odkomentovat, pokud se ma web presmerovavat automaticky z http na https - pozor, bude automaticky pro vsechny subdomeny!!!
   RewriteEngine On
   RewriteCond %{HTTPS} off
   RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/ [NC]
#  RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]

  <Directory "/www/hosting/vhtest.cz">
    Options -Indexes +FollowSymLinks -MultiViews +SymLinksIfOwnerMatch +IncludesNoExec -Includes
        AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,MultiViews,FollowSymLinks
        <Limit GET POST OPTIONS>
                Require all granted
        </Limit>
        <LimitExcept GET POST OPTIONS>
                Require all denied
        </LimitExcept>

        Require all granted
    <IfModule mod_access_compat.c>
        Order allow,deny
        Allow from all
    </IfModule>
  </Directory>

  <IfModule mod_proxy_fcgi.c>
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php8.2-fpm-vhtest.cz.sock|fcgi://localhost"
    </FilesMatch>
    <LocationMatch "/php_status">
        SetHandler "proxy:unix:/run/php8.2-fpm-vhtest.cz.sock|fcgi://localhost"
        Require ip 127.0.0.1 95.168.219.1 ::1
    </LocationMatch>
        ProxyTimeout 360
  </IfModule>

IncludeOptional sites-available/subdomains/vhtest.cz_*.conf

</Macro>

A následně smazat zbytek configu, kteý je za základní definicí virtualhostů pro porty 80 a 443 pro hlavní doménu.

Toto tedy ještě zůstane:

<VirtualHost *:443>
  DocumentRoot /www/hosting/vhtest.cz/www
  Servername vhtest.cz
  ServerAlias www.vhtest.cz
  ServerAlias www.vhtest.cz.ars05.vas-server.cz vhtest.cz.ars05.vas-server.cz

  Use vhtest.cz
  Use vhtest.cz-ssl
</VirtualHost>

A toto celé se smaže:

# ###################### subdomains - start ##########################
# Include will fail with an error 
# IncludeOptional will silently ignore
IncludeOptional sites-available/subdomains/vhtest.cz_*.conf
# ######################  subdomains - end  ##########################

# ###################### *.vhtest.cz ##########################
<VirtualHost *:80>
  VirtualDocumentRoot /www/hosting/vhtest.cz/%-3+
  ServerName stats.vhtest.cz
  ServerAlias *.vhtest.cz

  Use vhtest.cz

</VirtualHost>

<VirtualHost *:443>
  VirtualDocumentRoot /www/hosting/vhtest.cz/%-3+
  Servername stats.vhtest.cz
  ServerAlias *.vhtest.cz
  ServerAdmin postmaster@vhtest.cz

  Use vhtest.cz
  Use vhtest.cz-ssl
</VirtualHost>

# ###################### *.vhtest.cz ##########################
<VirtualHost *:80>
  VirtualDocumentRoot /www/hosting/vhtest.cz/%-6+
  ServerName stats.vhtest.cz.ars05.vas-server.cz
  ServerAlias *.vhtest.cz.ars05.vas-server.cz

  Use vhtest.cz

</VirtualHost>

<VirtualHost *:443>
  VirtualDocumentRoot /www/hosting/vhtest.cz/%-6+
  Servername stats.vhtest.cz.ars05.vas-server.cz
  ServerAlias *.vhtest.cz.ars05.vas-server.cz
  ServerAdmin postmaster@vhtest.cz

  Use vhtest.cz
  Use vhtest.cz-ssl
</VirtualHost>