APM Field LabECV Operation · Technical Enablement RHEL · Apache · PHP-FPM
ทดสอบจริงแล้ว · Manual lab

Deploy. Trace.
Verify.

ติดตั้ง Datadog APM บน EC2 RHEL แบบทีละขั้น ตั้งแต่ Apache และ PHP-FPM ไปจนถึง trace แรกที่มองเห็นได้จริง

เริ่มจาก Pre-check RHEL 8/9 · Agent 7 · PHP 8.x
8 verified steps Learn at your pace
↗
Trace goalยืนยัน Traces received > 0
DATADOG APM · HANDS-ON

ทำตามทีละขั้นตอน

รันทีละ code block และเทียบ output ก่อนขยับไป Step ถัดไป ทุกตัวอย่างมาจากการทดสอบจริงบน RHEL 9.8

Terraform scope

lab/ สร้างเฉพาะ EC2 + encrypted volume + IAM/SSM ส่วน Apache, PHP-FPM, sample app และ Datadog ให้ทำตาม 8 ขั้นตอนด้านล่างด้วยตนเอง

เส้นทางที่ทดสอบผ่านแก้ 4 จุดก่อนเริ่ม เพื่อไม่ต้องย้อนแก้กลางแลป
01

Apache bindใช้คำสั่ง sed ที่ให้ไว้ตรง ๆ แล้วตรวจ Listen 127.0.0.1:80

02

SELinux ก่อนลง SSIติดตั้ง policy ใน Step 03 ขณะเครื่องยัง clean แล้วคง Enforcing ตั้งแต่ต้น

03

Trace ผ่าน TCPกำหนด DD_TRACE_AGENT_URL ทั้ง pool และ systemd เพื่อเลี่ยง UDS denial

04

รอ minute windowAgent status สรุป “previous minute” ถ้าดูเร็วเกินไปอาจยังเป็นศูนย์

อ่านตรงนี้ก่อนเริ่ม ถ้าไม่เคยใช้ Linux ก็ทำตามได้

เอกสารนี้ออกแบบให้ Copy → Paste → ตรวจผล ทีละกล่อง ไม่ต้องเดาคำสั่งเอง

1. รันทีละกล่อง

กด Copy เฉพาะกล่องสีเข้ม วางใน SSM Terminal แล้วกด Enter รอให้คำสั่งจบก่อนทำกล่องถัดไป

2. ไม่ต้องพิมพ์ prompt

ข้อความอย่าง [ec2-user@... ~]$ หรือ [root@... ~]# เป็นตัวบอกผู้ใช้ ไม่ใช่ส่วนหนึ่งของคำสั่ง

3. เช็ก “ผ่านเมื่อ” ทุกครั้ง

ถ้าผลไม่เหมือนที่ระบุ ให้หยุดที่ขั้นนั้น อย่าข้ามไป restart เพราะจะหาสาเหตุยากขึ้น

4. ระวังข้อมูลลับ

API key ในคำสั่ง Datadog เป็นความลับ ห้ามส่งในแชต ห้ามบันทึกลง Git และห้ามใส่ใน screenshot

sudo = รันคำสั่งด้วยสิทธิ์ผู้ดูแล service = โปรแกรมที่ทำงานเบื้องหลัง localhost = เครื่อง EC2 ตัวนี้เอง SELinux = ระบบควบคุมสิทธิ์ของ RHEL Agent = ตัวส่งข้อมูลจาก EC2 ไป Datadog SSI = การใส่ APM tracer ให้อัตโนมัติ trace = เส้นทางและเวลาของ request
|

ส่งผลลัพธ์จากคำสั่งด้านซ้ายให้คำสั่งด้านขวา เช่นส่งรายการ module ให้ grep ค้นต่อ

> /dev/null

ซ่อน output ที่ไม่จำเป็น ไม่ได้แปลว่าคำสั่งไม่ทำงาน ให้ดู checkpoint หลังกล่องแทน

&&

รันคำสั่งถัดไปเมื่อคำสั่งก่อนหน้าสำเร็จ ใช้ป้องกันไม่ให้ขั้นหลังทำงานต่อเมื่อขั้นแรกผิดพลาด

||

รันคำสั่งด้านขวาเมื่อด้านซ้ายไม่สำเร็จ คู่มือนี้ใช้เพื่อ “เพิ่มถ้ายังไม่มี หรือแก้ถ้ามีแล้ว”

<<'EOF'

เริ่มวางข้อความหลายบรรทัดลงไฟล์ ต้องมี EOF ปิดท้ายอยู่เดี่ยว ๆ ห้ามมีช่องว่างนำหน้า

