NukeViet

https://nukeviet.vn

Giao thức HTTP/2 và NukeViet

Chúng ta thường nhắc đến việc cải thiện tốc độ load trang của NukeViet. Nhiều người cho rằng, đây là việc của mã nguồn. Nhưng thực tế cho thấy tối ưu hóa mã nguồn chỉ giải quyết được 50% vấn đề, 50% còn lại thuộc về tối ưu cấu hình máy chủ. Trong bài viết này tôi sẽ đề cập đến một trong những bước cơ bản để cấu hình máy chủ phù hợp với NukeViet và cải thiện đáng kể tốc độ load trang: giao thức HTTP/2 tích hợp với máy chủ NGINX.
Giao thức HTTP/2 và NukeViet
(Điều kiện áp dụng hướng dẫn dưới đây: máy chủ nginx, hệ điều hành centos 6 trở lên, quyền sudo, site đã cài SSL).

Tại sao HTTP/2

HTTP/2 là một giao thức HTTP mới, được chuẩn hóa vào đầu năm 2015, thay thế cho HTTP/1.0 và HTTP/1.1 – những giao thức lỗi thời với một số đặc thù tác động tiêu cực đến hiệu suất của các ứng dụng Web.

HTTP/1.0 chỉ cho phép trình duyệt gửi một request (yêu cầu) tại một thời điểm trong một kết nối TCP. Trong HTTP/1.1 đã bổ sung thêm kỹ thuật pipelining (ống dẫn), nhưng việc này chỉ giúp một phần thực hiện các truy vấn song song và vẫn xảy ra tình trạng nghẽn, đơ trang (blocking). Như vậy, để tải một trang html hoàn chỉnh, trình duyệt cần tiến hành kết nối với máy chủ rất nhiều lần. Bên cạnh đó, các trường truy vấn header của giao thức HTTP/1.x quá dài dòng và lặp đi lặp lại, tạo ra lưu lượng mạng không cần thiết.

HTTP/2 đã giải quyết những vấn đề nêu trên bằng cách tối ưu hóa HTTP, cho phép trình duyệt thực hiện nhiều lần quy trình “gửi truy vấn - nhận phản hồi” (request – response) thông qua duy nhất một kết nối TCP. HTTP/2 áp dụng phương pháp mã hóa rất hiệu quả với các truy vấn header. Đặc biệt, HTTP/2 biết cách lựa chọn các request ưu tiên, cho phép các truy vấn quan trọng chạy trước và chạy nhanh hơn; Nó có khả năng xử lý các thông điệp bằng cách sử dụng định dạng nhị phân. Kết quả là, giao thức HTTP trở nên thân thiện hơn trong môi trường mạng, cho phép thực hiện các kết nối TCP ít hơn so với HTTP/1.x.
HTTP/2 có liên quan chặt chẽ với SSL. Tất cả các trình duyệt web vào thời điểm hiện nay chỉ làm việc với giao thức HTTP/2 khi website sử dụng SSL (Có chứng chỉ số SSL).

1. Nâng cấp

Để hỗ trợ giao thức HTTP/2 máy chủ nginx phải được cài từ phiên bản 1.9.5 trở lên (Trong phiên bản này đã được cài sẵn module ngx_http_v2_module) và module OpenSSL phải từ phiên bản 1.0.2 trở lên. Dưới đây sẽ hướng dẫn bạn nâng cấp lên các phiên bản mới nhất.

- Kiểm tra phiên bản:
nginx -V

Sẽ nhận được kết quả tương tự như:
nginx version: nginx/1.13.3built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)...
Nếu nginx version lớn hơn hoặc bằng 1.9.5 và OpenSSL version lớn hơn hoặc bằng 1.0.2, bạn có thể bỏ qua phần 1 này.
Nếu một trong hai điều kiện trên không được đáp ứng, thực hiện các bước tiếp theo.

- Xác định phiên bản mới nhất:
Truy cập trang http://nginx.org/download/ thông qua trình duyệt web, ta sẽ có danh sách tất cả các phiên bản nginx. Bạn cần tìm đến dòng phiên bản mới nhất. Ở thời điểm viết hướng dẫn này (12.08.2017) phiên bản mới nhất là "1.13.4".
Truy cập trang https://www.openssl.org/source/ thông qua trình duyệt web, tìm latest stable version. Ở thời điểm viết hướng dẫn này (12.08.2017) phiên bản mới nhất là "1.1.0f".
Chạy các dòng lệnh dưới đây (Thay xxx bằng các dữ liệu phù hợp mà ta vừa nhận được ở trên):
LOCAL="/usr/local/src"NGINX_VERSION=xxxOPENSSL_VERSION=xxx

- Nâng cấp:
Chạy tuần tự các câu lệnh dưới đây:
cd ${LOCAL}wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gzwget --no-check-certificate https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gztar -xvf nginx-${NGINX_VERSION}.tar.gz && \rm nginx-${NGINX_VERSION}.tar.gztar -xvf openssl-${OPENSSL_VERSION}.tar.gz && \rm openssl-${OPENSSL_VERSION}.tar.gzcd nginx-${NGINX_VERSION}nginx -V

Chép đoạn mã bắt đầu từ "configure arguments:" cho đến hết, sẽ có tương tự như sau:
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --with-http_geoip_module=dynamic

Thay thế "configure arguments:" bằng "./configure".
Thêm vào phía cuối đoạn mã trên: " --with-openssl=${LOCAL}/openssl-${OPENSSL_VERSION}".
Kết quả ta sẽ cho chạy dòng lênh tương tự như:
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --with-http_geoip_module=dynamic --with-openssl=${LOCAL}/openssl-${OPENSSL_VERSION}

Chạy dòng lệnh:
make install

Đợi đến khi quá trình cài đặt kết thúc.

2. Chỉnh sửa file cấu hình nginx của site:

File cấu hình nginx của site được đặt ở vị trí khác nhau, tùy thuộc vào từng máy chủ. Trên máy chủ của tôi nó được đặt tại vị trí: /etc/nginx/vhosts/myaccount/mysite.com.conf
Chạy dòng lệnh:
nano /etc/nginx/vhosts/myaccount/mysite.com.conf

(Chú ý: Nếu nano chưa được cài đặt trên máy chủ, bạn có thể cài nó bằng lệnh "yum install nano").
Ta sẽ thấy hiển thị nội dung của file cấu hình trên.
Tìm đến dòng:
listen 443;

Sửa thành:
listen 443 ssl http2;

Lưu thay đổi bằng tổ hợp phím CTRL+x và Enter.
Khởi động lại nginx bằng dòng lệnh:
systemctl restart nginx

3. Kiểm tra:

Bạn có thể kiểm tra việc nâng cấp bằng cách mở một trang bất kỳ của site thông qua trình duyệt Chrome. Nếu giao thức HTTP/2 được kích hoạt, bạn sẽ thấy ở góc phải phía trên trình duyệt ký hiệu HTTP/2-enabled(h2) như hình dưới đây.
Giao thức HTTP2 đã được kích hoạt trên site NukeViet
Giao thức HTTP2 đã được kích hoạt trên site NukeViet

Như vậy bạn đã cài xong giao thức HTTP/2 lên máy chủ. Từ đây tốc độ load trang trên site của bạn có sử dụng NukeViet được cải thiện đáng kể.

Tác giả: Nguyễn Anh Tú (anhtu)

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây