คู่มือแก้ปัญหา HTTP - การตรวจสอบ Port 80 ครับ

คู่มือแก้ไขปัญหาพอร์ต HTTP 80 แสดงการเชื่อมต่อเครือข่าย เครื่องมือวินิจฉัยเซิร์ฟเวอร์ และการตั้งค่าพอร์ต

การตรวจสอบ port 80 จะบอกคุณได้ทันทีว่า web server ของคุณเข้าถึงได้ผ่าน HTTP หรือไม่ ซึ่งเป็น protocol ที่เบราว์เซอร์ใช้โดยอัตโนมัติเมื่อคุณพิมพ์ URL ธรรมดาโดยไม่มี "https://" หาก port 80 ถูกบล็อกหรือไม่มีบริการรอรับการเชื่อมต่ออยู่ ผู้เข้าชมจะพบข้อผิดพลาดในการเชื่อมต่อ และเว็บไซต์ของคุณก็จะใช้งานไม่ได้ บทความนี้จะอธิบายวิธีวินิจฉัยและแก้ไขปัญหาอย่างละเอียดครับ

Port 80 ทำหน้าที่อะไร

Port 80 คือ TCP port มาตรฐานสำหรับ HTTP (Hypertext Transfer Protocol) เมื่อเบราว์เซอร์เชื่อมต่อไปยัง http://example.com มันจะกำหนดเป้าหมายไปที่ port 80 บน IP address ของ server นั้นโดยอัตโนมัติ ซอฟต์แวร์ server ไม่ว่าจะเป็น Apache, Nginx, IIS, Caddy หรืออื่น ๆ จะต้องรอรับการเชื่อมต่อบน port 80 อยู่ตลอดเวลาเพื่อให้การเชื่อมต่อสำเร็จ

Port 80 ถูกกำหนดไว้ใน รีจิสทรี port อย่างเป็นทางการของ IANA และมาตรฐานใน RFC 9110 โดยจัดอยู่ในกลุ่ม "well-known" port หมายความว่าหมายเลข 0-1023 สงวนไว้สำหรับบริการระดับระบบ และต้องใช้สิทธิ์ระดับสูงในการ bind บน Linux/macOS

วิธีตรวจสอบว่า port 80 เปิดอยู่หรือไม่

มีหลายวิธีในการตรวจสอบว่า port 80 เปิดอยู่หรือไม่ ขึ้นอยู่กับว่าคุณกำลังตรวจสอบจากภายในเครื่อง server เองหรือจากภายนอกผ่านเครือข่ายหรืออินเทอร์เน็ต

ใช้ telnet

telnet เป็นวิธีทดสอบด้วยตนเองที่รวดเร็วที่สุด รันคำสั่งนี้จากเครื่องใดก็ได้ที่มีการเข้าถึงเครือข่ายไปยัง host เป้าหมาย:

telnet example.com 80

ถ้า port 80 เปิดอยู่และมี web server รอรับการเชื่อมต่อ คุณจะเห็น cursor ว่างเปล่าหรือ HTTP banner ถ้าปิดหรือถูกกรอง คุณจะได้รับข้อความ "Connection refused" หรือคำสั่งจะค้างจนหมดเวลา

ใช้ curl

curl ให้รายละเอียดมากกว่า โดยแสดง HTTP response จริง ๆ ให้คุณเห็น:

curl -v http://example.com

flag -v จะแสดงผลลัพธ์แบบ verbose รวมถึง TCP handshake และ response header การเชื่อมต่อที่สำเร็จจะแสดง * Connected to example.com (93.184.216.34) port 80 ส่วนที่ล้มเหลวจะแสดง curl: (7) Failed to connect

ใช้ nmap

nmap คือเครื่องมือมาตรฐานสำหรับการสแกน port หากต้องการทดสอบ port 80 โดยเฉพาะ:

nmap -p 80 example.com

ผลลัพธ์จะแสดงสถานะหนึ่งในสามแบบ: open (มีบริการรอรับการเชื่อมต่ออยู่), closed (port เข้าถึงได้แต่ไม่มีบริการรอรับ) หรือ filtered (firewall กำลังทิ้ง packet และ nmap ไม่สามารถระบุสถานะได้)

