Làm cách nào để khởi động lại nginx chỉ sau khi kiểm tra cấu hình thành công trên Ubuntu?


111

Khi tôi khởi động lại dịch vụ nginx trên dòng lệnh trên máy chủ Ubuntu, dịch vụ bị treo khi tệp cấu hình nginx có lỗi. Trên máy chủ nhiều trang, điều này đặt tất cả các trang, ngay cả những trang không có lỗi cấu hình.

Để ngăn điều này, tôi chạy kiểm tra cấu hình nginx trước:

nginx -t

Sau khi kiểm tra thành công, tôi có thể khởi động lại dịch vụ:

/etc/init.d/nginx restart

Hoặc chỉ tải lại cấu hình trang nignx mà không cần khởi động lại:

nginx -s reload

Có cách nào để kết hợp hai lệnh đó trong đó lệnh khởi động lại có điều kiện đối với kết quả kiểm tra cấu hình không?

Tôi không thể tìm thấy điều này trực tuyến và tài liệu chính thức về điều này khá cơ bản. Tôi không biết rõ về con đường của mình đối với Linux, vì vậy tôi không biết liệu những gì tôi đang tìm kiếm có ở ngay trước mắt hay không.

Tôi đang sử dụng nginx v1.1.19.


Điều gì về một tập lệnh shell nhỏ kiểm tra trạng thái trả về của nginx -t (với $?) Và sau đó khởi động lại tùy thuộc vào trạng thái trả về thì sao?
TeTeT

Câu trả lời:


49

Trên thực tế, theo như tôi biết, nginx sẽ hiển thị một thông báo trống và nó sẽ không thực sự khởi động lại nếu cấu hình xấu.

Cách duy nhất để vặn nó là thực hiện một dừng nginx và sau đó bắt đầu lại. Sẽ thành công nếu dừng lại, nhưng không thể bắt đầu.


1
Bạn đang nói về phiên bản nginx nào? Tôi đang làm việc với v 1.1.19 và nó sẽ cố gắng khởi động lại bất kể lỗi nào trong các tệp cấu hình. Nó sẽ thông báo với tôi rằng có một vấn đề, nhưng sau đó nó đã quá muộn
Tháng Một

5
Được rồi, tôi vừa thử nghiệm nó, máy tính xách tay của tôi có nginx 1.2 và nó hoạt động như tôi mô tả, VPS của tôi có 1.1.19 giống như của bạn và nó đã hoạt động giống như bạn mô tả trong câu hỏi của bạn. Vì vậy, tôi đoán này đã được xử lý trong 1.2
Mohammad AbuShady

Tuyệt quá! Cảm ơn vì đã tìm ra điều đó cho tôi. Tôi sẽ giữ câu hỏi mở thêm một chút nữa để xem liệu không ai có câu trả lời cho nginx <v1.2
jan

1
Tôi đoán tôi sẽ phải nâng cấp sau đó :-) Cần một cái cớ nào
Tháng Một

1
service nginx reloadkhông hiển thị gì cho dù cấu hình đã được tải đúng hay chưa, vì vậy sẽ vô ích nếu bạn nghi ngờ cấu hình có thể không chính xác. service nginx restartsẽ dừng máy chủ nếu cấu hình có lỗi!
Dan Dascalescu

80

Kể từ nginx 1.8.0, giải pháp chính xác là

sudo nginx -t && sudo service nginx reload

Lưu ý rằng do lỗi, configtestluôn trả về mã thoát bằng 0 ngay cả khi tệp cấu hình có lỗi.


3
nginx -t && sudo nginx -s tải lại
MechanisM

5
@MechanisM: nginx -tkhông có sudo gần như chắc chắn sẽ bị lỗi do lỗi quyền.
Dan Dascalescu,

Tôi muốn hiển thị hầu hết phần cuối cùng để tải lại. Trong trường hợp của tôi, tôi đã tùy chỉnh biên soạn nginx và thậm chí không có bất kỳ script trong /etc/init.d và như vậy, như vậy trong trường hợp của tôi "dịch vụ nginx tải lại" sẽ không làm bất cứ điều gì
Cơ chế

39

