Thứ năm, 30/07/2020 | 00:00 GMT+7

Lỗi mạng Apache AH00072: make_sock: không thể liên kết với địa chỉ

Loạt bài hướng dẫn này giải thích cách khắc phục sự cố và sửa chữa một số lỗi phổ biến nhất mà bạn có thể gặp phải khi sử dụng web server Apache .

Một phần của Loạt bài: Các lỗi Apache thường gặp

Mỗi hướng dẫn trong loạt bài này bao gồm mô tả về các lỗi cấu hình Apache, mạng, hệ thống file hoặc quyền phổ biến. Loạt bài này bắt đầu với tổng quan về các lệnh và file log mà bạn có thể sử dụng để khắc phục sự cố Apache. Các hướng dẫn tiếp theo kiểm tra các lỗi cụ thể một cách chi tiết.

Apache AH00072: make_sock: could not bind to address thông báo lỗi AH00072: make_sock: could not bind to address được tạo ra khi có một tiến trình khác đang lắng nghe trên cùng một cổng mà Apache được cấu hình để sử dụng. Thông thường, cổng sẽ là cổng tiêu chuẩn 80 cho kết nối HTTP hoặc cổng 443 cho kết nối HTTPS. Tuy nhiên, bất kỳ xung đột cổng nào với quy trình khác đều có thể gây ra lỗi AH00072.

Lỗi bắt nguồn từ mạng của hệ điều hành cơ bản. Vấn đề là chỉ một quá trình duy nhất có thể được liên kết với một cổng tại bất kỳ thời điểm nào. Nếu một web server khác như Nginx được cấu hình để lắng nghe trên cổng 80 và nó đang chạy, thì Apache sẽ không thể xác nhận cổng cho chính nó.

Để phát hiện một cuộc xung đột cổng với Apache, bạn cần phải kiểm tra systemctljournalctl kết quả để xác định địa chỉ IP và port đang gây ra lỗi. Sau đó, bạn có thể quyết định cách giải quyết vấn đề, cho dù đó là bằng cách chuyển đổi web server , thay đổi địa chỉ IP mà Apache sử dụng, cổng hoặc bất kỳ sự kết hợp nào của các tùy chọn này.

Khắc phục sự cố với systemctl

Theo các bước khắc phục sự cố từ hướng dẫnCách khắc phục các lỗi Apache thường gặp ở đầu loạt bài này, bước đầu tiên khi bạn khắc phục sự cố thông báo lỗi AH00072: make_sock: could not bind to address là kiểm tra trạng thái của Apache bằng systemctl .

Nếu systemctl không bao gồm kết quả mô tả sự cố, thì phần cuối cùng của hướng dẫn này, Khắc phục sự cố Sử dụng Nhật ký journalctl giải thích cách kiểm tra log systemd để tìm cổng xung đột.

Đầu ra từ systemctl status trong nhiều trường hợp sẽ chứa tất cả thông tin chẩn đoán mà bạn cần để giải quyết lỗi. Nó sẽ bao gồm địa chỉ IP mà Apache đang sử dụng, cũng như cổng mà nó đang cố gắng liên kết. Đầu ra cũng sẽ cho biết Apache đã không thể khởi động trong bao lâu để bạn có thể xác định xem sự cố đã ảnh hưởng đến Apache trong bao lâu.

Trên các bản phân phối Linux có nguồn root từ Ubuntu và Debian, hãy chạy phần sau để kiểm tra trạng thái của Apache:

Hệ thống Ubuntu và Debian
  • sudo systemctl status apache2.service -l --no-pager

Trên hệ thống CentOS và Fedora, sử dụng lệnh này để kiểm tra trạng thái của Apache:

Hệ thống CentOS và Fedora
  • sudo systemctl status httpd.service -l --no-pager

Cờ -l sẽ đảm bảo systemctl xuất ra toàn bộ nội dung của một dòng, thay vì thay thế bằng systemctl ( ) cho các dòng dài. Cờ --no-pager sẽ xuất toàn bộ log ra màn hình của bạn mà không cần gọi một công cụ như less chỉ hiển thị màn hình nội dung tại một thời điểm.

Vì bạn đang khắc phục sự cố thông báo lỗi AH00072: make_sock , bạn sẽ nhận được kết quả tương tự như sau:

Output
● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: failed (Result: exit-code) since Tue 2020-07-28 13:58:40 UTC; 8s ago Docs: man:httpd.service(8) Process: 69 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) Main PID: 69 (code=exited, status=1/FAILURE) Status: "Reading configuration..." Tasks: 213 (limit: 205060) Memory: 25.9M CGroup: /system.slice/containerd.service/system.slice/httpd.service Jul 28 13:58:40 e3633cbfc65e systemd[1]: Starting The Apache HTTP Server… Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 Jul 28 13:58:40 e3633cbfc65e httpd[69]: no listening sockets available, shutting down Jul 28 13:58:40 e3633cbfc65e httpd[69]: AH00015: Unable to open logs Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Failed with result 'exit-code'. Jul 28 13:58:40 e3633cbfc65e systemd[1]: Failed to start The Apache HTTP Server.

