需求:
1: 实现代理s3的nginx缓存服务器
2: 实现 / -> /index.html映射,
3: 实现nginx代理服务器的 / 路径到s3的指定目录映射,即 / -> youprojectname.s3.amazonaws.com./release/
实现:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /tmp/access.log;
error_log /tmp/error.log debug;
proxy_cache_lock on;
proxy_cache_lock_timeout 60s;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=s3cache:200m max_size=10g;
# 设置Web缓存区名称为s3cache,内存缓存空间大小为200MB,硬盘缓存空间大小为10GB
# place used to buffer large proxied requests to the fs
proxy_temp_path /var/cache/nginx/tmp;
# 注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
sendfile on;
# set client body size to 50M
client_max_body_size 50M;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
gzip on;
gzip_disable "msie6";
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/default.conf;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/proxy_cache.conf:
server {
listen 80;
listen [::]:80;
server_tokens off;
server_name youdomain.com;
error_page 403 404 /custom_404.html;
location = /custom_404.html {
root /usr/share/nginx/html;
internal;
}
# 实现 / -> /index.html映射
try_files $uri $uri/index.html =404;
location / {
set $s3_bucket 'youprojectname.s3.amazonaws.com';
# 指定s3cache 缓存区将被使用(通过proxy_cache_path 设置的)
proxy_cache s3cache;
# cache successful responses for 24 hours
proxy_cache_valid 200 302 24h; #对不同的HTTP状态码设置不同的缓存时间
# cache missing responses for 1 minutes
proxy_cache_valid 403 404 1m;
proxy_cache_key $uri;
proxy_redirect off;
# need to set the hot to be $backend here so s3 static website hosting service knows what bucket to use
# 设置主机头和客户端真实地址
proxy_set_header Host $s3_bucket;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Cache-Status $upstream_cache_status;
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
proxy_ignore_headers "Set-Cookie";
proxy_intercept_errors on;
resolver 8.8.8.8;
resolver_timeout 5s;
proxy_pass http://youprojectname.s3.amazonaws.com/relase/;
}
}
相关指令说明
try_files:
语法:try_files file … uri 或 try_files file … = code
默认值:无
作用域:server location
其作用是按顺序检查文件是否存在,返回第一个找到的文件(路径/uri)或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
需要注意的是,只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,即如果最后一个参数是文件,那么这个文件必须存在,否则会出现内部500错误。命名的location也可以使用在最后一个参数中。与rewrite指令不同,如果回退URI不是命名的location那么args不会自动保留,如果你想保留args,则必须明确声明。
try_files uriuri/index.html =404; 首先尝试访问uri(eg:访问http://www.abc.com/abc/时,/abc/即为uri),若是uri不存在则访问uri/index.html(即,若/abc/ 找不到则访问/abc/index.html),uri和uri/index.html都找不到的时候返回404。
讲解下nginx规范化
所谓规范化,就是先将URI中形如“%XX”的编码字符进行解码,再解析URI中的相对路径“.”和“..”部分, 另外还可能会压缩相邻的两个或多个斜线成为一个斜线,
这也就是如www.xxx.com///index.html 这样的访问也能访问的原因
规范前的url为 www.xxx.com///index.html 保存在requesturi中而规范后的url为www.xxx.com/index.html保存在uri中 nginx会压缩相邻的两个或多个斜线成为一个斜线
proxy_cache缓存相关指令集
(1)proxy_cache指令 语法: proxy_cache zone_name ;
该指令用于设置哪个缓存区将被使用,zone_name的值为proxy_cache_path指令创建的缓存区的名称.
(2)proxy_cache_path指令, 语法 proxy_cache_path path[levels=number] keys_zone=zone_name:zone_size[inactive=time] [max_size=size];
该指令用于设置缓存文件的存放路径.例:
proxy_cache_path /data0/proxy_cache_dir levels=1:2keys_zone=cache_one:500m inactive=1d max_size=30g ;
path 存放目录
levels 指定该缓存空间有两层hash目录,第一层目录为1个字母,第二层目录为2个字母,保存的文件名会类似/data0/proxy_cache_dir/c/29/XXXXXX ;
keys_zone参数用来为这个缓存区起名.
500m 指内存缓存空间大小为500MB
inactive的1d指如果缓存数据在1天内没有被访问,将被删除
max_size的30g是指硬盘缓存空间为30G
(3)proxy_cache_methods 指令 语法:proxy_cache_methods[GET HEADPOST];
该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST 方法
(4)proxy_cache_min_uses指令 语法:proxy_cache_min_uses the_number
该指令用于设置缓存的最小使用次数,默认值为1
(5)proxy_cache_valid指令 语法: proxy_cache_valid reply_code[reply_code…] time ;
该指令用于对不同返回状态码的URL设置不同的缓存时间.
例:
proxy_cache_valid 200 302 10m ;
proxy_cache_valid 404 1m ;
设置200,302状态的URL缓存10分钟,404状态的URL缓存1分钟.
(6)proxy_cache_key指令 语法: proxy_cache_key line ;
该指令用来设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存.一般根据host(域名),request_uri(请求的路径)等变量组合成proxy_cache_key .