Nâng cấp Nginx

Quy trình nâng cấp 1 phần mềm trên hệ thống thường bao gồm các bước sau:

  1. Ngừng dịch vụ đang chạy
  2. Sao lưu các cấu hình, dữ liệu của phần mềm đang sử dụng.
  3. Gỡ bỏ phiên bản hiện tại của phần mềm cần cập nhật.
  4. Cài đặt phiên bản mới hơn của phần mềm đó.
  5. Cấu hình phần mềm sau khi cập nhật.
  6. Chạy lại dịch vụ đó.

Bước 2 và 3 có thể được gộp lại thành 1 bước là cài đặt phiên bản mới của phần mềm đè lên phiên bản hiện tại.

Và việc nâng cấp Nginx thông thường cũng không nằm ngoài các bước trên.

Tuy nhiên, với cách làm như trên thì sẽ dẫn đến tình trạng là dịch vụ, website không thể kết nối trong suốt thời gian được nâng cấp, điều này ảnh hưởng đến uptime của hệ thống, nhất là trong những hệ thống, website lớn có lượng truy cập cao, việc để xuất hiện các khoảng thời gian chết này sẽ gây ảnh hưởng không nhỏ đến hoạt động của hệ thống.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu 1 kỹ thuật cập nhật được hỗ trợ trong Nginx mà không gây ảnh hưởng, gián đoạn đến hoạt động của Nginx trong suốt quá trình cập nhật.

  1. Biên dịch mã nguồn phiên bản mới của Nginx, trong trường hợp này chúng ta ví dụ với phiên bản Nginx 1.4.7
# cd nginx-1.4.7
# ./configure
# make

Lưu ý: tùy vào nhu cầu sử dụng mà chúng ta sẽ bổ sung thêm các tùy chọn cấu hình trong lệnh configure ở trên.

2. Thay thế tập tin nhị phân cũ của Nginx (mặc định là /usr/local/nginx/sbin/nginx) bằng tập tin nhị phân mới vừa biên dịch ở bước 1.

# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bk
# mv nginx-1.4.7/objs/nginx /usr/local/nginx/sbin/

3. Tìm ra giá trị pid của tiến trình master đang chạy của Nginx.

# ps x |grep nginx |grep master
1209    ?    Ss    0:00    nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

=> Giá trị pid là 1209

4. Gửi tín hiệu USR2 đến tiến trình master bằng lệnh

# kill -USR2 ***

với *** là pid mà chúng ta vừa tìm được ở bước 3.

# kill -USR2 1209

Điều này sẽ khởi tạo quá trình nâng cấp bằng việc đổi tên tập tin *.pid cũ và chạy tập tin nhị phân mới.

Lúc này hệ thống của chúng ta sẽ có 2 tiến trình master cùng chạy

# ps x |grep nginx |grep master
1209 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf => Tiến trình cũ
3837 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf => Tiến trình mới

5. Gửi tín hiệu WINCH đến tiến trình master cũ bằng lệnh

# kill -WINCH ***

với *** là pid của tìm được ở bước 3.

# kill -WINCH 1209

Điều này sẽ tắt các tiến trình worker cũ đang chạy.

5. Đảm bảo rằng tất cả tiến trình worker cũ đã được hủy

# ps x |grep nginx |grep worker

Sau đó gửi tín hiệu QUIT đến tiến trình master cũ bằng lệnh

# kill -QUIT ***

với *** là pid tìm được ở bước 3.

# kill -QUIT 1209

Tiến trình master cũ đã được hủy

# ps x | grep nginx | grep master
3837 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

Như vậy chúng ta đã nâng cấp thành công Nginx mà không gây ảnh hưởng đến hoạt động của Nginx trong suốt quá trình này, cũng như không làm mất bất kỳ kết nối nào.