Lưu ý kết quả của bạn có thể hơi khác nếu bạn đang sử dụng bản phân phối có nguồn root từ Ubuntu hoặc Debian, trong đó tên của tiến trình Apache không phải là httpd mà là apache2 .

systemctl ra systemctl ví dụ này bao gồm một số dòng được đánh dấu từ tạp chí systemd mô tả lỗi AH00072. Những dòng này, cả hai đều bắt đầu với (98)Address already in use: AH00072: make_sock: could not bind to address , cung cấp cho tất cả các bạn các thông tin về lỗi AH00072 mà bạn cần phải khắc phục nó hơn nữa, vì vậy bạn có thể bỏ qua sau journalctl và thay vào đó, hãy chuyển đến phần Khắc phục sự cố với Tiện ích ssps ở cuối hướng dẫn này.

Nếu kết quả systemctl của bạn không cung cấp thông tin cụ thể về địa chỉ IP và cổng hoặc các cổng gây ra lỗi AH00072, bạn cần phải kiểm tra kết quả journalctl từ log systemd . Phần sau giải thích cách sử dụng journalctl để khắc phục lỗi AH00072.

Khắc phục sự cố bằng Nhật ký journalctl

Nếu kết quả systemctl của bạn không bao gồm thông tin cụ thể về lỗi AH00072, bạn nên tiếp tục sử dụng lệnh journalctl để kiểm tra log systemd cho Apache.

Trên Ubuntu và các hệ thống có nguồn root từ Debian, hãy chạy lệnh sau:

  • sudo journalctl -u apache2.service --since today --no-pager

Trên các hệ thống có nguồn root từ CentOS, Fedora và RedHat, hãy sử dụng lệnh này để kiểm tra log :

  • sudo journalctl -u httpd.service --since today --no-pager

Cờ --since today sẽ giới hạn kết quả của lệnh chỉ để ghi các mục nhập bắt đầu từ 00:00:00 của ngày hiện tại. Sử dụng tùy chọn này sẽ giúp hạn chế dung lượng các mục nhập log mà bạn cần kiểm tra khi kiểm tra lỗi.

Nếu Apache không thể liên kết với một cổng đang được sử dụng, hãy tìm kiếm thông qua kết quả cho các dòng tương tự với các mục log sau, cụ thể là các dòng có chứa mã lỗi AH00072 như được đánh dấu trong ví dụ này:

Output
-- Logs begin at Tue 2020-07-14 20:10:37 UTC, end at Tue 2020-07-28 14:01:40 UTC. -- . . . Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 Jul 28 14:03:01 b06f9c91975d apachectl[71]: no listening sockets available, shutting down

Đầu ra này chỉ ra hai lỗi AH00072. Điều đầu tiên giải thích rằng Apache không thể liên kết với địa chỉ [::]:80 , là cổng 80 trên tất cả các giao diện IPv6 có sẵn. Dòng tiếp theo, với địa chỉ 0.0.0.0:80 , cho biết Apache không thể liên kết với cổng 80 trên tất cả các giao diện IPv4 có sẵn. Tùy thuộc vào cấu hình hệ thống của bạn, địa chỉ IP có thể khác nhau và chỉ hiển thị các IP riêng lẻ và có thể chỉ bao gồm lỗi IPv4 hoặc IPv6.

Mặc dù hệ thống của bạn có thể có các cổng và giao diện xung đột khác nhau, các lỗi sẽ tương tự như kết quả hiển thị ở đây. Với kết quả từ journalctl bạn có thể chẩn đoán sự cố bằng cách sử dụng ss trong phần sau của hướng dẫn này.

Khắc phục sự cố với Tiện ích ssps

Để khắc phục lỗi AH00072, bạn cần xác định quá trình khác đang lắng nghe địa chỉ IP và cổng mà Apache đang cố gắng sử dụng. Hầu hết các bản phân phối Linux hiện đại đều có một tiện ích được gọi là ss được dùng để thu thập thông tin về trạng thái của các socket mạng của hệ thống.

Trong phần journalctl trước, một số thứ đã được liên kết với địa chỉ IPv4 và IPv6 trên cổng 80 . Lệnh sau sẽ xác định tên của quá trình đã được liên kết với giao diện IPv4 trên cổng 80 . Đảm bảo rằng bạn thay thế cổng từ thông báo lỗi nếu nó khác với cổng 80 trong lệnh sau:

  • sudo ss -4 -tlnp | grep 80

Các cờ của lệnh ss thay đổi kết quả mặc định của nó theo những cách sau:

  • -4 hạn chế ss chỉ hiển thị thông tin socket liên quan đến IPv4.
  • -t chỉ giới hạn kết quả cho các socket tcp .
  • -l hiển thị tất cả các socket nghe có tính đến các hạn chế -4-t .
  • -n đảm bảo số cổng được hiển thị, trái ngược với tên giao thức như 'http or https`. Điều này rất quan trọng vì Apache có thể đang cố gắng liên kết với một cổng không chuẩn và tên dịch vụ có thể gây nhầm lẫn so với số cổng thực tế.
  • -p xuất ra thông tin về tiến trình được liên kết với một cổng.

