Kiểm tra Port 80: Hướng dẫn khắc phục sự cố HTTP

Hướng dẫn khắc phục sự cố cổng HTTP 80 với kết nối mạng, công cụ chẩn đoán máy chủ và cấu hình cổng

Kiểm tra port 80 giúp bạn xác định xem web server có thể truy cập được qua HTTP hay không - đây là giao thức mà trình duyệt sử dụng mặc định khi bạn nhập một URL thông thường không có "https://". Nếu port 80 bị chặn hoặc không có dịch vụ nào đang lắng nghe, người dùng sẽ gặp lỗi kết nối và website của bạn sẽ không thể truy cập được. Dưới đây là cách chẩn đoán và khắc phục chi tiết.

Port 80 thực sự hoạt động như thế nào

Port 80 là TCP port mặc định dành cho HTTP (Hypertext Transfer Protocol) . Khi trình duyệt kết nối đến http://example.com , nó tự động nhắm vào port 80 trên địa chỉ IP của server đó. Phần mềm server - Apache, Nginx, IIS, Caddy, hoặc bất kỳ phần mềm nào khác - phải đang lắng nghe tích cực trên port 80 thì kết nối mới thành công.

Port 80 được định nghĩa trong danh mục port chính thức của IANA và được chuẩn hóa trong RFC 9110. Đây là một "well-known" port, nghĩa là các port từ 0 đến 1023 được dành riêng cho các dịch vụ cấp hệ thống và yêu cầu quyền nâng cao (elevated privileges) để bind trên Linux/macOS.

Cách kiểm tra port 80 có đang mở không

Có nhiều cách để kiểm tra xem port 80 có đang mở hay không, tùy thuộc vào việc bạn kiểm tra cục bộ (ngay trên server) hay từ xa (từ một máy khác hoặc từ internet).

Dùng telnet

Telnet là cách kiểm tra thủ công nhanh nhất. Chạy lệnh này từ bất kỳ máy nào có thể truy cập mạng đến host đích:

telnet example.com 80

Nếu port 80 đang mở và có web server đang lắng nghe, bạn sẽ thấy con trỏ trống hoặc một HTTP banner. Nếu port bị đóng hoặc bị lọc, bạn sẽ nhận được thông báo "Connection refused" hoặc lệnh sẽ treo cho đến khi hết thời gian chờ.

Dùng curl

curl cung cấp thêm nhiều thông tin chi tiết - nó hiển thị phản hồi HTTP thực tế:

curl -v http://example.com

Flag -v in ra output chi tiết, bao gồm quá trình TCP handshake và các response header. Kết nối thành công sẽ hiển thị * Connected to example.com (93.184.216.34) port 80 . Khi thất bại sẽ hiển thị curl: (7) Failed to connect .

Dùng nmap

nmap là công cụ chuẩn mực để quét port. Để kiểm tra riêng port 80:

nmap -p 80 example.com

Kết quả sẽ hiển thị một trong ba trạng thái: open (có dịch vụ đang lắng nghe), closed (port có thể truy cập nhưng không có dịch vụ nào lắng nghe), hoặc filtered (firewall đang loại bỏ các gói tin và nmap không thể xác định được trạng thái).

Filtered và Closed khác nhau thế nào: "Filtered" thường có nghĩa là firewall đang âm thầm loại bỏ các gói tin. "Closed" có nghĩa là server phản hồi bằng TCP RST - port có thể truy cập nhưng không có dịch vụ nào được bind vào đó. Hai trường hợp này cần cách xử lý khác nhau.

Dùng PowerShell trên Windows

Test-NetConnection -ComputerName example.com -Port 80

Lệnh Test-NetConnection của PowerShell trả về kết quả rõ ràng là TcpTestSucceeded : True hoặc False , rất thuận tiện để tích hợp vào script. Để xem hướng dẫn đầy đủ về kiểm tra port trên Windows, hãy xem kiểm tra các port đang mở trên Windows .

Dùng netstat để kiểm tra port 80

Khi bạn đang ở trên chính server đó, netstat cho bạn thấy chính xác tiến trình nào đang được bind vào port 80. Đây là công cụ phù hợp khi bạn cần trả lời câu hỏi "liệu có dịch vụ nào thực sự đang lắng nghe trên port 80 của máy này không?"

Linux / macOS