filtered กับ closed ต่างกันอย่างไร: "filtered" มักหมายความว่า firewall กำลังทิ้ง packet อย่างเงียบ ๆ ส่วน "closed" หมายความว่า server ตอบกลับด้วย TCP RST ซึ่ง port เข้าถึงได้แต่ไม่มีบริการผูกอยู่ ทั้งสองกรณีต้องการวิธีแก้ไขที่แตกต่างกัน

ใช้ PowerShell บน Windows

Test-NetConnection -ComputerName example.com -Port 80

คำสั่ง Test-NetConnection ของ PowerShell จะคืนค่า TcpTestSucceeded : True หรือ False อย่างชัดเจน ทำให้เขียน script ได้ง่าย สำหรับคู่มือฉบับสมบูรณ์เกี่ยวกับการตรวจสอบ port บน Windows ดูได้ที่ การตรวจสอบ port ที่เปิดอยู่บน Windows

ใช้ netstat ตรวจสอบ port 80

เมื่อคุณอยู่บน server เอง netstat จะแสดงให้เห็นว่า process ใดกำลัง bind อยู่กับ port 80 นี่คือเครื่องมือที่เหมาะสมเมื่อคุณต้องการตอบคำถามว่า "มีบริการรอรับการเชื่อมต่อบน port 80 บนเครื่องนี้จริง ๆ หรือไม่?"

Linux / macOS

sudo netstat -tlnp | grep :80

อธิบาย flag แต่ละตัว:

  • -t - แสดงเฉพาะการเชื่อมต่อ TCP
  • -l - แสดงเฉพาะ socket ที่รอรับการเชื่อมต่อ
  • -n - แสดง address แบบตัวเลข (เร็วกว่า ข้าม DNS lookup)
  • -p - แสดงชื่อ process และ PID

ผลลัพธ์ทั่วไปจะมีลักษณะแบบนี้: tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx ซึ่งบอกว่า nginx (PID 1234) กำลังรอรับการเชื่อมต่อบนทุก interface บน port 80

บน Linux รุ่นใหม่ ss จะเร็วกว่าและแนะนำให้ใช้แทน netstat :

sudo ss -tlnp | grep :80

Windows

netstat -ano | findstr :80

คำสั่งนี้จะแสดงการเชื่อมต่อทั้งหมดบน port 80 พร้อม PID หากต้องการค้นหาชื่อ process จาก PID (เช่น PID 4892):

tasklist /fi "pid eq 4892"
พบ process ที่ไม่คาดคิดใช้งาน port 80 อยู่? บน Windows "System" (PID 4) มักจะครอบครอง port 80 หาก IIS ติดตั้งและทำงานอยู่ บน Linux หากมีบริการอื่นที่ไม่ใช่ web server ของคุณครอบครอง port 80 อยู่ server ที่คุณต้องการจะเริ่มต้นไม่ได้และจะแสดงข้อผิดพลาด "address already in use"

วินิจฉัยปัญหา port 80 ถูกบล็อกโดย firewall

การบล็อกโดย firewall เป็นสาเหตุที่พบบ่อยที่สุดที่ทำให้ port 80 ดูเหมือนปิดจากภายนอก แม้ว่า web server ของคุณจะทำงานได้ปกติในเครื่อง โดยการบล็อกอาจเกิดขึ้นได้จาก 3 ชั้น:

ชั้น ตรวจสอบที่ไหน เครื่องมือ
OS firewall (server) iptables / ufw (Linux), Windows Defender Firewall iptables -L -n หรือกฎ Windows Firewall
Cloud security group AWS EC2 Security Groups, Azure NSG, GCP Firewall Rules กฎ inbound ใน Cloud console
Network/ISP firewall Router ACL, ISP บล็อก port สำหรับการเชื่อมต่อที่บ้าน ติดต่อ ISP หรือใช้เครื่องมือสแกน port จากภายนอก

ตรวจสอบ iptables บน Linux

sudo iptables -L INPUT -n -v | grep 80

ถ้าคุณเห็นกฎ DROP หรือ REJECT สำหรับ port 80 นั่นคือสาเหตุของปัญหา หากต้องการอนุญาต port 80 ด้วย ufw:

sudo ufw allow 80/tcp
sudo ufw reload

ตรวจสอบ AWS Security Groups