systemctl

start เปิด, restart ปิดแล้วเปิดใหม่, reload อ่าน config ใหม่ และ is-active ตรวจสถานะ

01
STEP 01

Pre-check เครื่อง RHEL

3 min

รันทีละคำสั่งจาก prompt ของ ec2-user และหยุดทันทีถ้าผลไม่ตรงกับเงื่อนไขผ่าน

ก่อนเริ่ม

เข้า EC2 ผ่าน SSM Terminal และเห็น prompt ลงท้ายด้วย $ ไม่ต้องเปลี่ยนเป็น root

สิ่งที่จะเปลี่ยน

ไม่มี ทุกคำสั่งใน Step นี้อ่านข้อมูลอย่างเดียว ไม่ติดตั้ง package และไม่ restart service

จบขั้นนี้แล้ว

ต้องทราบ OS, CPU, สถานะ SSM และยืนยันว่าเครื่องออก HTTPS ไป Datadog ได้

1.1 ตรวจระบบปฏิบัติการ

ทำอะไร: อ่านชื่อและเวอร์ชันของ Linux จากไฟล์ระบบ เพื่อยืนยันว่าเครื่องนี้เป็น RHEL รุ่นที่คู่มือรองรับ คำสั่งนี้อ่านอย่างเดียวและไม่แก้เครื่อง

bash · OS
cat /etc/redhat-release
✓

ผ่านเมื่อ เป็น Red Hat Enterprise Linux 8 หรือ 9

1.2 ตรวจสถาปัตยกรรมเครื่อง

ทำอะไร: แสดงชนิด CPU ของ EC2 เพื่อให้แน่ใจว่า package ที่ installer เลือกตรงกับเครื่อง

bash · architecture
uname -m
✓

ผ่านเมื่อ แสดง x86_64 ตาม environment ที่ทดสอบ

1.3 ตรวจ SSM Agent

ทำอะไร: ตรวจว่าโปรแกรมที่ใช้เปิด Terminal ผ่าน AWS Systems Manager ยังทำงานอยู่ ถ้าไม่ active session อาจหลุดระหว่างทำแลป

bash · SSM
systemctl is-active amazon-ssm-agent
✓

ผ่านเมื่อ แสดง active

1.4 ตรวจ outbound HTTPS ไป Datadog

ทำอะไร: ทดลองเชื่อมต่อจาก EC2 ไปเว็บไซต์ Datadog ผ่าน HTTPS โดยขอเฉพาะ header ถ้า timeout ให้ตรวจ route, NAT, proxy หรือ security controls ก่อนติดตั้ง

bash · network
curl -fsSI --max-time 10 https://app.datadoghq.com | head -1
✓

ผ่านเมื่อ ได้ HTTP response และคำสั่งไม่ timeout

02
STEP 02

ติดตั้ง Apache และ PHP-FPM

8 min

ติดตั้ง runtime, bind Apache เฉพาะ localhost แล้วตรวจ syntax ก่อนเปิด service

ก่อนเริ่ม

Step 01 ต้องผ่านและ SSM session ต้องไม่หลุด คำสั่งติดตั้งต้องออก Internet ไป RHEL repository ได้

สิ่งที่จะเปลี่ยน

ติดตั้ง RPM, แก้ /etc/httpd/conf/httpd.conf และ enable php-fpm กับ httpd

จบขั้นนี้แล้ว

Apache ต้องรับเฉพาะ 127.0.0.1:80, FastCGI ชี้ socket ถูกตัว และทั้งสอง service ต้อง active

2.1 ติดตั้ง package

ทำอะไร: ใช้ dnf ติดตั้ง Apache (httpd), PHP, PHP-FPM และ curl จาก repository ของ RHEL ตัวเลือก -y ตอบยืนยันการติดตั้งให้อัตโนมัติ

bash · packages
sudo dnf install -y httpd php php-fpm php-cli curl
✓

ผ่านเมื่อ จบด้วย Complete!

2.2 ให้ Apache รับ request เฉพาะ localhost

ทำอะไร: เปลี่ยน Apache จากการฟังทุก network interface เป็น 127.0.0.1:80 เพื่อให้แลปนี้เข้าถึงเว็บได้จากภายใน EC2 เท่านั้น จากนั้นใช้ grep อ่านค่ากลับมาตรวจ

bash · Apache listen
sudo sed -i -E 's/^[[:space:]]*Listen[[:space:]]+80$/Listen 127.0.0.1:80/' /etc/httpd/conf/httpd.conf
bash · verify listen
grep '^Listen' /etc/httpd/conf/httpd.conf
✓

