Thursday, September 24, 2026

Ubuntu ดู package version ก่อนจะ apt install

  • ประเด็นคือจะติดตั้ง mysql-server แต่อยากได้ version 8 ไม่แน่จะ
  • จะตรวจสอบสิ่งที่เรากำลังจะติดตั้งอย่างไร

$ apt-cache policy <package_name>

Exam

$ apt-cache policy mysql-server

mysql-server:

  Installed: (none)

  Candidate: 8.0.46-0ubuntu0.24.04.4

  Version table:

     8.0.46-0ubuntu0.24.04.4 500

        500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages

        500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages

     8.0.36-2ubuntu3 500

        500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages

$ apt-cache policy mysql-server-8.0 

mysql-server-8.0:

  Installed: (none)

  Candidate: 8.0.46-0ubuntu0.24.04.4

  Version table:

     8.0.46-0ubuntu0.24.04.4 500

        500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages

        500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages

     8.0.36-2ubuntu3 500

        500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages


Friday, September 18, 2026

ตรวจสอบความถูกต้องของไวยากรณ์ (Syntax Check) nginx apache

Nginx

$ sudo nginx -t

Aapche

Ubuntu 

$ sudo apache2ctl -t

CentOS

$ sudo apachectl -t

หรือ

$ sudo httpd -t


MySQL

$ sudo mysqld --validate-config


วิธีดูผลลัพธ์:

  • ถ้าคอนฟิกถูกต้อง 100%: คำสั่งจะทำงานเสร็จเงียบๆ โดยไม่แสดงข้อความใดๆ (Exit code = 0)

  • ถ้ามีข้อผิดพลาด (Syntax Error / พารามิเตอร์ผิด): จะแสดงข้อความ [ERROR] ขึ้นมาทันที พร้อมระบุบรรทัดและไฟล์ที่มีปัญหา เช่น:

    Plaintext
    [ERROR] [MY-000067] [Server] unknown variable 'innodb_log_file_size=2G # ควรเป็น...'

Wednesday, September 16, 2026

Run and kill process python with crontab Ubuntu 22.04

 # Job 1: ทำงานทุกวันเวลา 07:00 น. (Kill โพรเซสเดิมถ้ามี แล้วสั่งรันใหม่)

0 7 * * * pkill -f host_watcher.py; sleep 2; /usr/bin/python3 /home/user1/py_app1.py > /dev/null 2>&1 &

# Job 2: ทำงานทุกวันเวลา 21:00 น. (Kill โพรเซสทิ้ง)

0 21 * * * pkill -f py_app1.py

  • ตรวจสอบว่าโพรเซสรันอยู่หรือไม่:

$ pgrep -fl py_app1.py

  • ทดสอบสั่ง Kill ด้วยตนเอง:

$ pkill -f py_app1.py

Friday, September 4, 2026

ปัญหาเรื่อง Your connection is not private Nginx SSL HTTPS ในระบบ หน่วยงาน

  • ส่วนมากเข้าได้ปกติ แต่บางครั้งขึ้นแบบนี้ คับ ก็เข้าใจว่าโดน MITM
  • แต่เข้าไปดู cer info ก็ถูกต้องปกตินิ

Your connection is not private

Attackers might be trying to steal your information from domain.com (for example, passwords, messages, or credit cards). Learn more about this warning
  • ถาม GPT เค้าแนะนำประมาณให้ทำ fullchain.crt
  • เราทำ nginx และ  reverse proxy เข้าไปอีกที
  • ตั้ง SSL ที่ nginx นี่แหละ linux ด้วย
  • ได้ไฟล์สำหรับคอนฟิก ssl มา 3 ไฟล์
DigiCertCA.crt
wildcard_mydomain.crt
wildcard_mydomain.key
อาการนี้มีความเป็นไปได้สูงว่า Nginx ส่ง certificate chain ไม่ครบ ครับ โดยเฉพาะจากข้อมูลที่บอกว่า ได้ 3 ไฟล์ และตอนนี้ Nginx ใช้เฉพาะ wildcard_mydomain.crt ซึ่งอาจเป็นแค่ server certificate ไม่รวม DigiCert intermediate certificate

จุดสำคัญคือไฟล์เหล่านี้:

wildcard_mydomain.crt       ← Certificate ของเว็บ
wildcard_mydomain.key       ← Private key
DigiCertCA.crt             ← Intermediate CA
  • คุณ GPT ให้ทำ
