Varnish là một caching HTTP reverse proxy mạnh mẽ và linh hoạt. Varnish Cache sẽ tăng tốc website của bạn lên nhiều lần bằng cách tạo những dữ liệu cache của trang web rồi trả về cho người dùng mà không cần phải thông qua php xử lý, điều này sẽ giúp tăng tốc độ và giảm tải máy chủ. Khi một khách hàng yêu cầu một trang web, Varnish đầu tiên cố gắng gửi nó từ bộ nhớ cache. Nếu trang không lưu trữ, Varnish chuyển tiếp yêu cầu đến máy chủ backend, lấy về các response, lưu trữ nó trong bộ nhớ cache, và cung cấp nó cho khách hàng. Nhược điểm của Varnish là nó không hỗ trợ lưu lượng mã hóa SSL. Bạn có thể tránh các vấn đề này bằng cách sử dụng nginx cho cả giải mã SSL và backend server . Sử dụng nginx sẽ giúp làm giảm sự phức tạp của việc thiết lập, dẫn đến giảm thiểu việc thất bại trong cấu hình, tài nguyên tiêu thụ thấp hơn, và sử dụng thành phần ít hơn để duy trì. Hướng dẫn sau đây sẽ giúp cấu hình varnish 4.0 trên debian 8. Làm thế nào Varnish và nginx làm việc cùng nhau Trong hướng dẫn này, chúng ta sẽ cấu hình nginx và Varnish cho hai trang web WordPress: www.example-over-http.com will be an unencrypted, HTTP-only site. www.example-over-https.com will be a separate, HTTPS-encrypted site. Đối với lưu lượng HTTP, Varnish sẽ lắng nghe trên cổng 80. Nếu nội dung được tìm thấy trong bộ nhớ cache, Varnish sẽ serve cho nó. Nếu không, nó sẽ vượt qua các request đến nginx trên cổng 8080. Trong trường hợp thứ hai, nginx sẽ gửi nội dung request trở lại Varnish trên cùng một cổng, sau đó Varnish sẽ lưu trữ các nội dung trong bộ nhớ cache và cung cấp cho các khách hàng trên cổng 80. Đối với giao thông HTTPS, nginx sẽ lắng nghe trên cổng 443 và gửi lưu lượng giải mã đến Varnish trên cổng 80. Nếu nội dung được tìm thấy trong bộ nhớ cache, Varnish sẽ gửi nội dung không được mã hóa từ bộ nhớ cache trở lại nginx, và sẽ gửi nội dung đã mã hóa tới khách hàng. Nếu nội dung không được tìm thấy trong bộ nhớ cache, Varnish sẽ yêu cầu nó từ nginx trên cổng 8080, lưu trữ nó trong bộ nhớ cache, và sau đó gửi nội dung không được mã hóa đến frontend nginx, và sẽ gửi nội dung mã hóa đến trình duyệt của khách hàng. . Thiết lập của chúng tôi được minh họa bên dưới. Vui lòng lưu ý rằng frontend nginx và backend nginx là cùng một máy chủ: Cài đặt và cấu hình Varnish Đối với tất cả các bước trong phần này, thay thế 203.0.113.100 với địa chỉ IPv4 pubilc của bạn, và 2001: db8 :: 1234 với địa chỉ IPv6 của bạn. 1. Cập nhật kho gói của bạn và cài đặt Varnish: Mã: apt-get update apt-get install varnish 2. Mở tập tin /etc/default/varnish. 2.1 Để chắc chắc Varnish bắt đầu lúc khởi động, dưới dòng Should we start varnishd at boot? thiết lập Start thành Yes Mã: START=yes 2.2 Trong phần Alternative 2, thực hiện những thay đổi sau đây đến DAEMON_OPTS: Mã: [/SIZE] DAEMON_OPTS="-a :80 \ -T localhost:6082 \ -f /etc/varnish/custom.vcl \ -S /etc/varnish/secret \ -s malloc,1G" [SIZE=5] Điều này sẽ thiết lập Varnish lắng nghe trên cổng 80 và sẽ hướng dẫn nó để sử dụng các tập tin cấu hình custom.vcl. Các tập tin cấu hình tùy chỉnh được sử dụng để cập nhật trong tương lai đối với Varnish để không ghi đè nên tập tin default.vcl. Dòng -s malloc, 1G thiết lập dung lượng tối đa của RAM sẽ được sử dụng bởi Varnish để lưu trữ nội dung. Giá trị này có thể được điều chỉnh cho phù hợp với nhu cầu của bạn. Ví dụ, trên một hệ thống với bộ nhớ RAM 4GB, bạn có thể phân bổ 2 hoặc 3 GB cho Varnish. Khi bạn đã thực hiện những thay đổi, lưu và thoát khỏi các tập tin. Tạo một tập tin cấu hình tùy chỉnh Varnish 1. Để bắt đầu tùy biến cấu hình Varnish của bạn, tạo ra một tập tin mới gọi custom.vcl: Mã: touch /etc/varnish/custom.vcl 2. Trước tiên, xác định phiên bản VCL sử dụng bằng cách thêm dòng: Mã: vi /etc/varnish/custom.vcl vcl 4.0; 3. Chỉ định rằng backend (nginx) đang lắng nghe trên cổng 8080, bằng cách thêm các chỉ thị phụ trợ mặc định: Mã: backend default { .host = "localhost"; .port = "8080"; } 4. Cho phép yêu cầu bộ nhớ ache-purging chỉ từ localhost bằng cách sử dụng chỉ thị acl: Mã: acl purger { "localhost"; "203.0.113.100"; "2001:DB8::1234"; } Hãy nhớ để thay thế địa chỉ IP thực của bạn cho các địa chỉ trong ví dụ. 5. Tạo vcl_recv routine, được sử dụng khi yêu cầu được gửi bởi một khách hàng HTTP. Mã: sub vcl_recv { } Các thiết lập trong các bước sau đây cần được đặt bên trong vcl_recv: 5.1 Chuyển hướng yêu cầu HTTP tới HTTPS cho website SSL của chúng tôi: Mã: if (client.ip != "127.0.0.1" && req.http.host ~ "example-over-https.com") { set req.http.x-redir = "https://www.example-over-https.com" + req.url; return(synth(850, "")); } Hãy nhớ thay thế tên miền của riêng bạn. 5.2 Cho phép yêu cầu cache-purging chỉ từ các địa chỉ IP. Nếu một yêu cầu đến từ một địa chỉ IP khác, một thông báo lỗi sẽ được hiển thị: Mã: if (req.method == "PURGE") { if (!client.ip ~ purger) { return(synth(405, "This IP is not allowed to send PURGE requests.")); } return (purge); } 5.3 Thay đổi tiêu đề X-Forwarded-For: Mã: if (req.restarts == 0) { if (req.http.X-Forwarded-For) { set req.http.X-Forwarded-For = client.ip; } } 5.4 Loại trừ các yêu cầu POST hoặc những người có chứng thực cơ bản từ bộ nhớ đệm: Mã: if (req.http.Authorization || req.method == "POST") { return (pass); } 5.5 Loại trừ RSS feeds từ bộ nhớ đệm: Mã: if (req.url ~ "/feed") { return (pass); } 5.6 Nói Varnish không cache trang đăng nhập WordPress admin: Mã: if (req.url ~ "wp-admin|wp-login") { return (pass); } 5.7 WordPress thiết lập nhiều cookie có thể an toàn để bỏ qua Để loại bỏ chúng, thêm những dòng sau đây .: Mã: set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", ""); set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", ""); if (req.http.cookie == "") { unset req.http.cookie; } Các thiết lập sau được đặt sau dấu } của sub vcl_recv. 6. Chuyển HTTP tới HTTPS sử dụng chỉ thị phân vcl_synth với các cài đặt sau: Mã: sub vcl_synth { if (resp.status == 850) { set resp.http.Location = req.http.x-redir; set resp.status = 302; return (deliver); } } 7. Cache-purging cho một trang cụ thể phải xảy ra mỗi khi chúng ta thực hiện chỉnh sửa đến trang. Để thực hiện điều này, chúng tôi sử dụng chỉ thị sub vcl_purge: Mã: sub vcl_purge { set req.method = "GET"; set req.http.X-Purger = "Purged"; return (restart); } 8. Chỉ thị sub vcl_backend_response được sử dụng để xử lý các thông tin liên lạc với backend nginx. Chúng tôi sử dụng nó để thiết lập khoảng thời gian mà nội dung vẫn còn trong bộ nhớ cache và bạn có thể điều chỉnh các thiết lập dựa trên nhu cầu của bạn: Mã: sub vcl_backend_response { set beresp.ttl = 24h; set beresp.grace = 1h; 9. Trước khi kết thúc khối vcl_backend_response với một dấu }, cho phép cookie được thiết lập chỉ khi bạn đang trên trang quản trị hoặc các trang WooCommerce cụ thể: Mã: if (bereq.url !~ "wp-admin|wp-login|product|cart|checkout|my-account|/?remove_item=") { unset beresp.http.set-cookie; } } Hãy nhớ include trên bất kỳ trang nào yêu cầu cookie để làm việc, ví dụ phpmyadmin | webmail | postfixadmin, vv Nếu bạn thay đổi trang WordPress đăng nhập từ wp-login.php đến cái gì khác, cũng nên thêm vào đoạn mã này. 10. Thay đổi tiêu đề cho yêu cầu thanh lọc bằng cách thêm chỉ thị sub vcl_deliver: Mã: sub vcl_deliver { if (req.http.X-Purger) { set resp.http.X-Purger = req.http.X-Purger; } } Bây giờ bạn có thể lưu và thoát khỏi tập tin Chỉnh sửa Varnish Startup Configuration Đối với Varnish để làm việc đúng cách, chúng ta cũng cần phải chỉnh sửa các tập tin /lib/systemd/system/varnish.service để sử dụng tập tin cấu hình tùy chỉnh của chúng tôi. Mở /lib/systemd/system/varnish.service và tìm ra hai dòng bắt đầu với ExecStart và sửa đổi chúng để trông giống như này .: Mã: ExecStartPre=/usr/sbin/varnishd -C -f /etc/varnish/custom.vcl ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/custom.vcl -S /etc/varnish/secret -s malloc,1G Sau khi lưu và thoát khỏi tập tin, tải lại quá trình systemd: Mã: systemctl daemon-reload Cài đặt và cấu hình PHP Trước khi cấu hình nginx, chúng ta phải cài đặt PHP-FPM. 1. Cài đặt PHP-FPM: Mã: apt-get install php5-fpm php5-mysql 2. Mở tập tin /etc/php5/fpm/php.ini. Tìm chỉ thị cgi.fix_pathinfo =, uncomment và thiếp lập về 0 Mã: cgi.fix_pathinfo=0 Sau khi bạn đã thực hiện thay đổi này, lưu và thoát khỏi tập tin. 3. Mở /etc/php5/fpm/pool.d/www.conf và xác nhận rằng chỉ thị listen = , trong đó quy định các socket được sử dụng bởi nginx để vượt qua các yêu cầu tới PHP-FPM, phù hợp với những điều sau đây: Mã: listen = /var/run/php5-fpm.sock Lưu và thoát khỏi tập tin. 4. Khởi động lại PHP-FPM: Mã: systemctl restart php5-fpm 5. Mở /etc/nginx/fastcgi_params và tìm thấy những chỉ thị fastcgi_param HTTPS và thêm hai dòng sau đây, rất quan trọng cho nginx để tương tác với các dịch vụ FastCGI: Mã: fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param PATH_INFO $fastcgi_path_info; Một khi bạn đã hoàn tất, lưu và thoát khỏi tập tin. Cấu hình nginx 1. Mở /etc/nginx/nginx.conf và comment chỉ thị ssl_protocols và ssl_prefer_server_cipher. Chúng tôi sẽ bao gồm các thiết lập SSL trong khối máy chủ trong tập tin /etc/nginx/sitesenabled/default: Mã: # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE # ssl_prefer_server_ciphers on;[/SIZE][/SIZE][/SIZE] 2. Kể từ khi các bản log truy cập và bản ghi lỗi sẽ được xác định cho mỗi trang web cá nhân trong khối máy chủ, comment chỉ thị access_log và error_log: Mã: [/SIZE] # access_log /var/log/nginx/access.log; # error_log /var/log/nginx/error.log; [SIZE=5] Lưu và thoát khỏi các tập tin. 3. Tiếp theo, chúng ta sẽ cấu hình trang web HTTP, www.example-over-http.com Bắt đầu bằng cách làm cho một bản sao lưu của khối máy chủ mặc định (virtual host): Mã: mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default-backup 4. Mở một tập tin /etc/nginx/sites-available/default và thêm khối sau: Mã: [/SIZE] server { listen 8080; listen [::]:8080; server_name example-over-http.com; return 301 http://www.example-over-http.com$request_uri; } server { listen 8080; listen [::]:8080; server_name www.example-over-http.com; root /var/www/html/example-over-http.com/public_html; port_in_redirect off; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php5-fpm.sock; } error_log /var/www/html/example-over-http.com/logs/error.log notice; } [SIZE=5] 5. Để cấu hình nginx cho các trang web được mã hóa SSL (trong ví dụ của chúng tôi, chúng tôi gọi nó là www.example-over-https.com), bạn cần hai khối máy chủ. Nối các khối máy chủ sau vào tập tin /etc/nginx/sites-available/default: Mã: server { listen 443 ssl; listen [::]:443 ssl; server_name www.example-over-https.com; port_in_redirect off; ssl on; ssl_certificate /etc/nginx/ssl/ssl-bundle.crt; ssl_certificate_key /etc/nginx/ssl/example-over-https.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:20m; ssl_session_timeout 60m; add_header Strict-Transport-Security "max-age=31536000"; add_header X-Content-Type-Options nosniff; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Host $http_host; 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 HTTPS "on"; access_log /var/www/html/example-over-https.com/logs/access.log; error_log /var/www/html/example-over-https.com/logs/error.log notice; } } server { listen 8080; listen [::]:8080; server_name www.example-over-https.com; root /var/www/html/example-over-https.com/public_html; index index.php; port_in_redirect off; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS on; fastcgi_pass unix:/var/run/php5-fpm.sock; } } Đối với một trang web được mã hóa SSL, bạn cần một khối máy chủ để nhận được lưu lượng trên cổng 443 và vượt qua lưu lượng giải mã đến Varnish trên cổng 80, và một khối máy chủ để serve lưu lượng không được mã hóa đến Varnish trên cổng 8080, khi Varnish yêu cầu nó. 6. Tùy chọn: Để ngăn chặn truy cập đến trang web của bạn thông qua đầu vào trực tiếp của địa chỉ IP của bạn vào trình duyệt, bạn có thể đặt khối máy chủ mặc định phải ở trên cùng của tập tin: Mã: [/SIZE] server { listen 8080 default_server; listen [::]:8080; server_name _; root /var/www/html; index index.html; } Tập tin /var/www/html/index.html có thể chứa một thông điệp đơn giản như "Trang không tìm thấy!" Khởi động lại nginx, sau đó bắt đầu Varnish: Mã: systemctl restart nginx systemctl start varnish[/SIZE][/SIZE][/SIZE] 8. Tiếp theo bạn cần cai đặt wordpress, sau đó mới tiếp tục bước này. 9. Sau khi cài đặt WordPress, khởi động lại Varnish để xóa bất kỳ đổi hướng lưu trữ vào trang thiết lập: Mã: systemctl restart varnish Cài đặt WordPress "Varnish HTTP Purge" Plugin Khi bạn chỉnh sửa một trang WordPress và cập nhật nó, việc sửa đổi sẽ không được hiển thị ngay cả khi bạn làm mới trình duyệt vì nó sẽ nhận được phiên bản cache của trang. Để tẩy trang lưu trữ tự động khi bạn chỉnh sửa một trang, bạn phải cài đặt một plugin WordPress miễn phí gọi là "HTTP Purge Varnish." Để cài đặt plugin này, đăng nhập vào trang web WordPress của bạn và bấm vào Plugins trên sidebar trái. Chọn Add New ở phía trên cùng của trang, và tìm kiếm Varnish HTTP Purge. Khi bạn đã tìm thấy nó, bấm Install Now, sau đó Activate . Kiểm tra cài đặt của bạn Để kiểm tra xem Varnish và nginx có đang làm công việc của mình đối với trang web HTTP, chạy lệnh: Mã: wget -SS http://www.example-over-http.com Mã: --2016-11-04 16:48:43-- http://www.example-over-http.com/ Resolving www.example-over-http.com (www.example-over-http.com)... your_server_ip Connecting to www.example-over-http.com (www.example-over-http.com)|your_server_ip|:80... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Sat, 26 Mar 2016 22:25:55 GMT Content-Type: text/html; charset=UTF-8 Link: <http://www.example-over-http.com/wp-json/>; rel="https://api.w.org/" X-Varnish: 360795 360742 Age: 467 Via: 1.1 varnish-v4 Transfer-Encoding: chunked Connection: keep-alive Accept-Ranges: bytes Length: unspecified [text/html] Saving to: \u2018index.html.2\u2019 index.html [ <=> ] 12.17K --.-KB/s in 0s 2016-03-27 00:33:42 (138 MB/s) - \u2018index.html.2\u2019 saved [12459] Dòng thứ ba xác định số lượng cổng kết nối: 80. Các backend server được xác định một cách chính xác: Server: nginx/1.6.2 Và lưu lượng đi qua Varnish như dự định :Via: 1.1 varnish-v4. Các khoảng thời gian các đối tượng đã được giữ trong bộ nhớ cache của Varnish cũng được hiển thị theo đơn vị giây: Age: 467. Để kiểm tra các trang web được mã hóa SSL, chạy lệnh tương tự, thay thế URL: Mã: wget -SS https://www.example-over-https.com Đầu ra phải được tương tự như các trang web HTTP. Nếu bạn đang sử dụng một self-signed certificate trong khi thử nghiệm, thêm tùy chọn --no-check-certificate cho lệnh wget: Mã: wget -SS --no-check-certificate https://www.example-over-https.com