• Nginx_地址重写(rewrite)_日志管理(log_format)_压缩输出_Nginx设定限速_Nginx设置反向代理及反向代理缓存


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

  • 相关阅读:
    Python装饰器的解包装(unwrap)
    《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
    关于Python的函数(Method)与方法(Function)
    判断python对象是否可调用的三种方式及其区别
    tornado返回指定的http code
    Mac下安装pymssql
    iptables
    OpenFlow通信流程解读
    Prometheus的架构及持久化
    ansible总结
  • 原文地址:https://www.cnblogs.com/ahwu/p/3664530.html
Copyright © 2020-2023  润新知