ถ้า server ของคุณอยู่บน EC2 ให้ไปที่ EC2 console - Security Groups - Inbound rules คุณต้องมีกฎที่อนุญาต TCP port 80 จาก 0.0.0.0/0 (หรือช่วง IP ที่ต้องการ) หากไม่มีกฎนี้ traffic ทั้งหมดบน port 80 จะถูกทิ้งก่อนที่จะถึง OS firewall ของคุณด้วยซ้ำ

สำหรับการวินิจฉัย port บน Linux อย่างละเอียด ดูได้ที่ คู่มือฉบับสมบูรณ์สำหรับการตรวจสอบ port ที่เปิดอยู่บน Linux ซึ่งครอบคลุม iptables, ufw, firewalld และ nftables อย่างละเอียด

HTTP port ไม่ตอบสนอง: สาเหตุที่พบบ่อยและวิธีแก้ไข

เมื่อ HTTP port ไม่ตอบสนอง ปัญหามักจะเข้าข่ายหนึ่งในสาเหตุเหล่านี้:

  • Web server ไม่ได้ทำงาน - ตรวจสอบด้วย systemctl status nginx หรือ systemctl status apache2 ถ้าหยุดทำงานอยู่ ให้เริ่มใหม่: sudo systemctl start nginx
  • Web server หยุดทำงานตั้งแต่ตอน startup - ตรวจสอบ log: sudo journalctl -u nginx --since "10 minutes ago" ข้อผิดพลาด syntax ในไฟล์ config หรือ port ที่ขัดแย้งกันจะถูกบันทึกไว้ที่นี่
  • Server ผูกอยู่กับ localhost เท่านั้น - ถ้าไฟล์ config ของ server ระบุ listen 127.0.0.1:80 แทนที่จะเป็น listen 0.0.0.0:80 มันจะไม่รับการเชื่อมต่อจากภายนอก แก้ไข bind address ในไฟล์ config ของ server
  • Port 80 ถูกใช้งานอยู่แล้ว - process อื่นครอบครอง port 80 ก่อนที่ web server ของคุณจะเริ่มทำงาน ใช้ netstat เพื่อระบุตัวตน จากนั้นหยุดมันหรือกำหนดค่าบริการใดบริการหนึ่งใหม่
  • SELinux หรือ AppArmor บล็อกการ bind - บนระบบ RHEL/CentOS SELinux อาจป้องกันไม่ให้ process ที่ไม่ใช่มาตรฐาน bind กับ port 80 ตรวจสอบ ausearch -m AVC -ts recent เพื่อดูการปฏิเสธ
ตรวจสอบเบื้องต้นอย่างรวดเร็ว: รัน curl http://127.0.0.1 โดยตรงบน server ถ้าใช้งานได้แต่การเชื่อมต่อจากภายนอกล้มเหลว ปัญหาอยู่ที่ firewall หรือกฎเครือข่าย ไม่ใช่ตัว web server เอง

ทดสอบการเชื่อมต่อ port 80 จากภายนอกเครือข่าย

การทดสอบจากเครื่องของคุณเองอาจให้ผลที่คลาดเคลื่อนได้ เพราะคุณอาจอยู่บน LAN เดียวกับ server ซึ่งข้ามผ่านกฎ firewall ที่ใช้กับ traffic จากภายนอก หากต้องการทดสอบการเชื่อมต่อ port 80 ในแบบที่ผู้เข้าชมจริง ๆ จะพบ คุณต้องใช้การทดสอบจากภายนอก

คุณสามารถตรวจสอบ HTTP response header ของ server จากภายนอกได้โดยใช้ เครื่องมือตรวจสอบ HTTP Headers ของเรา มันจะดึง header จาก URL ของคุณและแสดงสิ่งที่เบราว์เซอร์ได้รับจริง ๆ ไม่ว่าจะเป็น status code, ประเภท server, redirect chain และอื่น ๆ ทั้งหมดจากมุมมองภายนอก

ตัวเลือกอื่น ๆ จากภายนอก:

  • เครื่องมือสแกน port ออนไลน์ - เว็บไซต์อย่าง portchecker.co หรือ canyouseeme.org ให้คุณพิมพ์ IP และหมายเลข port เพื่อทดสอบจาก server ของพวกเขา
  • จาก VPS หรือ cloud shell - สร้าง cloud instance แบบ free tier ในภูมิภาคอื่นแล้วรัน nc -zv your-server-ip 80 จากที่นั่น
  • ใช้ nc (netcat) ในเครื่อง - nc -zv example.com 80 ให้ผลลัพธ์ open/closed อย่างรวดเร็วโดยไม่ต้องติดตั้งอะไรเพิ่มเติมบนระบบ Linux/macOS ส่วนใหญ่