ผ่านเมื่อ แสดง Listen 127.0.0.1:80

2.3 ยืนยันว่า Apache เชื่อม PHP-FPM

ทำอะไร: ตรวจสามชิ้นที่ต้องตรงกันก่อนเปิด service: Apache มี handler สำหรับไฟล์ PHP, PHP-FPM ฟังที่ socket เดียวกัน และ Apache โหลด module FastCGI ครบ ถ้าขาดข้อใดข้อหนึ่ง ไฟล์ .php จะไม่ถูกประมวลผล

bash · Apache PHP handler
sudo grep -nE 'SetHandler.*proxy:unix:/run/php-fpm/www.sock|ProxyPassMatch.*fcgi://' /etc/httpd/conf.d/php.conf
bash · PHP-FPM socket
sudo grep -nE '^[[:space:]]*listen[[:space:]]*=' /etc/php-fpm.d/www.conf
bash · FastCGI modules
sudo httpd -M | grep -E 'proxy_module|proxy_fcgi_module'
✓

ผ่านเมื่อ Apache handler และ PHP-FPM แสดง /run/php-fpm/www.sock เดียวกัน และพบ module ทั้งสองรายการ

ตัวอย่าง output ที่ผ่าน · เลขบรรทัดอาจต่างกัน
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
listen = /run/php-fpm/www.sock
 proxy_module (shared)
 proxy_fcgi_module (shared)

2.4 ตรวจ syntax ก่อน start

ทำอะไร: ให้ Apache และ PHP-FPM อ่าน configuration เพื่อตรวจคำผิดโดยยังไม่เปิด service ถ้าขั้นนี้ไม่ผ่าน ห้าม start service

bash · Apache config
sudo apachectl configtest
bash · PHP-FPM config
sudo php-fpm -t
✓

ผ่านเมื่อ ได้ Syntax OK และ PHP-FPM configuration test successful

2.5 เปิด PHP-FPM แล้วเปิด Apache

ทำอะไร: enable ทำให้ service เปิดอัตโนมัติหลัง reboot ส่วน --now เปิด service ทันที เราเปิด PHP-FPM ก่อนเพราะ Apache ต้องส่งงาน PHP ไปให้มัน

bash · PHP-FPM
sudo systemctl enable --now php-fpm
bash · Apache
sudo systemctl enable --now httpd
bash · verify services
systemctl is-active php-fpm
systemctl is-active httpd
✓

ผ่านเมื่อ แสดง active สองบรรทัด

2.6 ตรวจ socket ที่ใช้งานจริง

ทำอะไร: ตรวจว่า PHP-FPM สร้าง Unix socket หลังเปิด service แล้วจริง รวมถึงแสดง owner, permission และ SELinux context ที่ Apache ต้องใช้เชื่อมต่อ

bash · live PHP-FPM socket
sudo ls -lZ /run/php-fpm/www.sock
✓

ผ่านเมื่อ พบไฟล์ชนิด socket ที่ /run/php-fpm/www.sock และคำสั่งไม่ขึ้น No such file

03
STEP 03

เตรียม SELinux policy ก่อน SSI

8 min
ต้องทำก่อนติดตั้ง Datadog SSI

คง SELinux เป็น Enforcing ห้ามใช้ setenforce 0 และห้ามสร้าง policy กว้างด้วย audit2allow

ก่อนเริ่ม

Apache และ PHP-FPM จาก Step 02 ต้อง active และยังไม่ติดตั้ง SSI เพื่อไม่ให้ PHP-FPM โหลด sidecar ก่อน policy พร้อม

สิ่งที่จะเปลี่ยน

สร้างไฟล์ชั่วคราวใน /tmp, ติดตั้ง SELinux module ชื่อ datadog_php_sidecar และ label TCP 8126

จบขั้นนี้แล้ว

getenforce ยังต้องเป็น Enforcing พร้อมพบ module และ port type เฉพาะของ Datadog

3.1 ติดตั้งเครื่องมือ SELinux

ทำอะไร: ติดตั้งเครื่องมือที่ใช้สร้าง ตรวจ และลง policy ของ SELinux โดยยังไม่เปลี่ยนโหมด Enforcing และยังไม่ restart service ใด ๆ

bash · SELinux tools
sudo dnf install -y policycoreutils-python-utils checkpolicy policycoreutils-devel

3.2 สร้างไฟล์ policy

