運維實戰:FastCGI相關調優
作用
可以緩存fastcgi
生成的內容,很多情況是php生成的動態的內容。簡單來說就是將動態頁面緩存到內存或者硬盤上,如果符合條件則直接讀取緩存,不再與PHP 通信,可以提升訪問速度,提高用戶體驗。一般而言用戶在打開網頁速度在1-2s體驗是非常好的,其頁面中包含其他的資源慢一些都是可以接受。
環境介紹
服務器IP |
Nginx版本 |
域名 |
192.168.123.36 |
Nginx1.6.3 |
www.test.com |
圖 1. 基本環境
FastCGI cache配置
1.nginx.conf配置
user www www;
worker_processes 8;
worker_rlimit_nofile 51200;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
events {
worker_connections 40960;
use epoll;
}
http {
charset utf-8;
include vhosts/*.conf;
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
send_timeout 60;
client_max_body_size 8m;
keepalive_timeout 60;
server_tokens off;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
fastcgi_cache_path /cache/fastcgi_cache levels=1:2 keys_zone=CGI_Cache:10m inactive=5m max_size=1g;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
add_header X-via $server_addr;
add_header X-Cache $upstream_cache_status;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
server_names_hash_max_size 4096;
server_names_hash_bucket_size 2048;
gzip off;
gzip_min_length 1k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/css application/javascript text/xml;
error_log logs/error.log error;
server {
listen 80 default;
return 444;
}
server {
listen 80;
server_name www.test.com;
root html/test;
location / {
index index.html index.htm index.php;
}
location ~* \.(jpg|gif|jpeg|bmp|png|ico|txt|js|css)$
{
expires 7d;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache CGI_Cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
}
}
}
2.測試代碼
<html>
<head>
<title>TEST PAGE</title>
</head>
<body>
<?php echo '<p>I AM CACHE???</p>'; ?>
</body>
</html>
3.參數詳解
fastcgi_cache_path /cache/fastcgi_cache levels=1:2 keys_zone=CGI_Cache:10m inactive=5m max_size=1g;
#inactive 爲非活動時間爲3分鐘
#levels 第一位表示使用1級子目錄,冒號隔開第二位表示使用2級子目錄。最多使用三級。1表示每個一級子目錄的名字只能使用1個字符,內存中找多少空間存儲鍵。
fastcgi_connect_timeout 300;
#Nginx服務器與後端FastCGI服務器連接的超時時間;
fastcgi_send_timeout 300;
#Nginx允許FastCGI服務器返回數據的超時時間,否則Nginx則斷開連接;
add_header X-via $server_addr;
add_header X-Cache $upstream_cache_status;
#自定義響應報文的首部;
#$upstream_cache_status 該變量來顯示緩存的狀態
fastcgi_buffer_size 64k;
#Nginx FastCGI的緩衝區大小,用於讀取從FastCGI收到的第一部分相應信息的緩衝大小;
fastcgi_buffers 4 64k;
#設定本地需要用多少和多大的緩衝區來緩衝FastCGGI的請求。如果一個PHP腳本所產生的頁面爲256KB,那麼就會分配4個64KB的緩衝區來存放數據,大於256的被放置Fastcgi臨時文件目錄,該目錄位於磁盤。
fastcgi_busy_buffers_size 128k;
#用於設置系統繁忙時候的fastcgi_buffers大小;值必須大於fastcgi_buffer,一般爲其2倍;
fastcgi_temp_file_write_size 128k;
#FastCGI臨時文件大小,一般設置爲128 - 256 KB;
server_names_hash_max_size 4096;
server_names_hash_bucket_size 2048;
#設定用於哈希域名的內存空間,Nginx會把server中的域名哈希至內存,當客戶端請求時,會把客戶端的請求結果與內存空間中的域名進行比對,其速度提升顯著;
fastcgi_cache CGI_Cache;
#表示使用哪個內存空間;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
#設定各個狀態碼的緩存週期;
ignore_invalid_headers on;
#如果有首部無法理解就直接忽略;
fastcgi_cache_min_uses 1;
#表示請求幾次將其緩存;
factcgi_store on;
fastcgi_store_access user:rw group:rw all:r;
fastcgi_temp_path /data/temp;
#暫存fastcgi自己處理的結果,內存空間不夠的時候才這麼用,會導致性能會下降。一般不建議這麼用,應該加大buffer值;
factcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#SCRIPT_FILENAME 用戶請求的腳本文件名,通過URI的方式向後端傳遞;
#fastcgi_cache_use_stale xxxx;
#指明Nginx在什麼情況下使用過期的緩存,類似於proxy_cache中的參數;
4.測試緩存效果
如果Nginx重啓失敗,原因可能是沒有權限創建目錄。以www用戶爲例對目錄授權,mkdir /cache/fastcgi_cache && chown -R www. /cache/fastcgi_cache
圖4.1 檢測 cache manager 是否存在
圖4.2 第一次請求結果
圖4.3 緩存結果
圖4.4 再次請求查看結果 - 緩存命中