Làm thế nào để thiết lập phụ thuộc dịch vụ systemd?


17

Trong quá trình khởi động hệ thống CentOS 7, nginx khởi động không thành công với lỗi sau:

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

Tôi nghi ngờ điều này xảy ra do các giao diện mạng chưa hoạt động trước khi cố gắng liên kết với địa chỉ IP đó để phục vụ vhost qua SSL.

Tôi đoán là tôi cần chỉ định mạng.service là một yêu cầu cho nginx.service, nhưng tôi không thể tìm thấy dịch vụ mạng trong / etc / systemd /.

Làm cách nào tôi có thể định cấu hình thứ tự dịch vụ hoặc phụ thuộc trong systemd?


1
Bạn không tìm kiếm nhiều phụ thuộc dịch vụ hơn là đặt hàng ?
CVn

Điểm tốt! Cập nhật.
vincent.io

1
Điều này có thể giúp: serverfault.com/questions/482730/
Kẻ

Cảm ơn, điều đó giải quyết nó! Tâm trí để đặt nó trong một câu trả lời để tôi có thể đóng nó? :)
vincent.io

Xóa câu trả lời của tôi. Nguồn của câu trả lời được đăng (Ông Hampton). Nên đánh dấu mình là câu trả lời đúng.
Belmin Fernandez

Câu trả lời:


19

Bạn cần, tối thiểu, After=network.targettrong [Unit]phần của tệp đơn vị của bạn, để đảm bảo rằng mạng đã hoạt động trước khi bắt đầu nginx. Tôi không biết tại sao tập tin đơn vị của bạn không có nó.

Đây là một ví dụ hoàn chỉnh từ hệ thống Fedora tiện dụng của tôi, do Fedora vận chuyển:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Cảm ơn, câu trả lời tuyệt vời! Tôi đã cài đặt nginx từ kho lưu trữ remi (bên thứ ba), điều này có thể giải thích tại sao "Sau" bị thiếu trong tệp đơn vị.
vincent.io

1
Hấp dẫn. Tôi sẽ thả cho anh ta một ghi chú và cho anh ta biết về vấn đề này. Các gói của anh ấy thường có chất lượng rất cao và tôi không chắc anh ấy đã bỏ lỡ điều đó như thế nào.
Michael Hampton

Đề nghị tuyệt vời, thực hiện.
vincent.io

5

Từ nhật ký lỗi, có vẻ như cấu hình nginx của bạn. tập tin có một lệnh nghe với một địa chỉ IP rõ ràng:

listen a.b.c.d:443

Điều này có nghĩa là nginx sẽ không bắt đầu trừ khi giao diện mạng của bạn hoạt động IP abcd đã được gán cho giao diện.

Bạn có hai lựa chọn:

  • thay đổi chỉ thị nghe thành: nghe 443; (liên kết với tất cả các địa chỉ IP)
  • làm cho nginx phụ thuộc vào mạng-online.target

Như được mô tả trong http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ the Network.target chỉ cho biết rằng ngăn xếp quản lý mạng đã hoạt động [...] Cho dù mọi giao diện mạng đã được định cấu hình khi đạt được không định nghĩa được.

Nếu bạn muốn đảm bảo rằng địa chỉ IP đã được gán và giao diện được bật, bạn cần thêm mạng-online.target vào tệp đơn vị systemd của nginx.

Tệp /etc/systemd/system/multi-user.target.wants/nginx.service của bạn nên có mạng-online.target trong dòng After = và Request =.

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

1
+1 để đề cập network-online.target- trong trường hợp ai đó cũng tự hỏi: có, cả hai Requires=After=đều cần thiết bởi vì Requires=(đáng ngạc nhiên là) không ngụ ý một đơn đặt hàng giữa đơn vị được yêu cầu và đơn vị yêu cầu.
maxschlepzig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.