ทำอะไร: สร้างกฎเฉพาะให้ PHP-FPM เรียก Datadog launcher และเชื่อมต่อ Agent ที่ TCP 8126 ได้ โดยไม่เปิดสิทธิ์เกินความจำเป็น กด Copy แล้วรันทั้งก้อน บรรทัด EOF สุดท้ายต้องอยู่เดี่ยว ๆ

bash · policy source
sudo tee /tmp/datadog_php_sidecar.te >/dev/null <<'EOF'
module datadog_php_sidecar 1.2;

require {
    type httpd_t;
    type httpd_tmpfs_t;
    type ld_so_t;
    attribute port_type;
    class file { execute execute_no_trans };
    class tcp_socket name_connect;
}

type datadog_apm_port_t;
typeattribute datadog_apm_port_t port_type;

allow httpd_t httpd_tmpfs_t:file { execute execute_no_trans };
allow httpd_t ld_so_t:file execute_no_trans;
allow httpd_t datadog_apm_port_t:tcp_socket name_connect;
EOF
bash · verify file
sudo test -s /tmp/datadog_php_sidecar.te && echo 'Policy source: ready'

3.3 Compile policy

ทำอะไร: แปลงไฟล์ข้อความ .te เป็น module .mod แล้วบรรจุเป็นไฟล์ .pp ที่ SELinux ติดตั้งได้ ขั้นนี้ยังไม่เปิดใช้ policy

bash · checkmodule
sudo checkmodule -M -m -o /tmp/datadog_php_sidecar.mod /tmp/datadog_php_sidecar.te
bash · semodule package
sudo semodule_package -o /tmp/datadog_php_sidecar.pp -m /tmp/datadog_php_sidecar.mod

3.4 ติดตั้ง policy และกำหนด TCP 8126

ทำอะไร: ติดตั้ง module ที่เพิ่งสร้างและติดป้ายพอร์ต 8126 ว่าเป็นพอร์ต Datadog APM ถ้าป้ายมีอยู่แล้ว คำสั่งด้านล่างจะอัปเดตแทน จึงรันซ้ำได้

bash · install module
sudo semodule -i /tmp/datadog_php_sidecar.pp
bash · label port
sudo semanage port -a -t datadog_apm_port_t -p tcp 8126 2>/dev/null || sudo semanage port -m -t datadog_apm_port_t -p tcp 8126

3.5 ตรวจผล

ทำอะไร: ตรวจสามอย่างก่อนติดตั้ง SSI: SELinux ยังป้องกันเครื่องอยู่, module ถูกติดตั้งแล้ว และพอร์ต 8126 มีป้ายถูกต้อง

bash · SELinux mode
getenforce
bash · installed module
sudo semodule -l | grep '^datadog_php_sidecar'
bash · port label
sudo semanage port -l | grep 'datadog_apm_port_t.*8126'
✓

ผ่านเมื่อ ได้ Enforcing, พบ module และพบ TCP 8126

  • checkmodule และ semodule_package ไม่มี output: ถือว่าปกติเมื่อคำสั่งจบแล้ว prompt กลับมาและไม่มีคำว่า error
  • semodule -i ไม่มี output: ถือว่าติดตั้งสำเร็จ ให้ใช้ semodule -l เป็นหลักฐานยืนยัน
  • ถ้าไม่พบ TCP 8126: หยุดก่อน อย่าไป Step 05 เพราะ tracer จะถูก SELinux ปฏิเสธการเชื่อมต่อ Agent
04
STEP 04

สร้างและทดสอบ PHP endpoint

5 min
ก่อนเริ่ม

Step 02 และ Step 03 ต้องผ่าน โดยเฉพาะ FastCGI socket และ Apache/PHP-FPM syntax tests

สิ่งที่จะเปลี่ยน

เขียนทับ /var/www/html/index.php ด้วย sample app สำหรับแลป และคืน SELinux context ของ web root

จบขั้นนี้แล้ว

curl ต้องได้ JSON ไม่ใช่ PHP source, HTML error, 403, 404, 503 หรือ timeout

4.1 สร้างไฟล์แอป

ทำอะไร: สร้างหน้า PHP ตัวอย่างที่ตอบกลับเป็น JSON เพื่อใช้พิสูจน์ว่าเว็บทำงานและสร้าง trace ได้ คำสั่งนี้จะเขียนทับ /var/www/html/index.php จึงควรใช้กับเครื่องแลปตามคู่มือนี้เท่านั้น

bash · /var/www/html/index.php
sudo tee /var/www/html/index.php >/dev/null <<'PHP'
<?php
header('Content-Type: application/json');

function loadCatalog(): array {
    usleep(random_int(15000, 45000));
    return ['agent', 'apm', 'integration'];
}

