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:
- Một người dùng truy cập vào website thông qua giao thức HTTPS (port 443).
- 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.
- Cache Proxy (Varnish) yêu cầu content từ backend server (Nginx) và cache lại nếu chưa có.
- Backend server (Nginx) phản hồi lại dữ liệu cần thiết.
- Cache Proxy (Varnish) chuyển dữ liệu tới SSL Termination Proxy (Nginx).
- 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/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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:
1
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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:
1
|
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:
1
2
3
|
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.