Puncte:0

Cum se configurează Apache și PHP-FPM pentru a accepta mai multe subdomenii?

drapel bf
Tom

Am un server Apache care va avea mai multe subdomenii care rulează în el, de exemplu:

www.example.com api.example.com dashboard.example.com client.exemplu.com

Am instalat Apache 2.4.41 și PHP-FPM 7.4 pe Ubuntu 20.04 urmând comenzile de mai jos:

sudo apt install apache2
sudo apt install php libapache2-mod-php
sudo a2dismod php7.4
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo apt install php-fpm
sudo apt install libapache2-mod-fcgid
sudo a2enconf php7.4-fpm
sudo a2enmod proxy
sudo a2enmod proxy_fcgi

Tocmai am făcut asta, nimic mai mult, PHP-FPM rulează normal conform phpinfo().

În mod implicit, site-ul 000-default este activat pe Apache și îl pot accesa prin IP. Când creez un fișier PHP și HTML în directorul /var/www/html, pot accesa aceste fișiere (PHP și HTML) în mod normal, de exemplu: http://EXAMPLE-IP/file.php

Dar atunci când creați un subdomeniu și încercați să accesați orice fișier PHP, eroarea Nici un fișier de intrare specificat. este întotdeauna afișat. În jurnalul Apache, este afișat mesajul de mai jos:

AH01071: A apărut eroarea „Nu se poate deschide scriptul principal: /var/www/html/subdomain.example.com/index.php (Nu există un astfel de fișier sau director)”

AH01071: S-a primit eroarea „Nu se poate deschide scriptul principal: /var/www/html/subdomain.example.com/index-2.php (Nu există un astfel de fișier sau director)”

Dar fișierele HTML din subdomeniu sunt întotdeauna afișate corect.

Acestea sunt VirtualHost-ul meu configurat:

000-default.conf

<VirtualHost *:80>
    ServerAdmin example@example.com
    DocumentRoot /var/www/html

    LogLevel notice core:info
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ErrorLog syslog:local1

    Header append X-FRAME-OPTIONS "SAMEORIGIN"

</VirtualHost>

<VirtualHost *:80>
    ServerName MY-PUBLIC-IP
    Redirect 403 /
    ErrorDocument 403 "The operation had an error."
    DocumentRoot /var/www/html
</VirtualHost>

Acesta este un subdomeniu (unul dintre mai multe):

subdomeniu.example.com

<VirtualHost *:80>
    ServerAdmin example@example.com
    ServerName subdomain.example.com
    ServerAlias subdomain.example.com
    DocumentRoot /var/www/html/subdomain.example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Header append X-FRAME-OPTIONS "SAMEORIGIN"

    RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on

    SSLCertificateFile      /ssl-location/my-cert.crt
    SSLCertificateKeyFile   /ssl-location/my-cert.key
    SSLCertificateChainFile /ssl-location/my-cert-intermediary.crt

    Protocols h2 http/1.1

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=31536000"

    Header append X-FRAME-OPTIONS "SAMEORIGIN"

    <Directory /var/www/subdomain.example.com>
        Options None
        AllowOverride None
        Require all granted
    </Directory>

    ServerAdmin example@example.com
    ServerName subdomain.example.com
    ServerAlias subdomain.example.com
    DocumentRoot /var/www/html/subdomain.example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Din motive de securitate, recomandate de documentația OWASP, am setat în php.ini valoarea doc_root = /var/www/html/, dar dacă îl schimb în doc_root = /var/www/html/subdomain.example.com, fișierele PHP funcționează pe subdomeniul meu și /var/www/htm fișierele nu mai.

Cum configurez doc_root în mod dinamic pentru aceste subdomenii în PHP-FPM, fără a fi nevoie să am un server fizic dedicat pentru fiecare subdomeniu?

Notă: Acesta este fișierul meu de configurare Apache FPM:

conf-enabled/php7.4-fpm.conf

# Redirecționați către php-fpm local dacă mod_php nu este disponibil
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Activați anteturile de autorizare http
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler „proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost”
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Interziceți accesul la sursele php brute în mod implicit
        # Pentru a reactiva, este recomandat să activați accesul la fișiere
        # numai într-un anumit director sau gazdă virtuală
        Solicitați refuzul tuturor
    </FilesMatch>
    # Interziceți accesul la fișierele fără nume de fișier (de exemplu, „.php”)
    <FilesMatch „^\.ph(ar|p|ps|tml)$”>
        Solicitați refuzul tuturor
    </FilesMatch>
</IfModule>
</IfModule>

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.