Thứ ba, 29/10/2013 | 00:00 GMT+7

Cách thiết lập FastCGI Caching với Nginx trên VPS của bạn


Khúc dạo đầu


Nginx bao gồm một module FastCGI có các chỉ thị để lưu nội dung động vào bộ nhớ đệm được phân phát từ phần backend PHP. Việc cài đặt này loại bỏ nhu cầu về các giải pháp bộ nhớ đệm trang bổ sung như Reverse Proxy (nghĩ là Varnish ) hoặc các plugin dành riêng cho ứng dụng. Nội dung cũng có thể bị loại trừ khỏi bộ nhớ đệm dựa trên phương thức yêu cầu, URL, cookie hoặc bất kỳ biến server nào khác.

Bật FastCGI Caching trên VPS của bạn


Bài viết này giả định bạn đã cài đặt và cấu hình Nginx với PHP trên server của bạn . Chỉnh sửa file cấu hình Server ảo mà bộ nhớ đệm phải được bật.

nano /etc/nginx/sites-enabled/vhost

Thêm các dòng sau vào đầu file bên ngoài lệnh {} server :

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Lệnh “fastcgi cache path” chỉ định vị trí của bộ nhớ cache (/ etc / nginx / cache), kích thước của nó (100m), tên vùng bộ nhớ (MYAPP), cấp độ folder con và bộ đếm thời gian ` không hoạt động.

Vị trí có thể ở bất kỳ đâu trên đĩa cứng; tuy nhiên, kích thước phải nhỏ hơn RAM + Swap của server nước của bạn, nếu không bạn sẽ nhận được thông báo lỗi “Không thể cấp phát bộ nhớ”. Ta sẽ xem xét tùy chọn “cấp độ” trong phần xóa - nếu bộ nhớ cache không được truy cập trong một khoảng thời gian cụ thể được chỉ định bởi tùy chọn “không hoạt động” (60 phút ở đây), thì Nginx sẽ xóa nó.

Chỉ thị "khóa bộ nhớ cache fastcgi" chỉ định cách các tên file trong bộ nhớ cache sẽ được băm. Nginx mã hóa một file được truy cập bằng MD5 dựa trên chỉ thị này.

Tiếp theo, di chuyển chỉ thị vị trí chuyển các yêu cầu PHP sang php5-fpm. Bên trong “location ~ .php $ {}” thêm các dòng sau.

fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;

Lệnh "fastcgi cache" tham chiếu đến tên vùng bộ nhớ mà ta đã chỉ định trong chỉ thị "fastcgi cache_path" và lưu trữ bộ nhớ cache trong vùng này.

Theo mặc định, Nginx lưu trữ các đối tượng được lưu trong bộ nhớ cache trong một khoảng thời gian được chỉ định bởi bất kỳ tiêu đề nào sau đây: X-Accel-Expires / Expires / Cache-Control.

Chỉ thị "fastcgi cache valid" được sử dụng để chỉ định thời gian tồn tại của bộ nhớ cache mặc định nếu các tiêu đề này bị thiếu. Trong câu lệnh mà ta đã nhập ở trên, chỉ những câu trả lời có mã trạng thái 200 mới được lưu vào bộ nhớ đệm. Các mã phản hồi khác cũng có thể được chỉ định.

Thực hiện kiểm tra cấu hình

service nginx configtest

Reload Nginx nếu mọi thứ đều ổn

service nginx reload

Tệp vhost hoàn chỉnh sẽ giống như sau:

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    listen   80;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name example.com;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 60m;
    }
}

Tiếp theo, ta sẽ thực hiện một bài kiểm tra để xem liệu bộ nhớ đệm có hoạt động hay không.

Thử nghiệm FastCGI Caching trên VPS của bạn


Tạo file PHP xuất ra dấu thời gian UNIX.

 /usr/share/nginx/html/time.php

Chèn

<?php
echo time();
?>

Yêu cầu file này nhiều lần bằng curl hoặc trình duyệt web .

root@server:~# curl http://localhost/time.php;echo
1382986152
root@server:~# curl http://localhost/time.php;echo
1382986152
root@server:~# curl http://localhost/time.php;echo
1382986152

Nếu bộ nhớ đệm hoạt động bình thường, bạn sẽ thấy cùng một dấu thời gian trên tất cả các yêu cầu khi phản hồi được lưu vào bộ nhớ đệm. </br> </br>

Thực hiện một danh sách đệ quy về vị trí bộ nhớ cache để tìm bộ nhớ cache của yêu cầu này.

root@server:~# ls -lR /etc/nginx/cache/
/etc/nginx/cache/:
total 0
drwx------ 3 www-data www-data 60 Oct 28 18:53 e

/etc/nginx/cache/e:
total 0
drwx------ 2 www-data www-data 60 Oct 28 18:53 18

/etc/nginx/cache/e/18:
total 4
-rw------- 1 www-data www-data 117 Oct 28 18:53 b777c8adab3ec92cd43756226caf618e

Quy ước đặt tên sẽ được giải thích trong phần thanh lọc.

Ta cũng có thể làm cho Nginx thêm tiêu đề “X-Cache” vào phản hồi, cho biết bộ nhớ cache có bị bỏ sót hoặc bị tấn công hay không.

Thêm phần sau vào trên chỉ thị {} server :

add_header X-Cache $upstream_cache_status;

Reload dịch vụ Nginx và thực hiện một yêu cầu dài dòng với curl để xem tiêu đề mới.

root@server:~# curl -v http://localhost/time.php
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /time.php HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 29 Oct 2013 11:24:04 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Cache: HIT
<
* Connection #0 to host localhost left intact
1383045828* Closing connection #0

Đặt ngoại lệ bộ nhớ cache


Một số nội dung động, chẳng hạn như các trang yêu cầu xác thực sẽ không được lưu vào bộ nhớ đệm. Nội dung như vậy có thể được loại trừ khỏi bộ nhớ cache dựa trên các biến server như “request uri”, “ phương thức yêu cầu ” và “http_cookie”.

Đây là cấu hình mẫu phải được sử dụng trong ngữ cảnh server {} .

#Cache everything by default
set $no_cache 0;

#Don't cache POST requests
if ($request_method = POST)
{
    set $no_cache 1;
}

#Don't cache if the URL contains a query string
if ($query_string != "")
{
    set $no_cache 1;
}

#Don't cache the following URLs
if ($request_uri ~* "/(administrator/|login.php)")
{
    set $no_cache 1;
}

#Don't cache if there is a cookie called PHPSESSID
if ($http_cookie = "PHPSESSID")
{
    set $no_cache 1;
}

Để áp dụng biến “$ no_cache” cho các lệnh thích hợp, hãy đặt các dòng sau vào vị trí ~ .php $ {}

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

Lệnh “bỏ qua bộ nhớ cache fasctcgi” bỏ qua bộ nhớ cache hiện có cho các yêu cầu liên quan đến các điều kiện do ta đặt trước đó. Lệnh "fastcgi no cache" hoàn toàn không lưu vào bộ nhớ cache của yêu cầu nếu các điều kiện cụ thể được đáp ứng.

Xóa bộ nhớ cache


Quy ước đặt tên của bộ nhớ cache dựa trên các biến mà ta đặt cho chỉ thị “khóa bộ nhớ cache fastcgi”.

fastcgi_cache_key "$scheme$request_method$host$request_uri";

Theo các biến này, khi ta yêu cầu “ http: //localhost/time.php ”, giá trị thực sau đây sẽ là:

fastcgi_cache_key "httpGETlocalhost/time.php";

Chuyển chuỗi này qua băm MD5 sẽ xuất ra chuỗi sau:

b777c8adab3ec92cd43756226caf618e

Điều này sẽ tạo thành tên file của bộ nhớ cache như đối với các folder con mà ta đã nhập “levels = 1: 2”. Do đó, cấp đầu tiên của folder sẽ được đặt tên bằng 1 ký tự từ ký tự cuối cùng của chuỗi MD5 này là e ; cấp độ thứ hai sẽ có 2 ký tự cuối cùng sau cấp độ đầu tiên tức là 18 . Do đó, toàn bộ cấu trúc folder của cache này như sau:

/etc/nginx/cache/e/18/b777c8adab3ec92cd43756226caf618e

Dựa trên định dạng đặt tên bộ nhớ cache này, bạn có thể phát triển một tập lệnh xóa bằng ngôn ngữ yêu thích của bạn . Đối với hướng dẫn này, tôi sẽ cung cấp một tập lệnh PHP đơn giản để xóa bộ nhớ cache của một URL POST ed.

/usr/share/nginx/html/purge.php

Chèn

<?php
$cache_path = '/etc/nginx/cache/';
$url = parse_url($_POST['url']);
if(!$url)
{
    echo 'Invalid URL entered';
    die();
}
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
$hash = md5($scheme.'GET'.$host.$requesturi);
var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
?>

Gửi một yêu cầu ĐĂNG tới file này với URL để xóa.

curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php

Tập lệnh sẽ xuất ra true hoặc false dựa trên việc liệu bộ nhớ đệm có bị xóa hay không. Đảm bảo loại trừ tập lệnh này khỏi bộ nhớ cache và cũng hạn chế quyền truy cập.

Đệ trình bởi: <a rel=<ul>authorosystem href=osystemhttp://jesin.tk/[> Jesin A </a>


Tags:

Các tin liên quan

Cách phân phát nhiều blog ma trên một VPS bằng cách sử dụng server block Nginx
2013-10-21
Cách cài đặt Drupal với Nginx trên VPS Ubuntu 13.04
2013-10-16
Cách cài đặt TTRSS với Nginx cho Debian 7 trên VPS
2013-10-07
Cách biên dịch Nginx từ Nguồn trên VPS CentOS 6.4 x64
2013-09-23
Cách biên dịch Nginx từ Nguồn trên VPS CentOS 6.4 x64
2013-09-23
Cách lưu trữ nhiều ứng dụng Node.js trên một VPS duy nhất với nginx, forever và crontab
2013-09-04
Cách tối ưu hóa Nginx với PHP Pools trên VPS Ubuntu 13.04
2013-08-21
Cách cấu hình ghi log và xoay vòng log trong Nginx trên VPS Ubuntu
2013-08-20
Cách cài đặt và cấu hình Django với Postgres, Nginx và Gunicorn
2013-08-14
Cách phát trực tuyến video với Nginx và JWPlayer trên CentOS 6
2013-05-31