$started = microtime(true);
$items = loadCatalog();
usleep(random_int(5000, 20000));

echo json_encode([
    'service' => 'customer-demo-php',
    'status' => 'ok',
    'items' => $items,
    'duration_ms' => round((microtime(true) - $started) * 1000, 2)
], JSON_PRETTY_PRINT);
PHP

4.2 คืนค่า SELinux context

ทำอะไร: ให้ SELinux ใส่ป้ายสิทธิ์มาตรฐานของโฟลเดอร์เว็บกลับให้ไฟล์ใหม่ ถ้าไม่มีข้อความแสดงออกมาไม่ได้แปลว่า error แต่หมายถึงป้ายถูกต้องอยู่แล้ว

bash · restore context
sudo restorecon -Rv /var/www/html
ไม่มี output ถือว่าปกติ: หมายถึง context ของไฟล์ถูกต้องอยู่แล้ว

4.3 ตรวจ PHP syntax

ทำอะไร: ให้ PHP ตรวจรูปแบบไฟล์โดยยังไม่เรียกผ่านเว็บ เพื่อจับวงเล็บหรือเครื่องหมายที่พิมพ์ผิดก่อนทดสอบจริง

bash · PHP lint
php -l /var/www/html/index.php
✓

ผ่านเมื่อ แสดง No syntax errors detected

4.4 ยิง request ก่อนติดตั้ง SSI

ทำอะไร: เรียกหน้าเว็บจาก EC2 เครื่องเดียวกันเพื่อสร้างค่าตั้งต้น ถ้าขั้นนี้ไม่ผ่าน ปัญหาเป็นฝั่ง Apache/PHP ไม่ใช่ Datadog

bash · request
curl -fsS --max-time 10 http://127.0.0.1/index.php
✓

ผ่านเมื่อ ได้ JSON ที่มี "status": "ok"

นี่คือจุดยืนยัน Apache → PHP-FPM: ถ้าได้ JSON แปลว่า Apache รับ HTTP request, ส่งไฟล์ .php ผ่าน FastCGI socket และ PHP-FPM ประมวลผลสำเร็จ ห้ามติดตั้ง Datadog จนกว่าจุดนี้จะผ่าน
ตัวอย่าง response ที่ผ่าน
{
    "service": "customer-demo-php",
    "status": "ok",
    "items": ["agent", "apm", "integration"],
    "duration_ms": 31.42
}
หยุดทันทีถ้าเห็นแบบนี้
<?php ...       = Apache ส่ง PHP source ออกมา ไม่ได้ผ่าน PHP-FPM
403 Forbidden   = permission หรือ SELinux context ไม่ถูกต้อง
503 / timeout   = Apache ติดต่อ PHP-FPM socket ไม่ได้
Connection refused = Apache ยังไม่ active หรือไม่ได้ฟัง 127.0.0.1:80
06
STEP 06

ตั้งค่า PHP APM แบบไม่ใช้ vi

6 min

ขั้นนี้เตรียม configuration เท่านั้น ยังไม่ restart service จนกว่าจะตรวจทุก guard ผ่าน

ก่อนเริ่ม

Agent และ SSI files ต้องผ่าน Step 05 แต่ยังไม่ restart PHP-FPM เพื่อให้แก้ config และตรวจทั้งหมดก่อน

สิ่งที่จะเปลี่ยน

สำรองและเพิ่มตัวแปรใน www.conf พร้อมสร้าง systemd drop-in สำหรับ TCP trace endpoint

จบขั้นนี้แล้ว

Unified Service Tags, endpoint, SELinux guards และ syntax tests ต้องครบ โดย service ยังไม่ถูก restart ใน Step นี้

6.1 สำรอง PHP-FPM config หนึ่งครั้ง

ทำอะไร: คัดลอก config เดิมเก็บเป็น www.conf.before-datadog สำหรับย้อนกลับหากจำเป็น ถ้าไฟล์สำรองมีอยู่แล้วจะไม่เขียนทับ

bash · backup
sudo test -e /etc/php-fpm.d/www.conf.before-datadog || sudo cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.before-datadog

6.2 ลบค่า Datadog เดิมเพื่อให้รันซ้ำได้

ทำอะไร: ลบเฉพาะบล็อกและตัวแปร Datadog ที่คู่มือนี้จัดการ ป้องกันค่าซ้ำเมื่อกลับมารันขั้นตอนใหม่ โดยไม่แตะค่า PHP-FPM ส่วนอื่น

