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>