Tôi sử dụng lệnh sau để tải lại Nginx (phiên bản 1.5.9) chỉ khi kiểm tra cấu hình thành công:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Nếu bạn cần làm điều này thường xuyên, bạn có thể muốn sử dụng bí danh. Tôi sử dụng như sau:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

Thủ thuật ở đây được thực hiện bởi "&&" chỉ thực hiện lệnh thứ hai nếu lệnh đầu tiên thành công. Bạn có thể xem tại đây giải thích chi tiết hơn về việc sử dụng toán tử "&&".

Bạn có thể sử dụng "khởi động lại" thay vì "tải lại" nếu bạn thực sự muốn khởi động lại máy chủ.


Hãy cẩn thận với nginx 1.4.2 Tôi đã tìm thấy pkill -1 nginx(thực sự những gì mà init.d / nginx tải lại của tôi thực hiện) KHÔNG tải lại nếu cấu hình không thành công và trả về một cách sai lầm. Kiểm tra các phiên bản của riêng bạn.
KCD

2
Điều này không hiệu quả với tôi. Cả hai lệnh đều được thực thi ngay cả khi thử nghiệm không thành công.
Mario Campa

2
configtest luôn trả về mã thoát bằng 0 , ít nhất là trong nginx 1.8.0. Sử dụng nginx -tthay thế.
Dan Dascalescu

8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

và sau đó sử dụng các lệnh "nginx.reload", v.v.


6

Bạn có thể tải lại bằng cách sử dụng /etc/init.d/nginx reloadsudo service nginx reload

Nếu nginx -tném một số lỗi thì nó sẽ không tải lại

vì vậy hãy sử dụng && để chạy cả hai cùng một lúc

giống

nginx -t && /etc/init.d/nginx tải lại


Hãy để tôi dạy bạn điều gì đó về bash. && không run both at a same timeNó chạy lệnh ở bên phải NẾU lệnh ở bên trái trả về mã thoát bằng 0. Nếu bạn nginx -tgặp lỗi, mã thoát sẽ không bằng 0, vì vậy lệnh thứ hai sẽ không chạy. Nó nginx -s reloadnào
miknik

@miknik Tôi nghĩ đó là những gì anh ấy muốn nói, nó không đúng. Anh ấy nói If nginx -t throws some error then it won't reload. Câu lệnh run both at a same timecũng có thể được hiểu là một lệnh hoặc một dòng. Tôi không giải thích anh ấy nhất thiết phải nói trong trường hợp này in parallel.
matt

2

Bạn có thể sử dụng tín hiệu để điều khiển nginx.

Theo tài liệu, bạn cần gửi tín hiệu HUP tới quy trình tổng thể nginx.

HUP - thay đổi cấu hình, theo kịp múi giờ đã thay đổi (chỉ dành cho FreeBSD và Linux), bắt đầu các quy trình worker mới với cấu hình mới, tắt nhanh các quy trình worker cũ

Kiểm tra tài liệu tại đây: http://nginx.org/vi/docs/control.html

Bạn có thể gửi tín hiệu HUP đến PID quy trình chính của nginx như sau:

kill -HUP $( cat /var/run/nginx.pid )

Lệnh trên đọc nginx PID từ /var/run/nginx.pid. Theo mặc định, pid nginx được ghi vào /usr/local/nginx/logs/nginx.pidnhưng điều đó có thể bị ghi đè trong cấu hình. Kiểm tra của bạn nginx.configđể xem nơi nó lưu PID.


1

Ít nhất trên Debian, tập lệnh khởi động nginx có chức năng tải lại:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Có vẻ như tất cả những gì bạn cần làm là gọi service nginx reloadthay restartvì nó gọi test_nginx_config.


service nginx reloadsẽ không đưa ra bất kỳ dấu hiệu nào về việc cấu hình được kiểm tra có OK hay không, hoặc liệu nó có được tải lại hay không.
Dan Dascalescu

Điều gì test_nginx_configlàm sau đó trong trường hợp đó?
Daenney

1
Tôi nghĩ cả hai bạn đều có lý. service nginx reloadlà đủ trên dòng lệnh, tuy nhiên đôi khi bạn có thể muốn nắm bắt đầu ra stderr và đưa nó trở lại tập lệnh để khắc phục sự cố. nginx -tsẽ cho bạn biết tệp nào có tham số không hợp lệ và trên dòng nào.
anastymous
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.