bash · remove old managed values
sudo sed -i -E '/^; BEGIN DATADOG APM$/,/^; END DATADOG APM$/d; /^[[:space:]]*env\[(DD_SERVICE|DD_ENV|DD_VERSION|DD_TRACE_ENABLED|DD_LOGS_INJECTION|DD_TRACE_AGENT_URL)\][[:space:]]*=/d' /etc/php-fpm.d/www.conf

6.3 เพิ่ม Unified Service Tags และ TCP endpoint

ทำอะไร: ตั้งชื่อ service, environment และ version ที่จะเห็นใน Datadog พร้อมบอก tracer ให้ส่งข้อมูลไป Agent ในเครื่องเดียวกันที่ 127.0.0.1:8126

bash · append PHP-FPM values
sudo tee -a /etc/php-fpm.d/www.conf >/dev/null <<'EOF'

; BEGIN DATADOG APM
env[DD_SERVICE] = customer-demo-php
env[DD_ENV] = dev
env[DD_VERSION] = 1.0.0
env[DD_TRACE_ENABLED] = true
env[DD_LOGS_INJECTION] = true
env[DD_TRACE_AGENT_URL] = http://127.0.0.1:8126
; END DATADOG APM
EOF
  • DD_SERVICE: ชื่อ application ที่ใช้ค้นหาใน APM — คู่มือนี้ใช้ customer-demo-php
  • DD_ENV: environment ของ service เช่น dev, staging หรือ prod
  • DD_VERSION: เวอร์ชันที่ผูก trace กับ deployment — ตัวอย่างใช้ 1.0.0
  • DD_TRACE_AGENT_URL: บังคับส่ง trace ผ่าน TCP localhost 8126 แทนการเดา Unix socket ซึ่งช่วยให้ policy ชัดเจน

6.4 สร้าง systemd drop-in

ทำอะไร: สร้างไฟล์เสริมของ systemd เพื่อย้ำ endpoint ให้ process หลักของ PHP-FPM เห็น โดยไม่แก้ไฟล์ service ต้นฉบับของระบบ

bash · PHP-FPM service environment
sudo install -d -m 755 /etc/systemd/system/php-fpm.service.d
sudo tee /etc/systemd/system/php-fpm.service.d/datadog-apm.conf >/dev/null <<'EOF'
[Service]
Environment="DD_TRACE_AGENT_URL=http://127.0.0.1:8126"
EOF

6.5 ตรวจ SELinux guard ก่อน restart

ทำอะไร: ตรวจเงื่อนไขความปลอดภัยจาก Step 03 ซ้ำ ถ้าคำสั่งใดไม่แสดงผลตามที่คาด ให้หยุดและอย่า restart

bash · enforcing
test "$(getenforce)" = "Enforcing" && echo 'SELinux: Enforcing'
bash · policy module
sudo semodule -l | grep '^datadog_php_sidecar'
bash · TCP 8126 label
sudo semanage port -l | grep 'datadog_apm_port_t.*8126'

6.6 ตรวจ syntax โดยยังไม่ restart

ทำอะไร: ให้ทั้ง PHP-FPM และ Apache ทดลองอ่าน config ใหม่ก่อนใช้งานจริง การตรวจนี้ไม่ตัดการเชื่อมต่อของเว็บ

bash · PHP-FPM test
sudo php-fpm -t
bash · Apache test
sudo apachectl configtest
✓

ผ่านเมื่อ SELinux guard ครบและ syntax test ของทั้งสอง service ผ่าน

08
STEP 08 · METRICS

เปิด Apache และ PHP-FPM Integrations

10 min
ทำหลัง APM ผ่านแล้ว

APM traces กับ infrastructure metrics เป็นคนละส่วน ขั้นนี้เพิ่ม metrics ของ Apache workers และ PHP-FPM pool โดยไม่เปลี่ยน tracer ที่ตรวจผ่านใน Step 07

ก่อนเริ่ม

Step 07 ต้องผ่านครบแล้ว โดยเฉพาะ app JSON, Agent health และ APM trace counters

สิ่งที่จะเปลี่ยน

เพิ่ม localhost-only status endpoints และสร้าง Agent configs ใน apache.d กับ php_fpm.d

จบขั้นนี้แล้ว

ทั้งสอง status URLs ต้องตอบได้ และ datadog-agent check apache/php_fpm ต้องเป็น [OK]

8.1 เปิด Apache status เฉพาะ localhost

ทำอะไร: ตรวจว่า Apache มี mod_status แล้วสร้าง endpoint /server-status ที่อนุญาตเฉพาะ request จากเครื่องเดียวกัน Datadog Agent จึงอ่าน metrics ได้โดยไม่เปิดเผยออกสู่ network

