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:
-
-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 sockettcp
. -
-l
hiển thị tất cả các socket nghe có tính đến các hạn chế-4
và-t
. -
-n
đảm bảo số cổng được hiển thị, trái ngược với tên giao thức như 'httpor
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:
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