Port 80 กับ port 443: แต่ละอันสำคัญเมื่อไหร่

Port 443 จัดการ HTTPS (HTTP ที่เข้ารหัสผ่าน TLS) เว็บไซต์สมัยใหม่ส่วนใหญ่จะ redirect traffic ทั้งหมดจาก port 80 ไปยัง port 443 ทันที แต่ port 80 ยังคงมีความสำคัญด้วยเหตุผลหลายประการ:

  • ACME/Let's Encrypt HTTP-01 challenge - certbot ของ Let's Encrypt ใช้ port 80 เพื่อยืนยันความเป็นเจ้าของโดเมน ถ้า port 80 ถูกบล็อก การออกใบรับรองจะล้มเหลว
  • บริการภายในที่ไม่ใช้ TLS - เครื่องมือภายในองค์กร, monitoring agent และ microservice จำนวนมากสื่อสารผ่าน HTTP ธรรมดาบน port 80 ภายในเครือข่ายส่วนตัว
  • อุปกรณ์ legacy และ IoT - อุปกรณ์ embedded บางรุ่นและ client รุ่นเก่าไม่รองรับ TLS และพึ่งพา port 80
  • โครงสร้าง redirect - แม้ว่าคุณจะให้บริการทุกอย่างผ่าน HTTPS คุณก็ยังต้องเปิด port 80 ไว้เพื่อรับและ redirect คำขอ HTTP แทนที่จะปล่อยให้ผู้ใช้พบข้อผิดพลาดในการเชื่อมต่อ
แนวทางปฏิบัติที่ดีที่สุด: เปิด port 80 ไว้แต่กำหนดค่า web server ให้ออก 301 permanent redirect จาก HTTP ไปยัง HTTPS ซึ่งจะให้ความปลอดภัยของ TLS ในขณะที่ยังคง port 80 ไว้สำหรับ redirect และการต่ออายุใบรับรอง
เครื่องมือตรวจสอบ HTTP header สำหรับแก้ปัญหา port 80

ดูทันทีว่า port 80 ส่งอะไรกลับมา

เครื่องมือตรวจสอบ HTTP Headers ของเราจะดึง response สดจาก URL ใด ๆ เพื่อให้คุณยืนยันว่า port 80 เปิดอยู่ ตรวจสอบ redirect chain และดู status code ที่ server ส่งมาได้อย่างแม่นยำ โดยไม่ต้องใช้ command line

ตรวจสอบ HTTP Headers ทันที →

บน Linux รัน sudo ss -tlnp | grep :80 หรือ sudo netstat -tlnp | grep :80 ทั้งสองคำสั่งจะแสดงชื่อ process และ PID ที่ bind อยู่กับ port 80 บน Windows ใช้ netstat -ano | findstr :80 เพื่อรับ PID แล้วใช้ tasklist /fi "pid eq [PID]" เพื่อค้นหาชื่อ process บริการที่พบได้บ่อย ได้แก่ nginx, apache2, IIS และ Node.js server

ใช้คำสั่ง netstat หรือ ss เดิมแต่กรองหา 8080 แทน: sudo ss -tlnp | grep :8080 บน Linux หรือ netstat -ano | findstr :8080 บน Windows port 8080 เป็น HTTP port ทางเลือกที่ใช้กันทั่วไปโดย development server, Tomcat, Jenkins และ proxy ถ้ามีบริการผูกอยู่แล้ว คุณต้องหยุดมันหรือกำหนดค่าบริการใหม่ให้ใช้ port อื่น

บน web server เฉพาะและ VPS ใช่ ปกติแล้ว port 80 จะเปิดอยู่และเป็นที่คาดหวัง แต่สำหรับการเชื่อมต่ออินเทอร์เน็ตที่บ้าน ISP หลายรายจะบล็อก inbound port 80 เพื่อป้องกันไม่ให้ลูกค้าโฮสต์ server สาธารณะจากที่บ้าน สำหรับ cloud instance port 80 มักจะถูกปิดโดยค่าเริ่มต้นใน security group จนกว่าคุณจะเพิ่มกฎ inbound อย่างชัดเจน