bash · mod_status
sudo httpd -M | grep status_module
bash · Apache status endpoint
sudo tee /etc/httpd/conf.d/datadog-status.conf >/dev/null <<'EOF'
<Location "/server-status">
    SetHandler server-status
    Require local
</Location>

ExtendedStatus On
EOF

8.2 ตรวจแล้ว reload Apache

ทำอะไร: ตรวจ syntax ก่อน จากนั้นใช้ reload เพื่ออ่าน config ใหม่โดยกระทบ request น้อยกว่า restart แล้วเรียก endpoint เพื่อยืนยันผล

bash · validate and reload
sudo apachectl configtest
sudo systemctl reload httpd
bash · Apache metrics test
curl -fsS --max-time 10 'http://127.0.0.1/server-status?auto' | head
✓

ผ่านเมื่อ ได้ Syntax OK และผลลัพธ์มีข้อมูลอย่าง ServerVersion, BusyWorkers หรือ IdleWorkers

ตัวอย่าง Apache status แบบย่อ
ServerVersion: Apache/2.4.x
ServerUptimeSeconds: ...
BusyWorkers: ...
IdleWorkers: ...

8.3 ตั้งค่า Datadog Apache Integration

ทำอะไร: บอก Agent ว่าต้องอ่าน Apache metrics จาก URL ไหน ใช้ 127.0.0.1 เพื่อให้ traffic ไม่ออกจาก EC2

bash · apache.d/conf.yaml
sudo install -d -m 755 /etc/datadog-agent/conf.d/apache.d
sudo tee /etc/datadog-agent/conf.d/apache.d/conf.yaml >/dev/null <<'EOF'
init_config:

instances:
  - apache_status_url: http://127.0.0.1/server-status?auto
    service: customer-demo-php
EOF

8.4 เปิด PHP-FPM status path แบบรันซ้ำได้

ทำอะไร: สำรอง pool config แล้วกำหนด /fpm-status สำหรับอ่านจำนวน process, queue และ connection คำสั่งจะลบบล็อกที่คู่มือนี้เคยสร้างก่อนเพิ่มใหม่ จึงไม่เกิดค่าซ้ำ

bash · PHP-FPM status config
sudo test -e /etc/php-fpm.d/www.conf.before-datadog-metrics || sudo cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.before-datadog-metrics
sudo sed -i -E '/^; BEGIN DATADOG PHP-FPM METRICS$/,/^; END DATADOG PHP-FPM METRICS$/d; /^[;[:space:]]*pm\.status_path[[:space:]]*=/d' /etc/php-fpm.d/www.conf
sudo tee -a /etc/php-fpm.d/www.conf >/dev/null <<'EOF'

; BEGIN DATADOG PHP-FPM METRICS
pm.status_path = /fpm-status
; END DATADOG PHP-FPM METRICS
EOF

8.5 ให้ Apache ส่ง status request เข้า PHP-FPM

ทำอะไร: สร้าง FastCGI pass-through จาก /fpm-status ไปยัง Unix socket เดียวกับแอป และจำกัดให้เรียกได้เฉพาะ localhost ตามตัวอย่างของ PHP

bash · PHP-FPM status route
sudo tee /etc/httpd/conf.d/datadog-php-fpm-status.conf >/dev/null <<'EOF'
<LocationMatch "^/fpm-status$">
    Require local
    ProxyPass "unix:/run/php-fpm/www.sock|fcgi://localhost/"
</LocationMatch>
EOF

8.6 ตรวจ config แล้วเปิด status endpoint

ทำอะไร: ตรวจทั้งสอง config ก่อน restart PHP-FPM เพื่อใช้ status path ใหม่ แล้ว reload Apache และทดสอบ endpoint จริง

bash · syntax guards
sudo php-fpm -t
sudo apachectl configtest
bash · activate status path
sudo systemctl restart php-fpm
sudo systemctl reload httpd
bash · PHP-FPM metrics test
curl -fsS --max-time 10 http://127.0.0.1/fpm-status
✓

ผ่านเมื่อ ได้ข้อมูล pool: www, active processes, idle processes และ total processes

ตัวอย่าง PHP-FPM status แบบย่อ
pool:                 www
process manager:      dynamic
accepted conn:        ...
idle processes:       ...
active processes:     ...
total processes:      ...

8.7 ตั้งค่า Agent แล้วทดสอบ integrations

