Score:0

วิธีกำหนดค่า Apache และ PHP-FPM ให้รองรับหลายโดเมนย่อย

ธง bf
Tom

ฉันมีเซิร์ฟเวอร์ 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>
</หากโมดูล>
</หากโมดูล>

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา