2013-12-01 13:49:01
来 源
IT技术网
Nginx
本文介绍Nginx服务器中缓存相关的设置,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。
目的: 缓存nginx服务器的静态文件。如css,js,htm,html,jpg,gif,png,flv,swf,这些文件都不是经常更新。便于缓存以减轻服务器的压力。

实现: nginx proxy_cache可以将用户的请缓存到本地一个目录,当下一个请求时可以直接调取缓存文件,就不用去后端服务器去取文件了。

配置: 打开配置文件/etc/nginx/nginx.conf

user  www www;

worker_processes 2;

error_log  /var/log/nginx/nginx_error.log  crit;

worker_rlimit_nofile 65535;

events

{

  use epoll;

  worker_connections 65535;

}

http

{

  include       mime.types;

  default_type  application/octet-stream;

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 0;

  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;

  ##cache##

  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 /home/temp_dir;

  proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

  ##end##

gzip    on;

  gzip_min_length   1k;

  gzip_buffers   4 8k;

  gzip_http_version  1.1;

  gzip_types   text/plain application/x-javascript text/css  application/xml;

  gzip_disable "MSIE [1-6].";

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

  upstream appserver {

server 192.168.1.251;

  }

  server {

listen       80 default;

server_name blog.slogra.com;

location ~ .*.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {

proxy_pass http://appserver ;

proxy_redirect off;

proxy_set_header Host $host;

proxy_cache cache_one;

proxy_cache_valid 200 302 1h;

proxy_cache_valid 301 1d;

proxy_cache_valid any 1m;

expires 30d;

}

location ~ .*.(php)(.*){

proxy_pass http://appserver ;

proxy_set_header        Host $host;

proxy_set_header        X-Real-IP $remote_addr;

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

}

access_log /var/log/nginx/blog.slogra.com.log;

  }

}

红色部分是配置缓存的参数。

说明:

1、http段设置。

proxy_temp_path /home/temp_dir;设置临时目录

proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。

2、server段设置

请求静态文件设置。

proxy_cache cache_one;设置缓存共享内存区块,也就是keys_zone名称。

proxy_cache_valid 200 302 1h;设置http状态码为200,302缓存时间为1小时。

expires 30d;设置失期时间,为30天

请求动态文件设置。

proxy_pass http://appserver ;不进行缓存,直接转到后端服务器。

测试: 当客户端发起http请求时在服务器上会产一个缓存文件如

/home/cache/0/b9/8bd841b1c44ee5b91457eb561e44eb90

OK

#不允许客户端主动关闭连接,如果该项为设置在nginx的日志中可能出现499 错误

   proxy_ignore_client_abort on;

   #nginx 和后端服务器连接超时时间 发起握手等候响应时间

   proxy_connect_timeout 5;

  #连接成功后等候后端服务器响应时间,其实已经进入后端的排队等候处理

   proxy_read_timeout 60;

   #后端服务器数据回传时间,就是在规定的时间内后端服务器必须传完所有的数据

proxy_send_timeout 5;  

#代理请求缓存去,该缓存去间保存用户的头信息,以供nginx进行规则处理一般只要保能保存下头信息即可

proxy_buffer_size 32k;

#告诉nginx保存单个用的几个buffer 最大用多少空间

proxy_buffers  4 64k;

#高负载下缓冲大小(proxy_buffers*2)

proxy_busy_buffers_size 128k;,

#设置缓存文件夹大小,如果大于该值,将从upstream 服务器传递请求,而不缓冲到磁盘上

proxy_temp_file_write_size 1024m;  

# 该处设置的是缓存的目录及其设置的大小

proxy_cache_path  /usr/local/nginx/proxy_temp levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

location 下

 #进行缓存,使用web缓存去cache_one

proxy_cache cache_one;

#以域名,URI,参数组合成web缓存的Key值,Nginx根据Key值哈希,储存缓存内容到二级缓存目录内

#对不同的HTTP 状态码设置不同的缓存时间

proxy_cache_valid 200 304 12h;

proxy_cache_valid any 1m;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

#设定proxy_set_header  Accept-Encoding 或者是后台服务器关闭gzip,该台机器才不会缓存被压缩的文件,造成乱码

proxy_set_header Accept-Encoding "none";

# proxy_set_header Accept-Encoding ""; 同上面一项相同

#设置proxy_cache 支持后台设定的expires , 即使支持HTTP头信息定义的缓存规则

