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ỗ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 systemctl và journalctl  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:
- 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:
- 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 ss và ps ở 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 ss và ps
 Để 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:
-  -4hạn chếsschỉ hiển thị thông tin socket liên quan đến IPv4.
-  -tchỉ giới hạn kết quả cho các sockettcp.
-  -lhiển thị tất cả các socket nghe có tính đến các hạn chế-4và-t.
-  -nđảm bảo số cổng được hiển thị, trái ngược với tên giao thức như 'httporhttps`. Đ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ế.
-  -pxuấ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:
OutputLISTEN   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 
OutputLISTEN   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 và [::]: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:
OutputPID 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:
OutputLISTEN   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.
Các tin liên quan
Cách khắc phục các lỗi Apache thường gặp2020-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 MPM Event 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
 

