เมื่อเร็ว ๆ นี้ฉันได้เล่นกับการย้ายออกจากการบันทึกตามไฟล์ในเครื่องในแอป PHP เพื่อส่งข้อผิดพลาด PHP ผ่าน stdout ดังนั้นพวกเขาจึงส่งออกไปพร้อมกับบันทึกอื่น ๆ ในการตั้งค่านักเทียบท่า วิธีนี้ใช้ได้ดีหากคุณตั้งค่า บันทึกข้อผิดพลาด
ที่ตั้งไป /dev/stdout
จากนั้นฉันเห็นข้อผิดพลาดจาก PHP ผ่านบันทึกนักเทียบท่าหาง อย่างไรก็ตาม ข้อผิดพลาดเดียวกันนี้ยังปรากฏในคอนเทนเนอร์ nginx ดังด้านล่างผ่าน "FastCGI send in stderr":
นักเทียบท่า-compose-nginx-phpfpm-php-fpm-1 | ข้อสังเกต: ข้อความ PHP: ทดสอบ
นักเทียบท่า-compose-nginx-phpfpm-php-fpm-1 | 172.18.0.3 - 18/ม.ค./2022:20:00:20 +0000 "GET /index.php" 200
นักเทียบท่าเขียน nginx-phpfpm-web-1 | 2022/01/18 20:00:20 [ข้อผิดพลาด] 32#32: *18 FastCGI ส่งใน stderr: "ข้อความ PHP: ทดสอบ" ขณะอ่านส่วนหัวการตอบสนองจากอัปสตรีม ไคลเอนต์: 172.18.0.1 เซิร์ฟเวอร์: phpfpm.local คำขอ : "GET / HTTP/1.1", อัปสตรีม: "fastcgi://172.18.0.2:9000", โฮสต์: "localhost:8080"
เพื่อความชัดเจน:
บันทึกคอนเทนเนอร์ PHP
นักเทียบท่า-compose-nginx-phpfpm-php-fpm-1 | ข้อสังเกต: ข้อความ PHP: ทดสอบ
บันทึกคอนเทนเนอร์ Nginx
นักเทียบท่าเขียน nginx-phpfpm-web-1 | 2022/01/18 20:00:20 [ข้อผิดพลาด] 32#32: *18 FastCGI ส่งใน stderr: "ข้อความ PHP: ทดสอบ" ขณะอ่านส่วนหัวการตอบสนองจากอัปสตรีม ไคลเอนต์: 172.18.0.1 เซิร์ฟเวอร์: phpfpm.local คำขอ : "GET / HTTP/1.1", อัปสตรีม: "fastcgi://172.18.0.2:9000", โฮสต์: "localhost:8080"
เกิดอะไรขึ้นที่นี่? นี่เป็นพฤติกรรมที่คาดหวังหรือไม่
นี่เป็นผลลัพธ์ของการตั้งค่า php-fpm/nginx ขั้นพื้นฐานและเป็นมาตรฐานด้วย docker-compose.yml ดังนี้:
รุ่น: "3.9"
บริการ:
เว็บ:
ภาพ: nginx: ล่าสุด
พอร์ต:
- "8080:80"
ปริมาณ:
- ./src:/var/www/html
- ./default.conf:/etc/nginx/conf.d/default.conf
ลิงค์:
-php-fpm
php-fpm:
ภาพ: php:8-fpm
ปริมาณ:
- ./src:/var/www/html
default.conf เช่น:
เซิร์ฟเวอร์ {
ดัชนี index.php index.html;
server_name phpfpm.local;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
รูท /var/www/html;
ตำแหน่ง ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
รวม fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
และ index.php เช่น:
<?php
ini_set('display_errors', 'off');
ini_set('error_log', '/dev/stdout');
error_log('ทดสอบ');
ก้อง phpinfo();