Post Series: Varnish
  1. 1. Hướng dẫn cài đặt Varnish cho Nginx/Apache trên CentOS/Ubuntu
  2. 2. Varnish Agent – Công cụ quản lý và Theo dõi Varnish
  3. 3. Varnish Dashboard – Theo dõi Varnish trực quan, realtime
  4. 4. Cấu hình Varnish hoạt động với CloudFlare và Nginx
  5. 5. Cấu hình Varnish hoạt động trên 2 port khác nhau
  6. 6. Sử dụng HTTPS với Varnish

Như các bạn đã biết, Varnish không trực tiếp hỗ trợ SSL/TLS. Tuy nhiên, khi tiến hành nâng cấp blog Canh Me lên HTTPS, mình đã tìm được cách để sử dụng được HTTPS với Varnish, đó là dùng mô hình SSL Termination Proxy.

Cách thức hoạt động của mô hình SSL Termination Proxy sử dụng Nginx kết hợp với Varnish:

  1. Một người dùng truy cập vào website thông qua giao thức HTTPS (port 443).
  2. SSL Termination Proxy (Nginx) forward yêu cầu đó đến Cache Proxy (Varnish), hiện đang phục vụ giao thức HTTP (port 80). Nếu Varnish đang có bản cache content, nó ngay lập tức phản hồi lại mà không cần đến bước 5.
  3. Cache Proxy (Varnish) yêu cầu content từ backend server (Nginx) và cache lại nếu chưa có.
  4. Backend server (Nginx) phản hồi lại dữ liệu cần thiết.
  5. Cache Proxy (Varnish) chuyển dữ liệu tới SSL Termination Proxy (Nginx).
  6. SSL Termination Proxy (Nginx) mã hóa dữ liệu và gửi tới người dùng cuối.

Backend server có thể là 1 hoặc nhiều server khác nhau, tất nhiên bạn có thể sử dụng cùng 1 Nginx server làm Proxy và làm Backend.

Để cài đặt, cấu hình và sử dụng, mình đã nói chi tiết trong series về Varnish rồi. Giả sử bạn đã có một server hoạt động bình thường với Nginx và Varnish.

1. Thêm đoạn code cấu hình Nginx làm SSL Proxy

Nếu bạn sử dụng HocVPS Script thì cần edit file cấu hình domain tương ứng trong thư mục /etc/nginx/conf.d/

server {
        listen 443 ssl http2;
        server_name hocvps.com;

        # SSL
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location / {
            proxy_pass http://127.0.0.1:80;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header Host $host;
        }
}

Đoạn # SSL bạn nhớ thay thế bằng chứng chỉ tương ứng của Let’s Encrypt hoặc Comodo cùng với server_name tương ứng.

Reload lại cấu hình Nginx:

service nginx reload

2. Cấu hình Varnish redirect về HTTPS

Vẫn để Varnish listen port 80, thêm đoạn code redirect sau (cho phiên bản Varnish 4) vào file cấu hình /etc/varnish/default.vcl

sub vcl_recv {
        # Ask Varnish to fire 750 status for HTTP requests from external IPs and port 80,
        # and not from SSL Termination Proxy (Nginx).
        if ( (req.http.host ~ "^(?i)www.hocvps.com" || req.http.host ~ "^(?i)hocvps.com") && req.http.X-Forwarded-Proto !~ "(?i)https") {
                return (synth(750, ""));
        }
}

sub vcl_synth {
        # Listen to 750 status from vcl_recv.
        if (resp.status == 750) {
                set resp.status = 301;
                set resp.http.Location = "https://hocvps.com" + req.url;
                return(deliver);
        }
}

Lúc này, toàn bộ request HTTP sẽ được Varnish redirect sang HTTPS.

Reload lại cấu hình Varnish:

service varnish reload

Nếu sử dụng WordPress, có thể bạn cần thêm đoạn code sau vào file wp-config.php để WordPress kích hoạt HTTPS:

if (isset($_SERVER["HTTP_X_FORWARDED_PROTO"] ) && "https" == $_SERVER["HTTP_X_FORWARDED_PROTO"] ) {
        $_SERVER["HTTPS"] = "on";
}

Vậy là xong rồi đó, đơn giản thôi.

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

