Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> 電腦軟件教程 >> 服務器技術 >> 關於服務器 >> Nginx配置proxy

Nginx配置proxy

日期:2017/2/8 10:12:44      編輯:關於服務器

proxy_cache方式跟memcached內存級別的緩存還是不能比擬,但nginx目前還不能做memcached的write動作,所以簡單配置proxy_cache也能抵擋不少鴨梨。

沒有配置好proxy_cache
但在網絡上搜索幾篇文章以後,發現大家寫的很模糊,很多文章都是抄襲復制品。所以按照網絡上的教程,我一開始是這麼配置的:

在http段增加:

 代碼如下  

proxy_cache_path  /tmp/qttc_cache levels=1:2 keys_zone=qttc:200m inactive=1d max_size=10g;

然後在server中找到你要緩存的location,增加:

 代碼如下  

proxy_cache qttc;

意思表示開啟這個location的緩存,但是我重啟nginx以後,重新訪問站點發現在緩存目錄下並沒有生成緩存文件。於是,我首先這麼做:

一、會不會是浏覽器有緩存,於是我清空浏覽器,甚至使用其它浏覽器訪問站點,並且按狂刷。結果還是沒有生成靜態文件。

二、會不會是nginx自動判斷我的內容,太少就不會緩存。於是我賦值了一大堆字符串到一個文件中,然後使用浏覽器狂訪問那個文件,結果還是沒有生成靜態文件。

於是到網上搜索,結果也沒有搜索到有用的信息。難道我安裝的nginx有問題?重新從官網下載編譯安裝,還是沒有解決問題。

原來是這樣工作的
後來不斷的摸索,仔細研究。發現還要添加以下兩條才能讓proxy_cache工作,

proxy_cache_valid  200 304 302 24h;

指定各個狀態碼下緩存的時間,200是很重要的,如果有其它的要緩存可以在後邊加上

 代碼如下  

proxy_pass http://www.45it.net;

指定獲取靜態內容的地址,其實proxy_cache的原理就是從一個你指定的地址獲取內容,然後緩存。當下次你訪問時,nginx會自動判斷有沒有緩存文件?如果有的話緩存文件是不是已經過期(緩存文件的有效期就是第一條設置的)?如果前面兩條任何一條成立就會從proxy_pass的地址重新獲取頁面信息。

於是經過配置以後,終於能生成緩存文件了:

 代碼如下  

[root@lee qttc_cache]# ll
總用量 24
drwx------ 3 www www 4096 7月  19 08:55 4
drwx------ 5 www www 4096 7月  19 08:55 8
drwx------ 3 www www 4096 7月  19 08:55 a
drwx------ 3 www www 4096 7月  19 08:55 c
drwx------ 3 www www 4096 7月  19 08:55 d
drwx------ 3 www www 4096 7月  19 08:55 e

 
可惜,如果你要清空緩存,可以在後台加一個功能使用後端語言刪除,或者使用一個Purge插件通過IP加端口訪問的方式來清楚緩存文件。

PS.
如果你要清楚某一個url的緩存文件,就比較悲催了。但也不是不能做到。因為nginx生成url文件的時候,存放的目錄以及生成的哈希文件名都是固定的,你也可以使用proxy_cache_key來指定生成的key的字段內容。

如果你掌握它的生成規則,你就可以寫一個管理器來快速清空單個url緩存。最爛的方法也可以把緩存目錄清空,接著訪問你要需要單獨清空的url,然後再到緩存目錄裡看看生成的緩存目錄與文件名,再你需要單獨清空這個url的緩存時直接把文件干掉就好。

因為proxy_cache需要proxy_pass配置才能生成緩存內容,而目前一般的站點配置中,比如PHP站點都是把php頁面proxy_pass到後台PHP程序處理,所以你可以在處理php的location裡加上proxy_cache把php動態語言生成的內容結果緩存。對於那些靜態文件其實也不需要什麼proxy_cache來緩存,因為靜態文件跟proxy_cache最終生成的緩存文件一樣都是在磁盤上的一個文件。

因此正確的描述是:它是一個重定向,反向代理的緩存功能,不是根據url生成緩存靜態文件的功能


