Nginx地址重写 Nginx rewrite
rewrite语法规则
1).变量名可以使用 "=" 或 "!=" 运算符
~ 区分大小写
~* 不区分大小写
^~ 禁止表达式匹配 找到后就不向下找了
= 精确匹配
!~ 和 !~* 与 ~ !~ 相反
-f 和 !-f 用来判断文件是否存在
-d 和 !-d 用来判断目录是否存在
-e 和 !-e 用来判断文件或目录是否存在
-x 和 !-x 用来判断文件是否可以执行
也支持$1到$9位置化参数
1.if指令
规则语法
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
# 请求的文件不存在,就指定到指定的路径URL下
if(!-f $request_filename){
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}
2.return 指令
示例:如果访问url以 *.sh 或 *.bash结尾,则返回状态码403
location ~ .*.(sh|bash)?${
return 403;
}
3.set,rewrite指令
if($host ~* ^(.*?).aaa.com$){
set $var_tz '1';
if($host ~* ^192.168.1.(.*?)$){
set $var_tz '1';
}
if($host ~* ^localhost){
set $var_tz '1';
}
if($var_tz !~ '1'){ # 如果这个值为不1就转到下面的地址
rewrite ^/(.*)$ http://www.aaa.com redirect;
}
}
4.rewrite指令
rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种
last 相当于Apache里的[L]标记,表示完成rewrite;
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last和break用来实现URI重写,浏览器地址栏URL地址不变
redirect和permanent来用实现URL跳转,浏览器地址栏会显示跳转后的URL地址
例:
location /cms/{
proxy_pass http://test.abc.com;
rewrite "^/cms/(.*).html$" /cms/index.html break;
}
注: 一般在跟location中(即location /{...}) 或直接在server标签中编写rewrite规则,推荐使用last标记,在非跟location中(location /cms/{...}),则使用break标记
实例:
1.将原来要访问/data目录重写为/bbs
rewrite ^/data/?$ /bbs/ permanent;
2.根据不同的浏览器将得到不同的结果
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
3.防止盗链
location ~* .(gif|jpg|png|swf|flv)${
valid_referers none blocked www.test.com *.test.com;
if($invalid_referer){
rewrite ^/(.*) http://www.test.com/block.html;
}
}
4.实现域名跳转
所有对www.abc.com的访问,redirect到www.test.com
server{
listen 80;
server_name www.test.com
index index.html index.php;
root /var/home/www;
if($host="www.abc.com"){
rewrite "^/(.*)$" http://www.test.com/$1 permanent;
}
}
5.URL rewrite和反向代理同时进行
location /news/{
proxy_pass http://www.news.com;
}
location /sports/{
proxy_pass http://www.sports.com;
}
-----------------------------------------------------------------------
全局变量
$args 此变量与请求行中的参数相等
$content_length 等于请求行的“Content_Length”的值。
$content_type 等同与请求头部的”Content_Type”的值
$document_root 等同于当前请求的root指令指定的值
$document_uri 与$uri一样
$host 与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate 允许限制的连接速率
$request_method 等同于request的method,通常是“GET”或“POST”
$remote_addr 客户端ip
$remote_port 客户端port
$remote_user 等同于用户名,由ngx_http_auth_basic_module认证
$request_filename 当前请求的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri 含有参数的完整的初始URI
$query_string 与$args一样
$server_protocol 等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”
$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$server_name 请求到达的服务器名
$server_port 请求到达的服务器的端口号
$uri 等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index
-----------------------------------------------------------------------
Nginx日志管理
log_format
$http_x_forwarded_for和$remote_user用于记录ip地址
$remote_user 用来记录远程客户端用户名称
$time_local 用来记录访问时间及时区
$request 用于记录请求的URL与HTTP协议
$status 用于记录请求的状态,如200 404等
$body_bytes_sent 用于记录发送给客户端的文件主体内容大小
$http_referer 用于记录是从哪个页面链接访问过来的
$http_user_agent 用记记录客户端浏览器的相关信息
定义日志
access_log /data/log/$server_name.log mylogformat buffer=32k
注:从0.7.4之后nginx支持变量
buffer=32k 表示设置内存缓冲区的大小
开启日志打开缓存
为了提高包含变量的日志文件存放路径的性能,可以使用open_log_file_cache指令来设置.
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] |off
该指令默认是禁止的,等同于:
open_log_file_cache off;
max 设置缓存中的最大文件描述符数量
inactive 设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符
min_uses 在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存,默认为10秒钟
valid 设置多长时间检查 1 次,看日志文件路径与文件名是否仍然存在,默认60秒
例:
最大记录1000个文件缓存
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
Nginx日志分割
vi /data/logs.sh
#! /bin/bash
#Nginx日志存放位置
logs_path="/data/logs/";
#将日志改名
mkdir -p ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/access_$(date -d "yesterday"+"%Y%m%d").log
#重启nginx服务
pkill -USR1 nginx
# 创建计划任务
crontab -e
01 00 * * */bin/bash /data/logs.sh
Nginx开启压缩输出
在http{...}中间,启用压缩
#vi /etc/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffer 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_type text/plain application/x-javascript text/css application/xml;
gzip_vary on;
Nginx的浏览器本地缓存设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
#设置图片在客户端缓存时间为 30days
location ~ .*.(js|css)?$
{
expires 1h;
}
Nginx设定限速
location /download{
limit_rate 256k;
proxy_pass http://www.abc.com;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /movie{
limit_rate_after 10m;
limit_rate 100k;
}
if($http_user_agent ~ Google|Yahoo|baidu){
limit_rate 20k;
}
Nginx设置反向代理
http{
以下参数说明:中的选项
}
参数说明:
# 允许客户端请求的最大的单个文件字节数
client_max_body_size 300m;
#缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;
#跟后端服务器连接的超时时间 发到握手等候响应超时时间
proxy_connent_timeout 600;
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
proxy_read_timeout 600;
#后端服务器数据回传时间,就是在规定的时间内后端服务器必须传完所有的数据
proxy_send_timeout 600;
#代理请求缓存去,该缓存去间保存用户的头信息,以供nginx进行规则处理一般只要保能保存下头信息即可
proxy_buffer_size 16k;
#告诉nginx保存单个用的几个buffer 最大用多少空间
proxy_buffers 4 64k;
#高负载下缓冲大小(proxy_buffers*2)[如果系统很忙的时候可以申请更的proxy_buffers]
proxy_busy_buffers_size 128k;
#proxy缓存临时文件的大小 设置缓存文件夹大小,如果大于该值,将从upstream 服务器传递请求,而不缓冲到磁盘上
proxy_temp_file_write_size 1024m;
proxy_temp_path /data/proxy_temp_path;
proxy_cache_path /data/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=1g;
例
location /sms{
proxy_pass http://192.168.1.2;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_set_header X-Forwarded-For $remote_addr;
}
#具体代理缓存的内容
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css|html)$
{
proxy_cache cache_one;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
#以域名,URI 参数组合成web缓存的key值, Nginx根据key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://192.168.3.2;
}
----------------------------------------------------------------
location ~ .*.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$ #列出的扩展名文件不缓存。
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://osyunweihost;
}
access_log off;
}
location ~ /purge(/.*) #用于清除缓存
{
allow 127.0.0.1;
allow 192.168.21.0/24; #设置只允许指定的IP或IP段才可以清除URL缓存。
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}