ฉันมีเซิร์ฟเวอร์ Apache ที่จะมีโดเมนย่อยหลายโดเมนทำงานอยู่ภายใน เช่น:
www.example.com
api.example.com
แดชบอร์ด.example.com
ลูกค้า.example.com
ฉันติดตั้ง Apache 2.4.41 และ PHP-FPM 7.4 บน Ubuntu 20.04 โดยทำตามคำสั่งด้านล่าง:
sudo apt ติดตั้ง apache2
sudo apt ติดตั้ง php libapache2-mod-php
sudo a2dismod php7.4
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo apt ติดตั้ง php-fpm
sudo apt ติดตั้ง libapache2-mod-fcgid
sudo a2enconf php7.4-fpm
sudo a2enmod พร็อกซี
sudo a2enmod proxy_fcgi
ฉันแค่ทำอย่างนั้น ไม่มีอะไรมาก PHP-FPM ทำงานตามปกติตาม phpinfo().
ตามค่าเริ่มต้น ไซต์เริ่มต้น 000 เปิดใช้งานบน Apache และฉันสามารถเข้าถึงได้ผ่าน IP เมื่อสร้างไฟล์ PHP และ HTML ในไดเร็กทอรี /var/www/html ฉันสามารถเข้าถึงไฟล์เหล่านี้ (PHP และ HTML) ได้ตามปกติ เช่น: http://EXAMPLE-IP/file.php
แต่เมื่อสร้างโดเมนย่อยและพยายามเข้าถึงไฟล์ PHP ข้อผิดพลาด ไม่มีแฟ้มข้อมูลที่ระบุ. ปรากฏขึ้นเสมอ ในบันทึก apache ข้อความด้านล่างนี้จะแสดงขึ้น:
AH01071: มีข้อผิดพลาด 'ไม่สามารถเปิดสคริปต์หลัก: /var/www/html/subdomain.example.com/index.php (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)'
AH01071: มีข้อผิดพลาด 'ไม่สามารถเปิดสคริปต์หลัก: /var/www/html/subdomain.example.com/index-2.php (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)'
แต่ไฟล์ HTML ภายในโดเมนย่อยจะแสดงอย่างถูกต้องเสมอ
นี่คือ VirtualHost ที่กำหนดค่าของฉัน:
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>
นี่คือโดเมนย่อย (หนึ่งในหลายรายการ):
โดเมนย่อย.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>
ด้วยเหตุผลด้านความปลอดภัย ตามคำแนะนำของเอกสาร OWASP ฉันตั้งค่าใน php.ini doc_root = /var/www/html/แต่ถ้าจะเปลี่ยนเป็น doc_root = /var/www/html/subdomain.example.com, ไฟล์ PHP ทำงานบนโดเมนย่อยของฉัน และ /var/www/htm ไฟล์อีกต่อไป
ฉันจะกำหนดค่า doc_root แบบไดนามิกสำหรับโดเมนย่อยเหล่านี้ใน PHP-FPM โดยไม่จำเป็นต้องมีเซิร์ฟเวอร์ทางกายภาพเฉพาะสำหรับแต่ละโดเมนย่อยได้อย่างไร
หมายเหตุ: นี่คือไฟล์กำหนดค่า Apache FPM ของฉัน:
conf-enabled/php7.4-fpm.conf
# เปลี่ยนเส้นทางไปที่ php-fpm ในเครื่องหากไม่มี mod_php
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# เปิดใช้งานส่วนหัวการให้สิทธิ์ http
<IfModule setenvif_module>
SetEnvIfNoCase ^การอนุญาต$ "(.+)" HTTP_AUTHORIZATION=$1
</หากโมดูล>
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch ".+\.phps$">
# ปฏิเสธการเข้าถึงแหล่ง php ดิบโดยค่าเริ่มต้น
# หากต้องการเปิดใช้งานอีกครั้ง ขอแนะนำให้เปิดใช้งานการเข้าถึงไฟล์
# เฉพาะในโฮสต์เสมือนหรือไดเรกทอรีเฉพาะ
ต้องการปฏิเสธทั้งหมด
</FilesMatch>
# ปฏิเสธการเข้าถึงไฟล์ที่ไม่มีชื่อไฟล์ (เช่น '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
ต้องการปฏิเสธทั้งหมด
</FilesMatch>
</หากโมดูล>
</หากโมดูล>