Làm thế nào tôi có thể bắt đầu nginx thông qua upstart?


9

Lý lịch:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

Tôi đã xây dựng nginx và tôi muốn sử dụng để bắt đầu nó:

nginx upstart script từ trang web:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

Tôi nhận được "công việc không xác định" khi tôi cố gắng sử dụng initctl để chạy nó, điều mà tôi vừa học rõ ràng có nghĩa là có lỗi, (lỗi gì với "Lỗi" để mô tả lỗi?)

Ai đó có thể chỉ cho tôi đi đúng hướng ? Tôi đã đọc tài liệu này, và nó có vẻ hơi thưa thớt khi thay thế SysV init ... nhưng bất cứ điều gì chỉ cần thêm công việc này vào danh sách, chạy nó và tiếp tục với những gì còn lại của cuộc đời tôi. .. Có lời khuyên nào không?

EDIT: initctl phiên bản init (mới bắt đầu 0.6.5)


1
Một nhận xét về 'công việc không xác định' so với 'Lỗi'. Bạn chỉ đang nhìn nhầm chỗ. Initctl không đọc tệp cấu hình, nó chỉ yêu cầu Upstart tải một công việc đã biết - và upstart không biết công việc này khi bạn ban hành lệnh initctl. Đã xảy ra lỗi trước đó khi Upstart cố đọc tệp công việc. Cần có một thông báo lỗi trong nhật ký hệ thống (/ var / log / syslog, / var / log / message hoặc bất cứ nơi nào hệ thống của bạn lưu trữ các nhật ký này)
Jacek Konieczny

Nhân tiện, nó chỉ ra rằng trong / sbin có các lệnh start và stop cho các công việc mới bắt đầu. Họ làm việc cho tôi. Bây giờ, họ liên kết lại với initctl, vì vậy tôi không chắc tại sao họ làm việc, nhưng họ làm.
chiggsy

Câu trả lời:


3

Bạn không thể có nhiều stop onchỉ thị trong một mô tả công việc mới bắt đầu cho Upstart> = 0,5.

console ownercó lẽ không phải là những gì bạn muốn (điều này làm cho nginx trở thành chủ sở hữu của bảng điều khiển hệ thống).

Thử:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn

Vẫn chưa biết việc, than ôi. Bạn lấy thông tin này từ đâu? Đàn ông? Thông tin? Trực tuyến? Tài liệu 0.6.5 ở đâu?
chiggsy

kinda làm việc .. thnx
chiggsy

Có, thật khó để tìm thấy tài liệu Upstart hiện tại, ít nhất là trên web. Nhưng trang hướng dẫn khá tốt. Hãy thử: man 5 init
Jacek Konieczny

1
Đây không phải là cách phù hợp để chạy nginx trên các máy chủ sản xuất. Các daemon offtùy chọn chỉ dành cho phát triển.
PhilT

16

Tôi đã kết thúc ở đây hơn một lần nên tôi nghĩ tôi sẽ cung cấp câu trả lời cập nhật dựa trên kinh nghiệm của bản thân sau khi sử dụng câu trả lời ở đây. Đặc biệt cảm ơn @danorton và @orj vì câu trả lời của họ.

Kịch bản này đã được thử nghiệm trên Upstart 1.5 chạy trên Ubuntu 12.04 với Nginx 1.0.11 và Hành khách 3.0.11. Nếu bạn không sử dụng Hành khách, bạn có thể cần chơi xung quanh với post-stoptuyến. Tham khảo sách dạy nấu ăn Upstart.

Trong phần trống, /etc/init/nginx.confthêm các dòng sau (Bạn có thể xóa các nhận xét nếu bạn muốn):

description "nginx http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid

# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork

# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t

# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT

# Start Nginx
exec $DAEMON

Tôi đã lấy tập lệnh Upstart từ Nginx Wiki và điều chỉnh nó vì một số dòng không cần thiết, gây nhầm lẫn hoặc không hoạt động.

Bạn có thể cần phải thay đổi env DAEMONenv PIDcác dòng tùy thuộc vào nơi bạn đã cài đặt nginx và đang viết PID. PID có thể được cấu hình bằng nginx.

Tôi đã thử tất cả các hình thức expect. Chỉ có expect forkvẻ để làm việc. Với Hành khách nginx tạo ra 61 dĩa. Upstart yêu cầu 0, 1 hoặc 2. Như những người khác đã gợi ý, Upstart sẽ theo dõi sai PID. Tôi cũng đã gỡ bỏ respawnvì nó không có gì vì lý do tương tự. Một số tập lệnh trước / sau khi bắt đầu bổ sung có thể có thể khắc phục điều đó bằng cách lấy PID thực sự. Tôi, tuy nhiên, sử dụng monit để xử lý khởi động lại vì vậy không cần nó.

Không sử dụng daemon off. Điều này chỉ dành cho phát triển. Xem http://wiki.nginx.org/CoreModule#daemon

Người giới thiệu:


