Cài đặt Nginx với Pagespeed từ Source

UPDATE 9/2020: Bạn cần cài phiên bản mới nhất của NGINX bằng hướng dẫn sau:
https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#prebuilt_debian. Sau đó mới cài đặt các bước của bài này, nếu không sẽ xảy ra tình trạng không tương thích thư viện.


Bạn có thể biết hoặc chưa biết đến dịch vụ kiểm tra chất lượng một website từ Google: https://developers.google.com/speed/pagespeed/insights/?hl=vi

Để đáp ứng các yêu cầu của Google, nginx có hỗ trợ chúng ta cài thêm một plugin là ngx_pagespeed: https://github.com/apache/incubator-pagespeed-ngx

Tôi sẽ hướng dẫn cài đặt vào máy chủ Debina 9 (stretch), Ubuntu cũng tương tự như vậy.

Yêu cầu trước cài đặt

Các thư viện sau bắt buộc phải có:

  • OpenSSL library 1.0.2 - 1.1.0
  • Zlib library 1.1.3 - 1.2.11
  • PCRE library 4.4 - 8.40
  • GCC Compiler

Tiến trình cài đặt

Mời bạn làm theo thứ tự từ trên xuống dưới. Đầu tiên tôi sẽ cài đặt trước nginx bản tiêu chuẩn từ apt để nó thiết lập các thông tin cần thiết.

Tôi giả định là bạn đã có những thiết lập cơ bản nhất cho một máy chủ Debian mới toanh. Nếu chưa thì đọc những tổng hợp của tôi tại: https://gist.github.com/anhtran/07f1c7f45ec0d58d09e1

Cài nginx bản tiêu chuẩn

wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
echo "deb-src http://nginx.org/packages/mainline/debian/ stretch nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install -y nginx

Nếu mọi thứ diễn ra suông sẻ, bạn sẽ có tìm được tệp cài đặt chung:

ls -la /etc/nginx/nginx.conf

Bật nginx mới cài lên và kiểm tra trạng thái:

sudo service nginx start
sudo service nginx status
sudo lsof -i :80

Build ngx_pagespeed from Source

Cài công cụ build:

sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw zlib1g-dev libpcre3 libpcre3-dev unzip uuid-dev

Thư viện hỗ trợ:

sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Dừng service nginx hiện có:

sudo service nginx stop

Cài đặt ngx_pagespeed