ทำอะไร: เพิ่ม URL ของ PHP-FPM ให้ Agent, restart Agent หนึ่งครั้งเพื่อโหลด integration ทั้งสอง แล้วสั่งตรวจทีละตัวเพื่อแยก error ได้ชัดเจน

bash · php_fpm.d/conf.yaml
sudo install -d -m 755 /etc/datadog-agent/conf.d/php_fpm.d
sudo tee /etc/datadog-agent/conf.d/php_fpm.d/conf.yaml >/dev/null <<'EOF'
init_config:

instances:
  - status_url: http://127.0.0.1/fpm-status
    service: customer-demo-php
EOF
bash · reload Agent integrations
sudo systemctl restart datadog-agent
bash · Apache check
sudo datadog-agent check apache
bash · PHP-FPM check
sudo datadog-agent check php_fpm
✓

เสร็จเมื่อ ทั้ง apache และ php_fpm แสดงหนึ่ง instance เป็น [OK] และ service check status เป็น 0

  • Apache check เป็น 403: ตรวจว่า Agent เรียก 127.0.0.1 และ Apache location ใช้ Require local
  • PHP-FPM check เป็น 404: ตรวจ pm.status_path = /fpm-status และชื่อ path ใน Apache/Agent ให้ตรงกันทุกจุด
  • PHP-FPM check เป็น 503: ตรวจว่า /run/php-fpm/www.sock มีอยู่, PHP-FPM active และ Apache config ชี้ socket ถูกตัว
  • check ผ่านแต่ Dashboard ยังไม่เห็น: รอรอบส่ง metrics แล้วตรวจ tags service:customer-demo-php ก่อนแก้ config เพิ่ม
Final check: รัน systemctl is-active datadog-agent php-fpm httpd, curl -fsS http://127.0.0.1/index.php และ sudo datadog-agent health อีกครั้ง ทั้งสาม service ต้อง active, แอปต้องตอบ JSON และ health ต้อง PASS
05 · RECOVERY

Troubleshooting map

เริ่มจาก symptom แล้วไล่ตรวจจุดที่ใกล้ที่สุดก่อน

01Agent ทำงาน แต่ไม่มี trace+

ตรวจ endpoint ที่ tracer เห็น, restart PHP-FPM หลังติดตั้ง SSI และยิง request เข้า PHP จริง จากนั้นรอให้ Agent เปลี่ยน previous-minute window

sudo systemctl show -p Environment php-fpm
php-fpm -i | grep -iE 'ddtrace|datadog|dd_library_loader'
curl -fsS http://127.0.0.1/index.php
sudo datadog-agent status
02Apache check เชื่อมต่อไม่ได้+

ทดสอบ URL เดียวกับใน config และยืนยันว่า Require local อนุญาต localhost

curl -v 'http://127.0.0.1/server-status?auto'
sudo apachectl -M | grep status
sudo journalctl -u httpd -n 50 --no-pager
03PHP-FPM status ได้ 404 / 503+

ตรวจ socket จาก directive listen, module proxy_fcgi และ syntax ของทั้งสอง service

sudo grep -E '^listen|^pm.status_path|^ping.path' /etc/php-fpm.d/www.conf
sudo apachectl -M | grep proxy_fcgi
sudo ls -l /run/php-fpm/www.sock
04PHP-FPM timeout / AppSec sidecar crash บน SELinux+

อาการที่พบจริงคือ Apache AH01075, PHP-FPM worker SIGABRT และ AVC execute_no_trans บน dynamic linker ให้ย้อนตรวจ policy ที่ติดตั้งไว้ใน Step 03 โดยคง SELinux เป็น Enforcing และส่ง trace ผ่าน port type เฉพาะ 8126

getenforce
sudo ausearch -m AVC -ts recent | tail -30
sudo semodule -l | grep datadog_php_sidecar
sudo semanage port -l | grep datadog_apm_port_t
sudo systemctl restart php-fpm
curl -fsS http://127.0.0.1/index.php

SSI อาจยัง log AVC แบบ getattr ตอน probe Unix socket หรือ cgroup แม้ TCP trace ใช้งานได้ ให้พิจารณาผล request และ APM counters ร่วมกัน และอย่าอนุญาตทุก AVC ด้วย policy กว้างโดยไม่ review

05ต้องเก็บ log เพิ่มเพื่อส่ง Support+

สร้าง flare หลัง reproduce ปัญหา โดยตรวจข้อมูลลับก่อน upload ทุกครั้ง

sudo datadog-agent flare
sudo journalctl -u datadog-agent -n 100 --no-pager
sudo tail -100 /var/log/php-fpm/error.log
คัดลอกแล้ว