21 Comments

  1. Đinh Lê Giang 49 comment

    Cái varnish này có thể cấu hình cho nhiều domain không Luân. 1 domain thì vô tư

  2. Tuan Nguyen 1 comment

    Cái này thì hiểu đơn giản là dùng nginx reverse proxy xuống > varnish chứ ko như mọi khi varnish đứng trước nhỉ?

    Hỏi Luân thêm 1 câu là có cách nào sys code nếu load balancing nhiều Cluster Nginx ko?

    1. Luân Trần Admin

      Có cách đó, mình vẫn thấy dùng Nginx làm load balancing, bạn check trên DigitalOcean hình như có tut, mình không có link cụ thể

  3. van nguyen 26 comment

    Mình comment vào bài này có thể không đúng chủ đề mong Luân thông cảm. Mình đang phân vân giữa việc mua thêm 1 cái vps nữa từ vultr để xài song song 2 web hay theo Luân mua thêm một IP khác để chạy chung cái vps cũ cho tiết kiệm nhỉ, chi phí mua thêm IP cho VPS cũ có

    1. Việt Phương Moderator

      IP của Vultr là 3$/tháng. Tuy vậy, nếu 1VPS vẫn đảm bảo đủ băng thông và lưu lượng thì bạn không cần phải thêm VPS. Tuy vậy bạn cần 2 web 2IP làm gì vậy (do 2 web 1 VPS 1 IP vẫn bthg mà)

    1. Việt Phương Moderator

      SSL Cloudfare kích hoạt trực tiếp thì mình tưởng vẫn có file cert và key về để cài đặt trên VPS?

      1. sinhle 70 comment

        Chào ad,
        Mình kích hoạt thì được 2 cái này

        —–BEGIN CERTIFICATE—–
        MIIElDCCA3yg………………..rất dài………………………V/avqOv
        —–END CERTIFICATE—–

        —–BEGIN PRIVATE KEY—–
        MIIEvwIBADA………………..rất dài……………………….UetHZ4yg==
        —–END PRIVATE KEY—–

        Trong khi trên bài chỉ có đoạn demo ngắn ngũn này
        # SSL
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        Nhờ bạn chỉ giúp.
        cảm ơn

        1. duy13 3 comment

          bạn xài Cloudflare thì bản thân Cloudflare đã là Nginx nên bạn chỉ cần bật SSL Flexible là y như mô hình trên, loại bỏ 1 Nginx dư thừa ra

          1. a 1 comment

            Nhưng sao bật Flexible rồi, ssl xanh rồi nhưng x-cache chỉ hit với những link http còn https miss hết nhỉ

  4. Lộc 35 comment

    có phải khi cài đặt https với varnish thì cache_hit nó nhảy số chậm hơn khi không tích hợp không? tại vì mình để ý lúc chưa cài ssl thì con số ở cached_hit nó nhảy như tăng huyết áp.. cài xong rồi. nó chạy chậm…

  5. Lộc 35 comment

    Mình cũng cấu hình y chang y rắc lun.. mà toàn cached miss.. k lẽ ssl của Let’s Encrypt varnish k chấp nhận à ?

  6. Lộc 35 comment

    mình cấu hình toàn bộ i-ran i-rắc hướng dẫn. khi dùng curl thì có thông báo như sau nè:
    #curl -I https://domain.com
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Sat, 01 Jul 2017 09:16:38 GMT
    Content-Type: text/html
    Content-Length: 178
    Connection: keep-alive
    Location: https://domain.com/
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Varnish: 196711 65704
    Age: 103
    Via: 1.1 varnish-v4
    X-Cache: HIT
    Access-Control-Allow-Origin: *
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff

  7. quốc anh 10 comment

    Cho mình hỏi kĩ hơn là thêm đoạn code cấu hình Nginx làm SSL Proxy là mình thêm đoạn đó
    vào ngay đầu của file .conf phải không ạ? Tương tự, cấu hình Varnish redirect về HTTPS thì cũng thêm đoạn đó vào đầu file defaul.vcl? Mong các admin giải đáp 🙁 Làm mãi phần này mà vẫn chưa được 🙁

    1. Việt Phương Moderator

      Vào trong block server quy định nội dung website, thường có root để bạn nhận biết.
      Và đặt dưới server_name. Và Nginx sẽ đọc từ trên xuống dưới của 1 file.
      Còn trong Varnish thì bạn đặt xuống cuối cùng là ok

Comment của bạn

Your email address will not be published. Required fields are marked *