bash <(curl -f -L -sS https://ngxpagespeed.com/install) --nginx-version latest

Lưu ý: nếu cài đè vào phiên bản đang có thì phải nhập chính xác số phiên bản thay vì latest.

Khi được hỏi Do you have any additional ./configure
arguments you would like to set?
, thì bạn nhập vào:

    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --modules-path=/usr/lib/nginx/modules \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --user=nginx \
    --group=nginx \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --with-openssl-opt=enable-ec_nistp_64_gcc_128 \
    --with-openssl-opt=no-nextprotoneg \
    --with-openssl-opt=no-weak-ssl-ciphers \
    --with-openssl-opt=no-ssl3 \
    --with-pcre-jit \
    --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_slice_module \
    --with-http_ssl_module \
    --with-http_sub_module \
    --with-http_stub_status_module \
    --with-http_v2_module \
    --with-http_secure_link_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-stream \
    --with-stream_realip_module \
    --with-stream_ssl_module \
    --with-stream_ssl_preread_module \
    --with-debug \
    --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' \
    --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now'

Khi trình cài đặt hỏi thêm lựa chọn thì bạn cứ chọn mặc định (Enter).

Kiểm tra phiên bản và các modules:

sudo nginx -V
nginx version: nginx/1.16.0
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
built with OpenSSL 1.1.0j  20 Nov 2018
TLS SNI support enabled
configure arguments: --add-module=/home/admin/incubator-pagespeed-ngx-latest-stable --prefix=/etc/nginx ...

Quan trọng hơn hết là bạn phải thấy được dòng --add-module=/home/admin/incubator-pagespeed-ngx-latest-stable

Nói thẳng là ở đây tôi lười cài đặt service vào systemd nên mới chơi chiêu cài nginx tiêu chuẩn trước. Cách này nó hơi hacky nhưng tôi luôn thấy hiệu quả.

Bạn cần tạo một file /etc/nginx/core.conf với nội dung:

## PageSpeed configurations
pagespeed on;
pagespeed ProcessScriptVariables on;
pagespeed FetchWithGzip on;

## PageSpeed filter settings
pagespeed RewriteLevel CoreFilters;
pagespeed RespectVary off;
pagespeed DisableRewriteOnNoTransform off;
pagespeed SupportNoScriptEnabled false;
pagespeed ModifyCachingHeaders on;
pagespeed ListOutstandingUrlsOnError on;
pagespeed MaxCacheableContentLength -1;
pagespeed FileCachePath /var/cache/nginx/pagespeed;
pagespeed FileCacheSizeKb            102400;
pagespeed FileCacheCleanIntervalMs   3600000;
pagespeed FileCacheInodeLimit        500000;
pagespeed LRUCacheKbPerProcess     1024;
pagespeed LRUCacheByteLimit        16384;

## Speed up PageSpeed by storing it in the super duper fast memcached
pagespeed MemcachedThreads 1;
pagespeed MemcachedServers "localhost:11211";

## PageSpeed admin pages configuration
pagespeed UsePerVhostStatistics on;
pagespeed Statistics on;
pagespeed StatisticsLogging on;
pagespeed StatisticsLoggingIntervalMs 60000;
pagespeed StatisticsLoggingMaxFileSizeKb 1024;
pagespeed MessageBufferSize 100000;
pagespeed LogDir /var/log/pagespeed;
pagespeed StatisticsPath /ngx_pagespeed_statistics;
pagespeed GlobalStatisticsPath /ngx_pagespeed_global_statistics;
pagespeed MessagesPath /ngx_pagespeed_message;
pagespeed ConsolePath /pagespeed_console;
pagespeed AdminPath /pagespeed_admin;
pagespeed GlobalAdminPath /pagespeed_global_admin;
pagespeed CriticalImagesBeaconEnabled false;

## PageSpeed Cache Purge
pagespeed EnableCachePurge on;
pagespeed PurgeMethod PURGE;
pagespeed DownstreamCacheRewrittenPercentageThreshold 95;

# Thêm các filter vào cho toàn bộ website dùng nginx
# bạn hoàn toàn có thể cấu hình trong từng site để đạt sự linh hoạt

Thêm file /etc/nginx/core.conf vào /etc/nginx/nginx.conf ngay trước dòng include /etc/nginx/conf.d/*.conf; để nginx có thể nhận dạng các cấu hình về pagespeed của chúng ta.

Cuối cùng tôi sẽ kiểm tra lỗi cấu hình:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nhớ bật service nginx lên:

sudo service nginx start
sudo service nginx status

Hmm, nếu báo lỗi không tạo được thư mục thì follow thông tin báo lỗi rồi tạo thư mục tương ứng. Chú ý phân quyền cho đúng user là nginx. Ví dụ:

sudo mkdir /var/lib/nginx/body -p
sudo chown nginx:nginx -R /var/lib/nginx

Mọi thứ đều rất ổn cho tới bây giờ. Hãy truy cập vào https://www.modpagespeed.com/doc/, xem phần Reference, đọc lần lượt các filter sau đó thêm vào website mà bạn muốn.

Những filters tôi hay sử dụng:

server {
    listen       443 ssl http2;
    listen 		 [::]:443 ssl http2;
    server_name  anhtran.net;

    root   /home/admin/webapps/anhtran.net;
    index  index.html index.htm;
    
    pagespeed EnableFilters collapse_whitespace;
    pagespeed EnableFilters combine_css;
    pagespeed EnableFilters combine_heads;
    pagespeed EnableFilters combine_javascript;
    pagespeed EnableFilters make_google_analytics_async;
    pagespeed EnableFilters remove_comments;
    pagespeed EnableFilters defer_javascript;
    ...

Chúc bạn thành công!

UPDATE: Một lưu ý quan trọng, bạn không nên gõ sudo apt upgrade mà trong danh sách upgrade có nginx. Nếu không nó sẽ cài đè vào bản hiện hành và bạn phải build lại từ đầu.