Với tất cả các cờ đó, bạn sẽ nhận được kết quả như sau:

Output
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=40,fd=6))

Ba trường đầu tiên không quan trọng khi khắc phục lỗi AH00072 nên có thể bỏ qua chúng. Các trường quan trọng là trường thứ tư ( 0.0.0.0:80 ), trùng với lỗi journalctl mà bạn đã phát hiện trước đó, cùng với những users:(("nginx",pid=40,fd=6)) cuối cùng users:(("nginx",pid=40,fd=6)) , cụ thể là pid=40 phần.

Nếu bạn gặp lỗi AH00072 liên quan đến giao diện IPv6, hãy lặp lại lệnh gọi ss , lần này sử dụng cờ -6 để hạn chế giao diện trong mạng IPv6 như sau:

  • sudo ss -6 -tlnp |grep 80
Output
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=40,fd=7))

, hãy thay thế số cổng được đề cập từ kết quả journalctl của bạn nếu nó khác với số 80 được đánh dấu ở đây.

Trong cả hai trường hợp lỗi IPv4 và IPv6 này, kết quả ss cho biết có một chương trình có ID quy trình 40 ( pid=40 trong kết quả ) được liên kết với giao diện 0.0.0.0:80[::]:80 tương ứng. Quá trình này đang ngăn Apache bắt đầu vì nó đã sở hữu cổng. Để xác định tên của chương trình, hãy sử dụng trình ps như thế này, thay thế ID tiến trình từ kết quả của bạn thay cho giá trị 40 đánh dấu trong ví dụ này:

  • sudo ps -p 40

Bạn sẽ nhận được kết quả tương tự như sau:

Output
PID TTY TIME CMD 40 ? 00:00:00 nginx

nginx đánh dấu trong kết quả là tên của quá trình đang lắng nghe trên các giao diện. Đến đây bạn đã có tên của chương trình ngăn Apache khởi động, bạn có thể quyết định cách giải quyết lỗi. Bạn có thể dừng quá trình nginx , cấu hình lại nginx để lắng nghe trên giao diện và cổng khác hoặc cấu hình lại Apache để tránh va chạm cổng.

Điều quan trọng cần lưu ý là quá trình này có thể khác với nginx và cổng và địa chỉ IP có thể không phải lúc nào cũng là 0.0.0.0 hoặc [::] nếu bạn đang chẩn đoán lỗi AH00072. Thông thường, các web server và proxy khác nhau sẽ được sử dụng trên cùng một server . Mỗi loại có thể đang cố gắng liên kết với các cổng IPv4 và giao diện IPv6 khác nhau để xử lý truy cập web khác nhau. Ví dụ: một server được cấu hình với HAProxy lắng nghe trên địa chỉ loopback IPv4 ( còn gọi là localhost ) trên cổng 8080 sẽ hiển thị kết quả ss như sau:

Output
LISTEN 0 2000 127.0.0.1:8080 0.0.0.0:* users:(("haproxy",pid=545,fd=7))

Điều quan trọng là phải kết hợp kết quả systemctl hoặc kết quả journalctl cho biết địa chỉ IP và cổng cụ thể, với dữ liệu chẩn đoán từ ss và sau đó là ps để thu hẹp quá trình khiến Apache không khởi động được.

Kết luận

Trong hướng dẫn này, bạn đã học cách khắc phục sự cố Apache AH00072 make_sock: could not bind to address thông báo lỗi AH00072 make_sock: could not bind to address trên cả giao diện IPv4 và IPv6. Bạn đã học cách sử dụng systemctl để kiểm tra trạng thái của server Apache và cố gắng tìm thông báo lỗi. Bạn cũng đã học cách sử dụng journalctl để kiểm tra log systemd để biết thông tin cụ thể về lỗi AH00072.

Với các thông báo lỗi thích hợp từ các bản ghi, sau đó bạn đã tìm hiểu về tiện ích ss và cách sử dụng nó để kiểm tra trạng thái của các socket mạng của hệ thống. Sau đó, bạn đã học cách kết hợp thông tin ID quy trình từ ss với tiện ích ps để tìm tên của quy trình khiến Apache không thể khởi động.


Tags:

Các tin trước

Cách khắc phục các lỗi Apache thường gặp 2020-07-30
Lỗi cấu hình Apache AH00526: Lỗi cú pháp 2020-07-30
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 20.04 2020-07-06
Cách tạo chứng chỉ SSL tự ký cho Apache trên CentOS 8 2020-06-30
Cách bảo mật Apache bằng Let's Encrypt trên CentOS 8 2020-06-29
Cách cấu hình Apache HTTP với Sự kiện MPM và PHP-FPM trên Ubuntu 18.04 2020-05-13
Cách cài đặt web server Apache trên CentOS 8 [Quickstart] 2020-05-08
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 20.04 2020-04-29
Cách cài đặt web server Apache trên Ubuntu 20.04 [Quickstart] 2020-04-28
Cách cài đặt web server Apache trên Ubuntu 20.04 2020-04-27