$ sudo cat DigiCertCA.crt wildcard_mydomain.crt > wildcard_mydomain-fullchain.crt
  • แล้วใช้ config ไฟล์นี้แทน
  • จากนั้นก็ reload config file
$ sudo systemctl reload nginx
  • ระบบยังทำงานได้ปกติ รอด รอดูยาวๆ จะเป็นอีกมั้ย

ssl_certificate /etc/letsencrypt/live/mydomain/wildcard_mydomain-fullchain.crt;

# ssl_certificate /etc/letsencrypt/live/mydomain/wildcard_mydomain.crt;

ssl_certificate_key /etc/letsencrypt/live/mydomain/wildcard_mydomain.key;

  • ดูทรงแล้ว ปัญหาน่าจะเกิดจาก DNS หลายตัว ชี้ domain name นี้ไป คนละไอพี เดานะ ไอพีใน หรือ ไปไอพีนอก สลับกัน
อธิบายเพิ่มโดย Gemini

คำสั่งนี้ทำไปเพื่ออะไร?

การใช้คำสั่ง cat รวมไฟล์แบบนี้ ทำไปเพื่อ สร้างความน่าเชื่อถือที่สมบูรณ์ (Chain of Trust) ให้กับเบราว์เซอร์ของผู้ใช้งานครับ

อธิบายให้เห็นภาพง่ายๆ คือ:

  1. เบราว์เซอร์ของผู้ใช้ (เช่น Chrome, Safari) จะมีความน่าเชื่อถือพื้นฐานที่ฝังมาในเครื่อง เรียกว่า Root CA

  2. ใบรับรองเว็บของคุณ (wildcard_mydomain.crt) ไม่ได้ถูกออกโดย Root CA โดยตรง แต่ถูกออกโดยคนกลางที่เรียกว่า Intermediate CA (DigiCertCA.crt)

  3. ถ้า Web Server ของคุณส่งแค่ใบรับรองเว็บ (wildcard_mydomain.crt) ไปให้เบราว์เซอร์ เบราว์เซอร์บางตัว (โดยเฉพาะในมือถือรุ่นเก่าๆ หรือบางระบบปฏิบัติการ) จะหาทางเชื่อมกลับไปที่ Root CA ไม่เจอ ทำให้มันแจ้งเตือนผู้ใช้ว่า "เว็บนี้ไม่ปลอดภัย (Not Secure)"

การรวมไฟล์ (Bundle) จึงเป็นการเอาใบรับรองเว็บของคุณและใบรับรองของคนกลางมาต่อกันเป็นไฟล์เดียว เพื่อให้ Web Server (เช่น Nginx หรือ HAProxy) ส่งแพ็กเกจนี้ไปให้เบราว์เซอร์ทีเดียวจบ เบราว์เซอร์จะสามารถตรวจสอบย้อนกลับไปถึง Root CA ได้อย่างไร้รอยต่อครับ


ข้อควรระวังที่สำคัญ: ลำดับไฟล์ของคุณสลับกันอยู่

คำสั่งที่คุณระบุมาคือ: sudo cat DigiCertCA.crt wildcard_mydomain.crt > wildcard_mydomain-fullchain.crt

ลำดับนี้ผิดหลักการของ Web Server ส่วนใหญ่ (เช่น Nginx) ครับ การต่อไฟล์ Full Chain ที่ถูกต้อง จะต้องให้ ใบรับรองของโดเมนเราอยู่บนสุด แล้วเรียงลำดับลงไปหา Intermediate CA ครับ หากเอา Intermediate ขึ้นก่อน Web Server อาจจะ Error สตาร์ทไม่ขึ้น หรือเบราว์เซอร์อ่านค่าผิดพลาดได้

คำสั่งที่ถูกต้องคือต้องสลับที่กันแบบนี้ครับ:

sudo cat wildcard_mydomain.crt DigiCertCA.crt > wildcard_mydomain-fullchain.crt

เมื่อใช้คำสั่งนี้เสร็จ คุณจะได้ไฟล์ wildcard_mydomain-fullchain.crt และคุณจะใช้แค่ไฟล์นี้ คู่กับไฟล์ Private Key (wildcard_mydomain.key) ไปตั้งค่าใน Web Server ของคุณครับ (ส่วน 2 ไฟล์แรกที่เป็น .crt ไม่ต้องเอาไปคอนฟิกใน Web Server แล้ว)

Popular Posts