sudo netstat -tlnp | grep :80

Giải thích các flag:

  • -t - chỉ hiển thị kết nối TCP
  • -l - chỉ hiển thị các socket đang lắng nghe
  • -n - hiển thị địa chỉ dạng số (nhanh hơn, bỏ qua tra cứu DNS)
  • -p - hiển thị tên tiến trình và PID

Kết quả thường trông như sau: tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx . Điều này cho biết nginx (PID 1234) đang lắng nghe trên tất cả các interface ở port 80.

Trên các hệ thống Linux hiện đại, ss nhanh hơn và được ưu tiên hơn so với netstat :

sudo ss -tlnp | grep :80

Windows

netstat -ano | findstr :80

Lệnh này liệt kê tất cả các kết nối có port 80 cùng với PID tương ứng. Để tìm tên tiến trình từ PID (ví dụ PID 4892):

tasklist /fi "pid eq 4892"
Port 80 đang bị chiếm bởi một tiến trình không mong muốn? Trên Windows, "System" (PID 4) thường chiếm port 80 nếu IIS được cài đặt và đang chạy. Trên Linux, nếu một tiến trình khác (không phải web server của bạn) đang giữ port 80, web server của bạn sẽ không khởi động được và báo lỗi "address already in use".

Chẩn đoán port 80 bị firewall chặn

Firewall chặn là nguyên nhân phổ biến nhất khiến port 80 có vẻ bị đóng từ bên ngoài dù web server của bạn đang chạy bình thường ở cục bộ. Có ba tầng mà việc chặn có thể xảy ra:

Tầng Nơi kiểm tra Công cụ
Firewall hệ điều hành (server) iptables / ufw (Linux), Windows Defender Firewall iptables -L -n hoặc quy tắc Windows Firewall
Security group trên cloud AWS EC2 Security Groups, Azure NSG, GCP Firewall Rules Quy tắc inbound trong bảng điều khiển cloud
Firewall mạng / ISP Router ACL, ISP chặn port trên kết nối dân dụng Liên hệ ISP hoặc dùng công cụ quét port từ bên ngoài

Kiểm tra iptables trên Linux

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

Nếu bạn thấy quy tắc DROP hoặc REJECT cho port 80, đó chính là nguyên nhân. Để cho phép port 80 bằng ufw:

sudo ufw allow 80/tcp
sudo ufw reload

Kiểm tra AWS Security Groups

Nếu server của bạn đang chạy trên EC2, hãy vào bảng điều khiển EC2 - Security Groups - Inbound rules. Bạn cần có một quy tắc cho phép TCP port 80 từ 0.0.0.0/0 (hoặc dải IP cụ thể của bạn). Nếu không có quy tắc này, toàn bộ lưu lượng port 80 sẽ bị loại bỏ trước khi chạm đến firewall hệ điều hành.

Để tìm hiểu sâu hơn về chẩn đoán port phía Linux, hãy xem hướng dẫn đầy đủ về kiểm tra các port đang mở trên Linux , bao gồm iptables, ufw, firewalld và nftables.

Port HTTP không phản hồi: nguyên nhân thường gặp và cách xử lý

Khi port HTTP không phản hồi, vấn đề thường rơi vào một trong các trường hợp sau:

  • Web server không chạy - Kiểm tra bằng systemctl status nginx hoặc systemctl status apache2 . Nếu dịch vụ đã dừng, hãy khởi động lại: sudo systemctl start nginx .
  • Web server bị crash khi khởi động - Kiểm tra log: sudo journalctl -u nginx --since "10 minutes ago" . Lỗi cú pháp trong file cấu hình hoặc xung đột port sẽ được ghi lại ở đây.
  • Server chỉ bind vào localhost - Nếu cấu hình server của bạn chỉ định listen 127.0.0.1:80 thay vì listen 0.0.0.0:80 , nó sẽ không chấp nhận kết nối từ bên ngoài. Hãy sửa lại địa chỉ bind trong file cấu hình server.
  • Port 80 đã bị tiến trình khác chiếm - Một tiến trình khác đã chiếm port 80 trước khi web server của bạn khởi động. Dùng netstat để xác định tiến trình đó, sau đó dừng nó hoặc cấu hình lại một trong hai dịch vụ.
  • SELinux hoặc AppArmor chặn việc bind - Trên các hệ thống RHEL/CentOS, SELinux có thể ngăn một tiến trình không chuẩn bind vào port 80. Kiểm tra ausearch -m AVC -ts recent để xem có từ chối nào không.
