Nginx 经典美文

作者: github加星点进来 | 来源:发表于2017-05-16 17:08 被阅读675次

    nginx 常用命令

    nginx  -c /etc/nginx/nginx.conf #nginx启动,conf 可以自己指定或者删除
    nginx -s stop #停止nginx
    nginx -s quit  #停止nginx
    nginx -s reload #nginx重载配置
    nginx -t #检查配置文件是否正确
    

    如果将整个配置文件的结构简化一下,大概就是这样:

    main块
        event块{
        #定义nginx的事件模型,不可或缺。
        }
    
        http块 {  #http服务器的必要块。
            server块 { #定义虚拟主机的块。
                if块 {}
                location块 {    #定义uri规则的块,可以使用正则表达式。
                    if块 {}   #RewriteCond的重新规则条件的功能。
                }
            }
        }
    

    nginx 限制ip访问

    server {
        listen 80;
        server_name xx.xx.xx.xx;
    
        location / {
               root html/blog;
              index.index.php index.html index.htm;
              allow 127.0.0.1/24;
              allow 192.168.0.0/16;
              allow 10.10.0.0;
              deny all;
        }
    
    //deny 一定要加一个ip,否则调转到403。
    //对于allow的ip段,允许访问的段位从小到大排列。
    //24,代表子网掩码:255.255.255.0
    //16,代表子网掩码:255.255.0.0
    //8,代表子网掩码:255.0.0.0
    

    也可以通过文件的形式include进来
    1.首先建立一个用于屏蔽IP的配置文件,放在nginx的conf目录下面, 这里以iplist为例,iplist内容可以是是:

    deny 192.168.1.11;
    deny 192.168.1.123;
    deny 10.0.1.0/24;
    

    2、在nginx的配置文件 nginx.conf 中加入 include iplist,以便这个配置文件能够被加载。

    server {
        listen 80;
        server_name localhost;
        location / {
        include iplist;
        proxy_pass http://local_tomcat;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forworded-For $proxy_add_x_forwarded_for;
        }
    }
    

    3、重新加载nginx的配置 nginx -s reload,即可生效。


    开启gzip 压缩性能优化

    gzip on; #开启压缩
    gzip_static on; #告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了
    gzip_min_length  1k;   #允许压缩页面的最小字节数
    gzip_disable "msie6";  #为指定的客户端禁用gzip功能
    gzip_http_version 1.1; #压缩版本 
    gzip_vary on;  #支持前端的缓存服务器缓存经过gzip压缩的页面。
    gzip_comp_level 6; #指定压缩等级,其值从1到9,数字越大,压缩率越高,越消耗CPU,负载也越高.设置为4,这是一个比较折中的设置.
    gzip_proxied any; #允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; #支持的压缩类型
    

    nginx图片及目录防盗链

    什么是防盗链系统

    防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。

    Nginx的防盗链主要使用的是referer模块。

    语法:valid_referers none | blocked | server_names | <string> ...

    说明:当在HTTP请求头中有Referer字段,则变量$invalid_referer将会设置为空字符串,否则$invalid_referer将会设置为1. 匹配时不区分大小写

    none:表示请求头中没有Referer字段。
    blocked:表示请求头中有Referer字段,但是该字段的值已经被防火墙或者是代理服务器删除了,不是以"http://"或者是"https://"开头
    server_names:请求头的Referer字段包含其中一个server name。
    string:表示任意的字符串。可以是一个server name或者是server name和URI的结合,可以使用在server name的开头和结尾可以使用*。并且不会检查Referer字段的服务器的端口号。
    也可以使用正则表达式进行匹配,如果要使用正则表达式,则第一个符号必须是"~",并且表达式匹配的内容应该是"http://"或者是"https://"以后的内容。

    配置示例

    location ~ \.(png|jpg|jpeg|gif)$ {
    valid_referers none blocked server_names *.kakaogift.cn *.kakaogift.com;
    
        if ($invalid_referer) {
            return 403;
        }   
    } 
    

    nginx 负载均衡 load balance

    nginx的upstream目前支持4种方式的分配

    <code>1)、</code> 轮询(默认)� 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
      <code>2)、</code>weight� 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
      <code>3)、</code>ip_hash� 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
      <code>4)、</code>fair(第三方)� 按后端服务器的响应时间来分配请求,响应时间短的优先分配。


    #server参数
    #weight=number       ;服务器的权重,在默认情况下是1。
    #max_conns=number    ;限制与代理服务器的最大并发连接数。 默认值为零,意味着没有限制
    #max_fails=number    ;最大失败数,与服务器进行通信失败的次数,服务器将被视为不可用。缺省情况下,尝试失败的次数被设置为1。
    #fail_timeout=time   ;最大超时,与服务器通信不可用的时间段,服务器将被视为不可用。默认情况下,参数被设置为10秒。
    #backup              ;标志着服务器作为备份服务器。当主服务器不可用时将启用
    #down                ;将服务器标记为永久不可用
    #resolve             ;监视对应于服务器的域名的IP地址的变化,自动修改上游配置而不需要重新启动
    #route=string        ;设置服务器的路由名称
    #service=name        ;启用DNS SRV记录解析和设置服务名称
    #slow_start=time     ;慢启动,即服务器可用后到提供服务的这段时间,默认为0,表示禁用,不能用于hash和ip_hash负载均衡方法
    
    upstream backend {
        ip_hash;    //支持round robin, least_conn,ip_hash
    
        server backend1.example.com weight=5;
        server backend2.example.com down;   //down只在ip_hash时有效,表示该server down时,发请求给下一个server
        server backend3.example.com max_fails=3 fail_timeout=30s;   //
        server 192.0.0.1 backup;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    

    nginx 配置expires缓存实现性能优化

    expires功能就是允许通过nginx配置文件控制http的expires和cache-control响应头的内容。告送浏览器是否缓存和缓存多长时间。

    (1).根据文件扩展名进行判断
    location ~ .*\.(gif | jpg | jpeg | png | nmp | swf)$ {
        expires 365d;
    }  
    
    (2).缓存某个特定的文件
    location ~(robots.txt) {
        expires 7d;
        break;
    }
    

    nginx 日志相关优化

    1).配置日志切割脚本
    vim cut_nginx_log.sh
    #!/bin/bash
    cd /opt/application/nginx/nginx/logs && \ /bin/mv blog_access.log     blog_access_$(date +%F -d -1day).log
    /opt/application/ngnix/nginx/sbin/nginx -s reload
    
    crontab -e
    00 00 * * * /bin/sh /usr/local/cut_nginx_log.sh >/dev/null 2>&1
    

    2).不记录不需要的访问日志 如果日志写入太频繁,会占用大量的磁盘I/O,从而降低了服务器的性能

    location ~ .*\.(js | css | gif | jpg | jpeg | png | nmp | swf)$ {
        access_log off ;
    }
    

    Rewrite规则

    location  = / {
      # 精确匹配 / ,主机名后面不能带任何字符串
      [ configuration A ]
    }
    location  / {
      # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
      # 但是正则和最长字符串会优先匹配
      [ configuration B ]
    }
    location /documents/ {
      # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration C ]
    }
    location ~ /documents/Abc {
      # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration CC ]
    }
    location ^~ /images/ {
      # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
      [ configuration D ]
    }
    location ~* \.(gif|jpg|jpeg)$ {
      # 匹配所有以 gif,jpg或jpeg 结尾的请求
      # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
      [ configuration E ]
    }
    location /images/ {
      # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
      [ configuration F ]
    }
    location /images/abc {
      # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
      # F与G的放置顺序是没有关系的
      [ configuration G ]
    }
    location ~ /images/abc/ {
      # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
        [ configuration H ]
    }
    location ~* /js/.*/\.js
    

    已=开头表示精确匹配
    如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
    ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
    ~ 开头表示区分大小写的正则匹配;
    ~* 开头表示不区分大小写的正则匹配
    / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

    so,实战项目一般这样
    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
    #这里是直接转发给后端应用服务器了,也可以是一个静态首页
    # 第一个必选规则
    location = / {
        proxy_pass http://tomcat:8080/index
    }
    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    location ^~ /static/ {
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    #第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    #非静态文件请求就默认是动态请求,自己根据实际把握
    #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
    location / {
        proxy_pass http://tomcat:8080/
    }
    

    优雅的显示错误页面

    server {
      ......
       error_page 500 501 502 503 504   xxx.html #https://err.tmall.com/error2.html
       error_page 400 403 404 405 408 410 411 412 413 414 415  https://err.tmall.com/error1.html
      ......
    }
    

    模块(心跳检查)nginx_upstream_check_module

    1.下载模块包 wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz


    2.解压 tar -zxf v0.3.0.tar.gz


    3.添加补丁 patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch


    4.配置nginx ./configure --add-module=/opt/nginx_upstream_check_module-0.3.0


    5.编译安装 make && make install


    6.查看安装信息 nginx -V


    upstream default_upstream{
            keepalive 60;
            server 127.0.0.1:8080 max_fails=0 fail_timeout=30s weight=20;
            check interval=1000 rise=3 fall=2 timeout=3000 type=http default_down=false;
            check_http_send "GET / HTTP/1.0\r\n\r\n";
            check_http_expect_alive http_2xx;
    }
    
    
    #测试地址,不一定要配置
     location /nstatus {
      check_status;
      access_log off;
      allow all;
      #deny all;
    

    }

    最后记录一些常用的默认配置,不需要修改就行

    error_log    logs/error.log warn;
    

    指定error_log的日志文件为logs/error.log并设置记录级别为warning。

    events {
        use    epoll; #为什么nginx比apache快,epoll起到了比较关键的作用
        worker_connections    20480;
    }
    

    设定事件模型使用epoll,每个worker进程可用的最大连接数是20480。

    root    /home/admin/cai/htdocs;
    

    设置静态文件所在地,也就是网站根目录。

    sendfile    on;
    

    打开会使用sendfile系统调用,用来发送静态文件,节省了文件在用户空间和内核空间拷贝的消耗。

    tcp_nopush     on;
    

    打开后,会使TCP在发送数据时进行缓存,提高传输效率,但是会增加客户端响应时间。

    keepalive_timeout     15s;
    keepalive_requests     100;
    

    设置keepalive连接的超时时间为15s,并且每处理100个请求以后就关闭链接。

    server_tokens     off;
    

    关闭后,nginx在错误页面和响应的Server头中不会携带版本号信息。

    2018年最新的面试题,满满的干货, 请关注 https://github.com/976500133/FETopic

    相关文章

      网友评论

        本文标题:Nginx 经典美文

        本文链接:https://www.haomeiwen.com/subject/lyjlxxtx.html