จากภายนอก server ใช้ nmap -p 80 your-server-ip หรือ telnet your-server-ip 80 จากตัว server เอง ใช้ ss -tlnp | grep :80 เพื่อยืนยันว่ามีบริการรอรับการเชื่อมต่ออยู่ นอกจากนี้ให้ตรวจสอบกฎ firewall ด้วย บน Linux ที่ใช้ ufw รัน sudo ufw status เพื่อดูว่า port 80 อยู่ในรายการที่อนุญาตหรือไม่

บน Linux ที่ใช้ ufw: sudo ufw allow 80/tcp ด้วย iptables โดยตรง: sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT บน Windows เพิ่มกฎ inbound ใน Windows Defender Firewall สำหรับ TCP port 80 บน cloud server เพิ่มกฎ inbound ใน security group หรือ network security group ของคุณที่อนุญาต TCP port 80 จากช่วง source ที่ต้องการ

Port 80 จะเปิดอยู่เมื่อ web server ถูกกำหนดค่าให้ให้บริการ HTTP traffic ซึ่งเป็นมาตรฐานสำหรับเว็บไซต์สาธารณะทุกแห่ง นอกจากนี้ยังคงเปิดอยู่บน server ที่ redirect HTTP ไปยัง HTTPS (port 443) เพราะตัว redirect เองต้องรับการเชื่อมต่อ port 80 ก่อน เครื่องมือต่ออายุใบรับรองอย่าง Let's Encrypt certbot ก็ต้องการ port 80 สำหรับการยืนยัน HTTP-01 domain validation challenge ด้วย

เปิด Windows Defender Firewall with Advanced Security คลิก "Inbound Rules" แล้วคลิก "New Rule" เลือก "Port" เลือก TCP ใส่ 80 เป็น specific local port เลือก "Allow the connection" ใช้กับทุก profile (Domain, Private, Public) แล้วตั้งชื่อกฎ หรือจะรันคำสั่งนี้ใน PowerShell ที่มีสิทธิ์ระดับสูงก็ได้: New-NetFirewallRule -DisplayName "HTTP Port 80" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow

ใช่ บน Linux และ macOS port 80 เป็น privileged port (port 0-1023 ต้องใช้สิทธิ์ root หรือ capability CAP_NET_BIND_SERVICE ในการ bind) ซึ่งหมายความว่า process ของผู้ใช้ทั่วไปไม่สามารถรอรับการเชื่อมต่อบน port 80 ได้โดยไม่มีสิทธิ์ระดับสูง web server อย่าง nginx และ Apache มักถูกเริ่มต้นในฐานะ root เพื่อ bind port 80 จากนั้นจึง drop ไปใช้ผู้ใช้ที่มีสิทธิ์ต่ำกว่าสำหรับการจัดการคำขอ บน Windows ไม่มีข้อจำกัดเทียบเท่าสำหรับ port 80

Port 80 (HTTP) ถูกใช้แทน port 443 (HTTPS) ในสถานการณ์ที่ TLS ไม่จำเป็นหรือไม่สามารถใช้งานได้จริง เช่น microservice ภายในบนเครือข่ายส่วนตัวที่เชื่อถือได้, สภาพแวดล้อม development ในเครื่อง หรืออุปกรณ์ IoT ที่ไม่รองรับ TLS นอกจากนี้ port 80 ยังจำเป็นสำหรับ Let's Encrypt HTTP-01 certificate challenge สำหรับเว็บไซต์สาธารณะใด ๆ แนะนำให้ใช้ port 443 กับ TLS เป็นหลัก โดยเปิด port 80 ไว้เฉพาะสำหรับ redirect เท่านั้น

ไม่ ทั้งสองเป็น port คนละตัว port 80 คือมาตรฐาน HTTP ที่ IANA กำหนดและเบราว์เซอร์จะใช้โดยอัตโนมัติเมื่อไม่ได้ระบุ port ส่วน port 8000 เป็น port ทางเลือกที่ไม่เป็นทางการซึ่งใช้กันทั่วไปโดย development server เช่น python -m http.server ของ Python จะใช้ port 8000 เป็นค่าเริ่มต้น เช่นเดียวกับ Django development server หากต้องการเข้าถึงบริการบน port 8000 คุณต้องระบุอย่างชัดเจนใน URL: http://example.com:8000