Kiểm tra nhanh: Chạy curl http://127.0.0.1 trực tiếp trên server. Nếu lệnh này thành công nhưng kết nối từ bên ngoài vẫn thất bại, vấn đề nằm ở firewall hoặc quy tắc mạng - không phải bản thân web server.

Kiểm tra kết nối port 80 từ bên ngoài mạng

Kiểm tra từ máy của chính bạn có thể cho kết quả không chính xác - bạn có thể đang ở cùng mạng LAN với server, bỏ qua các quy tắc firewall chỉ áp dụng cho lưu lượng từ bên ngoài. Để kiểm tra kết nối port 80 đúng như trải nghiệm của người dùng thực, bạn cần thực hiện kiểm tra từ bên ngoài.

Bạn có thể kiểm tra các response header HTTP của server từ bên ngoài bằng công cụ HTTP Headers Checker của chúng tôi. Công cụ này lấy các header từ URL của bạn và hiển thị chính xác những gì trình duyệt nhận được - mã trạng thái, loại server, chuỗi redirect và nhiều thông tin khác - tất cả từ một điểm quan sát bên ngoài.

Các lựa chọn bên ngoài khác:

  • Công cụ quét port trực tuyến - Các trang như portchecker.co hoặc canyouseeme.org cho phép bạn nhập địa chỉ IP và số port để kiểm tra từ server của họ.
  • Từ VPS hoặc cloud shell - Khởi động một instance cloud miễn phí ở một khu vực khác và chạy nc -zv your-server-ip 80 từ đó.
  • Dùng nc (netcat) cục bộ - nc -zv example.com 80 cho kết quả mở/đóng nhanh chóng mà không cần cài thêm gì trên hầu hết các hệ thống Linux/macOS.

Port 80 và port 443: khi nào dùng cái nào

Port 443 xử lý HTTPS (HTTP được mã hóa qua TLS). Hầu hết các trang web hiện đại đều chuyển hướng toàn bộ lưu lượng port 80 sang port 443 ngay lập tức. Nhưng port 80 vẫn quan trọng vì một số lý do:

  • ACME/Let's Encrypt HTTP-01 challenge - certbot của Let's Encrypt dùng port 80 để xác minh quyền sở hữu tên miền. Nếu port 80 bị chặn, việc cấp chứng chỉ sẽ thất bại.
  • Dịch vụ nội bộ không dùng TLS - Nhiều công cụ nội bộ, monitoring agent và microservice giao tiếp qua HTTP thuần trên port 80 trong mạng riêng.
  • Thiết bị cũ và IoT - Một số thiết bị nhúng và client cũ không hỗ trợ TLS và phụ thuộc vào port 80.
  • Hạ tầng redirect - Dù bạn phục vụ mọi thứ qua HTTPS, bạn vẫn cần port 80 mở để bắt và chuyển hướng các yêu cầu HTTP thay vì để người dùng gặp lỗi kết nối.
Thực hành tốt nhất: Giữ port 80 mở nhưng cấu hình web server để phát hành redirect 301 vĩnh viễn từ HTTP sang HTTPS. Cách này đảm bảo bảo mật của TLS trong khi vẫn giữ port 80 hoạt động cho việc redirect và gia hạn chứng chỉ.
HTTP headers checker tool for port 80 troubleshooting

Xem ngay port 80 đang thực sự trả về gì

Công cụ HTTP Headers Checker của chúng tôi lấy phản hồi trực tiếp từ bất kỳ URL nào để bạn xác nhận port 80 có đang mở không, kiểm tra chuỗi redirect và xem chính xác các mã trạng thái mà server gửi đi - không cần dùng dòng lệnh.

Kiểm tra HTTP Headers ngay →

Trên Linux, chạy sudo ss -tlnp | grep :80 hoặc sudo netstat -tlnp | grep :80 . Cả hai lệnh đều hiển thị tên tiến trình và PID đang được bind vào port 80. Trên Windows, dùng netstat -ano | findstr :80 để lấy PID, sau đó dùng tasklist /fi "pid eq [PID]" để tìm tên tiến trình. Các dịch vụ thường chiếm port 80 bao gồm nginx, apache2, IIS và các server Node.js.