下面我把我的全部配置代碼拿出來

proxy_cache是nginx自帶的內置緩存模塊,配置一下就可以用了,看下面的配置

vi /usr/local/nginx/conf/nginx.conf

 代碼如下  

user  zhangy users;
worker_processes 10;
error_log  /var/vlogs/nginx_error.log  crit;
pid        /var/vlogs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
 use epoll;
 worker_connections 65535;
}
http
{
 include       mime.types;
 default_type  application/octet-stream;
 #charset  gb2312;
 server_names_hash_bucket_size 128;
 client_header_buffer_size 32k;
 large_client_header_buffers 4 32k;
 client_max_body_size 8m;
 sendfile on;
 tcp_nopush     on;
 keepalive_timeout 60;

 tcp_nodelay on;

 fastcgi_connect_timeout 300;
 fastcgi_send_timeout 300;
 fastcgi_read_timeout 300;
 fastcgi_buffer_size 64k;
 fastcgi_buffers 4 64k;
 fastcgi_busy_buffers_size 128k;
 fastcgi_temp_file_write_size 128k;
//============
 client_body_buffer_size  512k;
 proxy_connect_timeout    5;
 proxy_read_timeout       60;
 proxy_send_timeout       5;
 proxy_buffer_size        16k;
 proxy_buffers            4 64k;
 proxy_busy_buffers_size 128k;
 proxy_temp_file_write_size 128k;
 proxy_temp_path   /usr/local/nginx/proxy_temp;
/*levels設置目錄層次
keys_zone設置緩存名字和共享內存大小
inactive在指定時間內沒人訪問則被刪除在這裡是1天
max_size最大緩存空間*/
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;
//============等號中間要加的,關鍵只要加上proxy_cache_path

 gzip on;
 gzip_min_length  1k;
 gzip_buffers     4 16k;
 gzip_http_version 1.0;
 gzip_comp_level 2;
 gzip_types       text/plain application/x-javascript text/css application/xml;
 gzip_vary on;

 upstream myselfxtajmd {
 server 127.0.0.1:10002;
 server 127.0.0.1:10001 weight=5;
 }

 server
 {
 listen       10000;
 server_name  localhost;
 index index.html index.htm index.php;
 log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" $http_x_forwarded_for';
 access_log  /var/log/test.log  access;

 location /
 {
 proxy_cache content; //根keys_zone後的內容對應
 proxy_cache_valid  200 304 301 302 10d;   //哪些狀態緩存多長時間
 proxy_cache_valid  any 1d;    //其他的緩存多長時間
 proxy_cache_key $host$uri$is_args$args;   //通過key來hash,定義KEY的值

 proxy_pass http://myselfxtajmd;
 proxy_redirect                      off;
 proxy_set_header   Host             $host;
 proxy_set_header   X-Real-IP        $remote_addr;
 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 }

//動態的放過
 location ~ .*.(php|jsp|cgi)?$
 {
 proxy_set_header Host  $host;
 proxy_set_header X-Forwarded-For  $remote_addr;
 proxy_pass http://www.45it.net;
 }
 }
}


設置proxy_cache緩存與取消緩存
在配置文件的server{}內,添加這麼一句即可:

 代碼如下    
location ~ .*/.(css|js)$ {
    add_header Cache-Control 'no-store';
}

 


在nginx.conf裡的http塊加入以下代碼

#proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
proxy_temp_path   /tmp/proxy_temp_dir;
#設置名稱為nginx_cache,內存緩存空間大小為500MB,30天沒有被訪問的內容自動清除,硬盤緩存空間大小為30GB。

 代碼如下   proxy_cache_path  /tmp/proxy_cache_dir  levels=1:2   keys_zone=nginx_cache:200m inactive=3d max_size=30g;


在server加入以下代碼

 

 代碼如下  

 
location / {
        proxy_cache nginx_cache;
        proxy_cache_key $host$uri$is_args$args;
        proxy_set_header Host  $host;
        proxy_set_header X-Forwarded-For  $remote_addr;
        expires  30d;
}
 

重啟Ngnix

 

 代碼如下   /usr/local/nginx/sbin/nginx -s reload
Copyright © Windows教程網 All Rights Reserved