Nginx config tải lại mà không có thời gian chết


123

Tôi sử dụng nginx như một proxy ngược. Bất cứ khi nào tôi cập nhật cấu hình cho nó bằng cách sử dụng

sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"

Tôi phải đối mặt với một thời gian chết ngắn. Làm thế nào tôi có thể tránh điều đó?


1
Là những người có nghĩa là lệnh dòng lệnh? Tôi chưa bao giờ thấy ai bọc toàn bộ lệnh sudo trong dấu ngoặc kép như vậy, điều đó có thể không cần thiết.
brianmearn

4
Chỉ cần một nhận xét chung: Tôi nghĩ rằng thực tiễn tiêu chuẩn / được đề xuất là tạo một liên kết mềm / tượng trưng cho cấu hình trang web của bạn bên dưới sites-enabled, chứ không phải sao chép nó. Không liên quan đến vấn đề cụ thể của bạn, nhưng bạn có thể muốn xem xét vấn đề đó.
brianmearns

1
Bạn không nên đối mặt với thời gian chết. kill HUPlà cách để thực hiện tải lại duyên dáng trong nginx.
Jonathan Vanasco

Câu trả lời:


180

Chạy service nginx reloadhoặc/etc/init.d/nginx reload

Nó sẽ tải lại cấu hình nóng mà không có thời gian chết. Nếu bạn có các yêu cầu đang chờ xử lý, thì sẽ có các quá trình nginx còn sót lại sẽ xử lý các kết nối đó trước khi nó chết, vì vậy đây là một cách cực kỳ duyên dáng để tải lại các cấu hình.

Đôi khi bạn có thể muốn trả trước sudo


10
Cả hai nên làm chính xác những gì câu hỏi nêu: gửi SIGHUPđến quá trình chủ nginx. Không nên có sự khác biệt. nginx.org/en/docs/control.html
Gnarfoz

Khi tôi phát lệnh trên CentOS, nó sẽ tiếp tục nói "Cách sử dụng /etc/init.d/nginx (start..stop ... restart..reload)" .. và đó chính xác là cách tôi sử dụng nó. Trong tập tin /init.d/nginx tôi thấy kill -HUP cat $PIDFILE|| echo -n "không thể tải lại"
mashup

1
Bạn có biết sự khác biệt giữa service nginx reloadnginx -s reloadkhông? Nếu tôi chạy cái trước, tôi nhận được kết quả đầu ra này: Reloading nginx configuration: nginx.nhưng những thay đổi của tôi không được cập nhật. Nếu tôi chạy cái sau, tôi không nhận được kết quả nào, nhưng những thay đổi của tôi được phản ánh.
Ryan Quinn

Tôi chỉ thử điều này sau khi thêm một lệnh log_not_foundnhưng thấy rằng tôi phải thực sự khởi động lại để làm cho nó hoạt động. Tôi đoán tải lại không hoạt động cho tất cả các chỉ thị?
mydoghasworms

81

Chạy /usr/sbin/nginx -s reload

Xem http://wiki.nginx.org/CommandLine để biết thêm các tùy chọn dòng lệnh.


Cuối cùng, một lệnh hoạt động trong Debian Jessie.
nguy hiểm89

1
Đây là một cách tốt hơn. Bởi vì máy chủ của bạn không hoạt động nếu cấu hình của bạn có lỗi (chỉ hiển thị lỗi trong trường hợp này).
Mir-Ismaili

nếu nginx pid mặc định không ở vị trí mặc định, cần '-p'. tức là: `/ opt / gitlab / embed / sbin / nginx -s tải lại -p / var / opt / gitlab / nginx`
qxo

9

Không, bạn không chính xác, bạn không cần phải đối mặt với bất kỳ thời gian chết nào với quy trình bạn mô tả. (Nginx không chỉ có thể tải lại cấu hình khi đang bay mà không có bất kỳ thời gian chết nào, mà ngay cả việc nâng cấp thực thi khi đang bay, vẫn không có bất kỳ thời gian chết nào.)

Theo http://nginx.org/docs/control.html#reconfiguration , gửi HUPtín hiệu đến nginx đảm bảo rằng nó thực hiện khởi động lại duyên dáng và, nếu các tệp cấu hình không chính xác, toàn bộ quy trình sẽ bị hủy và bạn ' lại với nginx như trước khi gửi HUPtín hiệu. Tại bất kỳ thời điểm nào nên có thể ngừng hoạt động.

Để nginx đọc lại tệp cấu hình, tín hiệu HUP phải được gửi đến quy trình chính. Trước tiên, quy trình chính kiểm tra tính hợp lệ của cú pháp, sau đó thử áp dụng cấu hình mới, nghĩa là để mở tệp nhật ký và ổ cắm nghe mới. Nếu điều này không thành công, nó sẽ khôi phục các thay đổi và tiếp tục hoạt động với cấu hình cũ.


2

Thông thường, tải lại tệp cấu hình của dịch vụ sẽ không ảnh hưởng đến dịch vụ đang chạy. Tuy nhiên, điều này phụ thuộc vào cách SIGHUPxử lý tín hiệu.

Nếu một dịch vụ cụ thể gặp sự cố ngừng hoạt động trong khi tải lại, điều này có thể được tránh bằng cách chạy cùng một dịch vụ trên nhiều máy chủ tốt nhất là sử dụng bộ cân bằng tải. Trong trường hợp này, bạn có thể lấy ra một máy chủ cùng một lúc và tải lại / khởi động lại nó. Sau đó, nó có thể được thêm lại sau khi xác nhận nó là OK.


Mặc dù điều này không trực tiếp trả lời câu hỏi, nhưng đây chắc chắn là một kịch bản thực hành tốt nhất mà OP sẽ thông minh để làm theo để tránh thời gian chết nói chung.
Andrew M.

1
Chi tiết về cách nginx xử lý các tín hiệu khác nhau: nginx.org/en/docs/control.html
Gnarfoz
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.