Wednesday, November 11, 2026

อัพเดท security config apache + php container ด้วย docker compose โดยอัพเดทแบบ ใช้งานต่อได้ทันที

ประเด็นคือ จะเพิ่มคอนฟิกเรื่อง security ใน contianer ที่รันอยู่แล้วเป็น apache + php 7

โดย Codex แนะนำ

1. สร้างไฟล์ apache-security.conf ในโฟลเดอร์เดียวกับ docker-compose.yml:

ServerTokens Prod

ServerSignature Off

# เปลี่ยนข้อความสำหรับ URL ที่ไม่มีอยู่ โดยยังตอบ HTTP 404

ErrorDocument 404 "Not Found"

แต่ละค่าทำหน้าที่ดังนี้:

  • ServerTokens Prod ซ่อนเวอร์ชันและระบบปฏิบัติการใน response header เหลือเพียง Server: Apache
  • ServerSignature Off ลบบรรทัด Apache/2.X.YY (Distro Name) Server at ... ด้านล่างหน้า error
  • ErrorDocument 404 เปลี่ยนหน้า 404 ให้แสดงข้อความสั้น ๆ ตามที่กำหนด

อ้างอิง เอกสารการตั้งค่า Apache

2. เพิ่ม volume ใน service www_myweb โดยเก็บรายการเดิมไว้:

    volumes:

      - ./html:/var/www/html

      - ./php.ini:/usr/local/etc/php/php.ini

      - ./apache-security.conf:/etc/apache2/conf-enabled/zz-security.conf:ro

ชื่อ zz-security.conf ช่วยให้โหลดหลังไฟล์ security.conf ปกติของ Debian และ :ro กำหนดให้ container อ่านไฟล์ได้อย่างเดียว

3. ตรวจสอบและนำค่าไปใช้:

$ docker compose config --quiet

$ docker compose up -d --no-deps --force-recreate www_myweb

$ docker compose exec www_myweb apache2ctl -t

การ recreate จะทำให้เว็บหยุดช่วงสั้น ๆ ครับ หากตรวจสอบสำเร็จควรเห็น Syntax OK

เพิ่มเติมโดย deepseek


ทั้ง 3 คำสั่งนี้เป็น pattern ที่ใช้บ่อยสำหรับ ตรวจสอบและโหลด Apache config ใหม่ภายใน Docker Compose อย่างปลอดภัย มาดูทีละคำสั่งครับ
1. docker compose config --quiet
  • ตรวจสอบความถูกต้อง ของไฟล์ docker-compose.yml
  • --quiet = ไม่แสดงผลลัพธ์ออกมา จะ error (exit code ≠ 0) ก็ต่อเมื่อไฟล์ผิด เช่น YAML ผิดรูป, ตัวแปรไม่ได้ประกาศ, ไฟล์ที่อ้างใน env_file/configs หาไม่เจอ
  • ใช้เป็น pre-flight check ก่อนทำอะไรที่เสี่ยง
2. docker compose up -d --no-deps --force-recreate www_myweb
  • สั่งให้ service www_myweb ทำงาน แค่ตัวเดียว
  • -d = รันแบบ background (detached)
  • --no-deps = ไม่ต้องไป start service ที่มันพึ่งพา (เช่น db, redis)
  • --force-recreate = ลบ container เก่าแล้วสร้างใหม่ แม้จะไม่มีอะไรเปลี่ยน
  • ⚠️ หมายเหตุ: คำสั่งนี้ สร้าง container ใหม่ → config ที่เพิ่งแก้จะถูกโหลดใหม่ แต่ ข้อมูลที่เขียนใน writable layer จะหาย (ยกเว้น named volume)
3. docker compose exec www_myweb apache2ctl -t
  • รัน apache2ctl -t ข้างใน container ที่กำลังรันอยู่ เพื่อ ตรวจ syntax ของ Apache config
  • ถ้า httpd.conf/apache2.conf หรือ vhost มี syntax ผิด จะฟ้อง error ทันที
⚠️ ข้อควรระวัง: ตอนรันคำสั่งนี้ container ขึ้นมาแล้ว ถ้า config พังหนัก ๆ container อาจ crash-loop ทำให้ exec ฟ้อง "container is not running" → ดังนั้นใน workflow ที่ดีควร ตรวจ syntax ก่อน recreate

ลำดับที่แนะนำ (ปลอดภัยกว่า)
ลำดับปัจจุบันตรวจ หลัง recreate ซึ่งถ้า config ผิด เว็บจะล่มทันที Pattern ที่ปลอดภัยกว่าคือ:
# 1. ตรวจไฟล์ compose 
$ docker compose config --quiet
 # 2. ตรวจ syntax Apache ก่อน recreate 
$ docker compose exec www_myweb apache2ctl -t 
 # 3. ผ่านแล้วค่อย recreate 
$ docker compose up -d --no-deps --force-recreate www_myweb

No comments:

Post a Comment

Popular Posts