Dùng các lệnh netstat hoặc ss tương tự nhưng lọc theo 8080 thay vì 80: sudo ss -tlnp | grep :8080 trên Linux, hoặc netstat -ano | findstr :8080 trên Windows. Port 8080 là port HTTP thay thế phổ biến được dùng bởi các development server, Tomcat, Jenkins và proxy. Nếu đã có dịch vụ nào đó bind vào đó, bạn cần dừng nó hoặc cấu hình dịch vụ mới của bạn sang một port khác.

Trên các web server chuyên dụng và VPS, có - port 80 thường được mở và là điều bình thường. Trên các kết nối internet dân dụng, nhiều ISP chặn port 80 chiều vào để ngăn khách hàng tự host server công khai từ kết nối gia đình. Trên các instance cloud, port 80 thường bị đóng mặc định trong security group cho đến khi bạn thêm quy tắc inbound cho phép nó một cách tường minh.

Từ bên ngoài server, dùng nmap -p 80 your-server-ip hoặc telnet your-server-ip 80 . Từ chính server đó, dùng ss -tlnp | grep :80 để xác nhận có dịch vụ đang lắng nghe. Ngoài ra hãy kiểm tra quy tắc firewall - trên Linux với ufw, chạy sudo ufw status để xem port 80 có được liệt kê là được phép không.

Trên Linux với ufw: sudo ufw allow 80/tcp . Với iptables trực tiếp: sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT . Trên Windows, thêm quy tắc inbound trong Windows Defender Firewall cho TCP port 80. Trên cloud server, thêm quy tắc inbound trong security group hoặc network security group của bạn để cho phép TCP port 80 từ dải nguồn mong muốn.

Port 80 mở khi một web server được cấu hình để phục vụ lưu lượng HTTP, đây là tiêu chuẩn cho bất kỳ website công khai nào. Port này cũng được giữ mở trên các server chuyển hướng HTTP sang HTTPS (port 443), vì bản thân việc chuyển hướng cần chấp nhận kết nối port 80 ban đầu. Các công cụ gia hạn chứng chỉ như certbot của Let's Encrypt cũng yêu cầu port 80 cho HTTP-01 domain validation challenge.

Mở Windows Defender Firewall with Advanced Security, nhấp vào "Inbound Rules", sau đó "New Rule". Chọn "Port", chọn TCP, nhập 80 làm specific local port, chọn "Allow the connection", áp dụng cho tất cả các profile (Domain, Private, Public) và đặt tên cho quy tắc. Ngoài ra, bạn có thể chạy lệnh này trong PowerShell với quyền quản trị viên: New-NetFirewallRule -DisplayName "HTTP Port 80" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow .

Có, trên Linux và macOS, port 80 là privileged port (các port từ 0 đến 1023 yêu cầu quyền root hoặc capability CAP_NET_BIND_SERVICE để bind). Điều này có nghĩa là một tiến trình người dùng thông thường không thể lắng nghe trên port 80 mà không có quyền nâng cao. Các web server như nginx và Apache thường được khởi động với quyền root để bind port 80, sau đó chuyển sang user có quyền thấp hơn để xử lý các yêu cầu. Trên Windows, không có hạn chế tương đương đối với port 80.

Port 80 (HTTP) được dùng thay vì port 443 (HTTPS) trong các trường hợp TLS không cần thiết hoặc không thực tế - chẳng hạn như các microservice nội bộ trên mạng riêng đáng tin cậy, môi trường phát triển cục bộ, hoặc thiết bị IoT không hỗ trợ TLS. Port 80 cũng bắt buộc phải có cho HTTP-01 certificate challenge của Let's Encrypt. Đối với bất kỳ trang web công khai nào, port 443 với TLS được khuyến nghị mạnh mẽ, với port 80 chỉ được giữ mở cho việc redirect.

Không, đây là hai port khác nhau. Port 80 là chuẩn do IANA chỉ định cho HTTP và được trình duyệt tự động sử dụng khi không có port nào được chỉ định. Port 8000 là port thay thế không chính thức thường được dùng bởi các development server - Python's python -m http.server mặc định dùng port 8000, cũng như development server của Django. Để truy cập dịch vụ trên port 8000, bạn phải chỉ định nó tường minh trong URL: http://example.com:8000 .