proxy_ignore_headers "Cache-Control" "Expires";

nginx反向代理做cache缓存配置

前序:请耐性子看完,前面的这个配置可以达到按后缀名进行缓存,但无法被purge。后面的配置可以被purge。

具体实施方案按个人情况而定。

需要第三方的ngx_cache_purge模块:

wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz

tar zxvf ngx_cache_purge-1.0.tar.gz

nginx机器IP地址:192.168.2.187

编译参数: configure arguments: –add-module=../ngx_cache_purge-1.0 –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module

user nobody;

worker_processes 1;

pid logs/nginx.pid;

worker_rlimit_nofile 65535;

events {

use epoll;

worker_connections 65535;

}

http {

include mime.types;

default_type application/octet-stream;

log_format main ‘$remote_addr – $remote_user [$time_local] ‘

‘”$request_method $scheme://$host$request_uri $server_protocol” $status $body_bytes_sent ‘

‘”$http_referer” “$http_user_agent”‘;

server_names_hash_bucket_size 128; #指定服务器名称哈希表的框大小

client_header_buffer_size 32k;

large_client_header_buffers 4 128k; #以上两个是设定客户端请求的Header头缓冲区大小,对于

cookie内容较大的请求,应增大改值。(400或414错误)

client_max_body_size 8m; #允许客户端请求的最大单文件字节数

client_body_buffer_size 32k; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存

到本地再传给用户

proxy_connect_timeout 600; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_read_timeout 600; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_send_timeout 600; #后端服务器数据回传时间(代理发送超时)

proxy_buffer_size 32k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

proxy_temp_file_write_size 1024m; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

递请求,而不缓冲到磁盘

proxy_ignore_client_abort on; #不允许代理端主动关闭连接

sendfile on;

tcp_nopush on;

keepalive_timeout 65;

tcp_nodelay on;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_proxied any; 前端是squid的情况下要加此参数,否则squid上不缓存gzip文件

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

server_tokens off;

#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_temp_path /cache/proxy_temp_path;

#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

proxy_cache_path /cache/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

upstream my_server_pool {

server 192.168.11.6:80;

}

server {

listen 80 default;

server_name _;

return 500;

access_log off;

}

server {

listen 80;

server_name testA.domian.com testB.domian.com testC.domian.com testD.domian.com;

access_log logs/access.log;

location / {

proxy_set_header Host $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-For $remote_addr;

proxy_pass http://my_server_pool;

expires 12h;

}

#扩展名以.gif、.jpg、.css等结尾的静态文件缓存。

location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$

{

#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_cache cache_one; #进行缓存,使用Web缓存区cache_one

proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header Accept-Encoding “none”; #设定proxy_set_header Accept-Encoding ”;

(或是后台服务器关闭gzip),这样这台机器才

不会缓存被压缩的文件,造成乱码

# proxy_set_header Accept-Encoding “”; 这个也可

proxy_ignore_headers “Cache-Control” “Expires”; #这段配置加上后,proxy_cache就能支持后台设

定的expires。

proxy_pass http://my_server_pool;

expires 1h;

}

#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。

location ~ .*.(php|jsp|cgi)?$ {

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://my_server_pool;

}

location ~ ^/NginxStatus {

stub_status on;

access_log off;

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

}

location ~ ^/(WEB-INF)/ {

deny all;

}

#设置只允许指定的IP或IP段才可以清除URL缓存。

location ~ /purge(/.*) {

allow 127.0.0.1;

allow 192.168.0.0/16;

allow all;

proxy_cache_purge cache_one $host$1$is_args$args;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

测试结果正常,第一次访问时,nginx和后端反向squid都有请求日志。当请求过一次后,nginx的/cache目录下多出缓存文件,并且再次请求页面(请过浏览器缓存),后端squid没有请求日志,说明是nginx提供的cache。

记录一下:

问题一:开始的实验环境是nginx自己处理静态文件,及:

upstream tomcat {

ip_hash;

server 192.168.2.187:8080;

}

但是始终都缓存不上。

改成nginx作为负载均衡,反向代理时:

upstream tomcat {

ip_hash;

server 192.168.2.189:8080;

}

发现可以缓存上了。

[[email protected] data0]# ll *

proxy_cache_path:

total 4

drwx—— 3 nobody nobody 4096 Feb 2 14:09 3

是我的操作失误?还是nginx作为web服务器时,不能缓存自己?

问题二:

比如缓存了http://testA.domain.com/css.css

但是使用http://testA.domain.com/purge/css.css却由后端tomcat返回了404页面。

问题二解决:这段解释来自于:http://raocl.spaces.live.com/blog/cns!3F6CFF93FD0E3B79!825.entry

因为nginx提供的过期控制是针对http_status_code的,我本想通过location中限定类型的方法完成曲线救国,结果发现:一旦location中限定了文件类型,缓存过期的定义就失效!!

#也就是说,限定文件类型后的哈希缓存,是绝绝对对的强制永久缓存——不单过期失效,下面的purge也失效——或许换一个场景,这个刚好有用。

所以换了一个配置:

server {

listen 80;

server_name testA.domian.com testB.domian.com testC.domian.com testD.domian.com;

access_log logs/access.log;

location / {

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_cache cache_one;

proxy_cache_valid 200 304 12h;

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args;

proxy_set_header Host $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-For $remote_addr;

proxy_set_header Accept-Encoding “”;

proxy_pass http://my_server_pool;

expires 12h;

}

# location ~ .*.(html|gif|jpg|jpeg|png|bmp|swf|js|css)$

# {

# proxy_cache cache_one;

# proxy_cache_valid 200 304 12h;

# proxy_cache_valid 301 302 1m;

# proxy_cache_valid any 1m;

# proxy_cache_key $host$uri$is_args$args;

# proxy_set_header Host $host;

# proxy_set_header X-Real-IP $remote_addr;

# proxy_set_header X-Forwarded-For $remote_addr;

# proxy_set_header Accept-Encoding “”;

# proxy_pass http://my_server_pool;

# expires 1h;

# }

#这部分定义不缓存而是透传的请求类型。介于无法通过类型来控制缓存,那么这里不缓存的控制就必须确保严格正确了

location ~ .*.(php|jsp|cgi)?$ {

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://my_server_pool;

}

这样一来的意思就是说缓存所有,除了我定义的php,jsp,cgi,当然能不能被缓存还要决定web服务器的header头

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.20.tar.gz

 wget http://nginx.org/download/nginx-1.1.10.tar.gz

 wget http://labs.frickle.com/files/ngx_cache_purge-1.4.tar.gz

一、安装pcre

# tar zxvf pcre-8.20.tar.gz

#  cd pcre-8.20

#  ./configure

#  make

#  make install

二、安装nginx

tar zxvf ngx_cache_purge-1.4.tar.gz

#  tar zxvf nginx-1.1.10.tar.gz

#  cd nginx-1.1.10

#  ./configure --user=www --group=www --add-module=../ngx_cache_purge-1.4 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module

#  make

#  make install

#  mkdir -p /data0/proxy_temp_path

#  mkdir -p /data0/proxy_cache_path

三、配置nginx

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

user www www;

worker_processes 8;

error_log /data1/logs/nginx_error.log crit;

pid /usr/local/webserver/nginx/nginx.pid;

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http

{

include mime.types;

default_type application/octet-stream;

#server_names_hash_bucket_size 128k;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

sendfile on;

keepalive_timeout 30;

tcp_nodelay on;

proxy_temp_path /data0/proxy_temp_path;

proxy_cache_path /data0/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30G;

upstream my_server_poo {

server 202.105.182.55:80 weight=1 max_fails=2 fail_timeout=30s;

}

server

{

listen 80;

server_name 3.test.com;

location /

{

  proxy_set_header Host $host;

  proxy_set_header X-Forwarded-For $remote_addr;

  proxy_pass http://202.105.182.55:80/;

  proxy_set_header Accept-Encoding '';

  proxy_set_header X-Forwarded-For  $remote_addr;

  proxy_ignore_headers "Cache-Control" "Expires";

   if ( $request_method = "PURGE" ) {

rewrite ^(.*)$ /purge$1 last;

}

}

location ~* .(gif|jpeg|png|bmp|swf|js)$

{

proxy_cache cache_one;

proxy_cache_valid 200 304 12h;

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://my_server_pool;

error_page 405 =200 /purge$1;

}

location ~ /purge(/.*)

{

allow 127.0.0.1;

allow 192.168.0.0/20;

deny   all;

proxy_cache_purge cache_one $host$1$is_args$args;

}

access_log off;

}

}

三优化

vi /etc/sysctl.conf   添加以下:

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024  65535

#sysctl -p 让以上配置生效

启动:/usr/local/webserver/nginx/sbin/nginx

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。