1
Tôi nghĩ rằng bạn sẽ muốn chạy bằng cách sử dụng daemon off;để khởi động đồng hồ đúng quy trình / PID mà không cần chỉ thị expect forkhoặc post-stopchỉ thị. Phần wiki mô tả tùy chọn daemon cũng cho biết "Bạn có thể sử dụng daemon một cách an toàn trong chế độ sản xuất với runit / daemontools, tuy nhiên bạn không thể thực hiện nâng cấp duyên dáng.", Tôi cho rằng đang đề cập đến việc nâng cấp lên nhị phân mới trên tính năng bay .
Gary

3

Bạn không thể. Ít nhất là không đúng cách, dù sao.

Nginx không sinh ra daemon của nó theo một trong hai cách mà yêu cầu mới bắt đầu, thông qua việc mong đợi fork fork hoặc hoặc mong đợi daemon, vì vậy, upstart không thể theo dõi quá trình nginx chính. Có một số hack, nhưng họ có vấn đề riêng của họ.

Nếu bạn ổn với thực tế là người mới bắt đầu không thể theo dõi quá trình tổng thể và tắt nó khi tắt máy, điều này sẽ hoạt động:

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON

expect daemongây ra lỗi treo cổ cho tôi (Ubuntu 12.04, Upstart 1.5, Nginx). expect forklàm việc mặc dù như gợi ý của @danorton, Upstart sẽ theo dõi sai PID. Tôi cũng không thể có được sự hồi sinh để làm việc (Xem câu trả lời đầy đủ của tôi).
PhilT

2

Có một ví dụ về tệp cấu hình Upstart trong NGINX Wiki .

Bạn có thể cần điều chỉnh đường dẫn đến nhị phân nginx trong tệp cấu hình.

Tệp cấu hình này hoạt động tốt với tôi với Ubuntu 10.04 và nginx 1.0.5.

Tôi cũng đã cài đặt một nginxsymlink khi /etc/init.dchỉ vào /lib/init/upstart-jobđể tôi có thể sử dụng servicelệnh chuẩn để bắt đầu và dừng nginx.

Lưu ý: Nếu bạn cài đặt Phusion Pasbah với NGINX, bạn có thể cần thêm đoạn thơ sau vào tập lệnh cấu hình Upstart:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

Tôi thấy điều này cần thiết trên cấu hình Ubuntu của tôi. Mặt khác, khi tôi ban hành initctl stop nginxhoặc service nginx stopnginx đã không thực sự dừng lại. Tôi cũng nhận thấy rằng Upstart nghĩ rằng quy trình nginx có một PID thực sự là PID của một trong các quy trình Hành khách. Vì vậy, rõ ràng NGINX / Hành khách đang bối rối Khởi động một chút.


Cảm ơn kịch bản đó cho hành khách. Điều này dường như dừng các quá trình nhưng tôi đã nhận được stop: Job failed while stoppingtrong khi làm như vậy. Bạn đã thấy điều này?
PhilT

Tôi có cùng một vấn đề như @PhilT, có từ nào về điều này không?
Claudio Poli

0

Tôi sử dụng:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

Việc dừng lại runlevel [!...]dường như là tiêu chuẩn hơn. Đó là những gì các kịch bản ssh / samba chứng khoán làm. Bạn cũng nên thêm respawnbit để nó khởi động lại nếu nó chết. Tôi cũng không chắc tại sao bạn chỉ muốn console outputgửi đầu ra giao diện điều khiển đến thiết bị xuất chuẩn. Hành vi mặc định là chỉ cần gửi đầu ra giao diện điều khiển đến logger.

Bạn có thể thấy tất cả các tài liệu khổ thơ trên wiki Upstart


Thật không may, wiki đó dường như ngụ ý rằng nó chỉ là phiên bản 0.5. Điều rất lạ với tôi là một sự thay đổi quan trọng như vậy được ghi lại theo kiểu đó.
chiggsy

Phiên bản 0,5 là gì?
Jim Mitchener

Các wiki nói chung. Các trang man đều ổn, nhưng chúng chắc chắn không phải là các trang 'thông tin', thường chi tiết hơn nhiều.
chiggsy


0

Điều kỳ lạ là không có câu trả lời nào ở đây thực sự hoạt động hoàn toàn khi chúng rời khỏi trạng thái dừng / bị giết, điều này ngăn cản việc bắt đầu làm việc khác. Điều này có nghĩa là restart nginxthất bại.

Lỗi với upstart được ghi lại rõ ràng tại https://bugs.launchpad.net/upstart/+orms/406394 và tôi ngạc nhiên rằng tác giả của upstart dường như không quan tâm đủ để sửa nó. Giải pháp duy nhất tôi thấy rằng hoạt động là như sau (bị đánh cắp từ cùng một báo cáo lỗi):

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

Ưu điểm của việc viết nó như thế này là ngay cả việc hồi sinh cũng hoạt động. Nhược điểm là nó xấu và hack khó chịu.


Upstart là khá nhiều một sản phẩm chết; Ubuntu gần như là bản phân phối cuối cùng sử dụng nó. Tất cả những người khác đang chuyển đi hoặc đã chuyển đổi.
Michael Hampton

Ngay cả bản thân Ubuntu cũng đã chuyển sang systemd trong các phiên bản mới hơn. Nhưng một số người trong chúng tôi vẫn bị mắc kẹt với 14.04 vì LTS.
Ivan Anishchuk
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.