• nginx的详解(三)


    6.禁止访问某个文件或目录
    1)禁止访问以txt或doc结尾的文件
    location ~* .(txt|doc)${
    root /data/www/wwwroot/linuxtone/test;
    deny all;
    }

    2)nginx禁止访问所有.开头的隐藏文件设置
    location ~* /.* {
    deny all;
    }

    3)nginx禁止访问目录
    location ^~ /path {
    deny all;
    }

    4)禁止访问扩展名为bat的文件
    location ~* /.bat {
    deny all;
    }

    5)禁止访问configs目录,以及其下所有子目录或文件
    location ^~ /configs/ {
    deny all;
    }
    注意上述configs后面的斜杠不能少,否则所有以configs开头的目录或文件都将禁止访问。

    6)禁止访问多个目录
    location ~ ^/(cron|templates)/ {
    deny all;
    break;
    }

    7)禁止访问以/data开头的文件
    location ~ ^/data {
    deny all;
    }

    8)禁止访问以.sh,.flv,.mp3为文件后缀名的文件
    location ~ .*.(sh|flv|mp3)$ {
    return 403;
    }

    9)或者以=符号形式
    location = /config/ {
    return 404;
    }
    location =/config.ini{
    return 404;
    }

    10)禁止htaccess
    location ~/.ht {
    deny all;
    }

    return指令
    语法:returncode ;
    使用环境:server,location,if;
    该指令用于结束规则的执行并返回状态码给客户端。

    例如:访问的URL以".sh"或".bash"结尾,则返回403状态码
    location ~ .*.(sh|bash)?$ {
    return 403;
    }

    7.禁止IP访问 只允许域名访问
    当别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.
    目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。
    所以,禁止ip访问,只能使用域名访问的正确配置是:
    server {
         listen 80 default;
         server_name _;
         return 500;
    }

    server {
        listen 80;
        server_name web01.wangshibo.cn;
        root /var/www/html;
        index index.html index.php index.htm;
        access_log /usr/local/nginx/logs/image.log;
    }

    注意:
    如果在上面的server_name配置中指定域名的同时,也指明了ip访问,比如server_name 103.110.186.17 web01.wangshibo.cn
    那么尽管上面已经做了返回500设置,也禁止不了ip访问!也就是说,只要server_name一行指明了ip访问,那么就禁止不了了

    以上设置,可以将ip访问禁用,这样的话,使用ip访问的流量就会丢失。
        rewrite ^(.*) http://www.wangshibo.com permanent;
    }

    server {
        listen 80;
        server_name web01.wangshibo.cn;
        root /var/www/html;
        index index.html index.php index.htm;
        access_log /usr/local/nginx/logs/image.log;
    }

    下面列出其他的一些细节导致的不同效果:
    1)将ip和域名访问统统禁止,返回403(或者配置return 500)错误页
    server {
    listen 80 default;
    server_name _;
    return 403;

    root /var/www/html;
    index index.html index.php index.htm;
    access_log /usr/local/nginx/logs/image.log;
    }

    2)下面的配置:
    指明了只能使用域名,即http://web01.wangshibo.cn访问配置中的站点(/var/www/html)
    不能使用ip,即http://103.110.186.17访问配置中的站点。但是可以使用ip方式访问nginx默认的根目录下的内容(比如/usr/local/nginx/html)
    server {
    listen 80 ;
    server_name web01.wangshibo.cn;

    root /var/www/html;
    index index.html index.php index.htm;
    access_log /usr/local/nginx/logs/image.log;
    }

    下面的配置,指明了使用域名或ip都可以访问配置中的站点。(使用ip访问只限于只有一个vhost虚拟主机配置的情况,如果是多个,那么指明ip访问就会混淆)
    server {
    listen 80 ;
    server_name 103.110.186.17 web01.wangshibo.cn;

    root /var/www/html;
    index index.html index.php index.htm;
    access_log /usr/local/nginx/logs/image.log;
    }

    3)下面两个的配置后,都能使用域名或ip访问配置中的站点。
    server {
    listen 80 default;
    server_name web01.wangshibo.cn;

    root /var/www/html;
    index index.html index.php index.htm;
    access_log /usr/local/nginx/logs/image.log;
    }

    server {
    listen 80 default;
    server_name 103.110.186.17 web01.wangshibo.cn;                        

    root /var/www/html;
    index index.html index.php index.htm;
    access_log /usr/local/nginx/logs/image.log;
    }

    *******************************************************************************************************************************

    ********************************************************************************************************************************

    nginx配置只能通过域名禁止ip访问

    为什么要禁止ip访问页面呢,这样做是为了避免其他人把未备案的域名解析到自己的服务器IP,而导致服务器被断网,
    可以通过禁止使用ip访问的方法,防止此类事情的发生。
     
    Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候
    生效最关键的一点是,在server的设置里面添加这一行:
    listen 80 default;
     
    后面的default参数表示这个是默认虚拟主机。这个设置非常有用。
     
    比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500。
    网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
    server {
    listen 80 default;
    return 500;
    }
     
    也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
    server {
    listen 80 default;
    rewrite ^(.*) http://www.xxx.com permanent;
    }
     
    -----------------特别注意-------------------
    按照如上设置后,确实不能通过IP访问服务器了,但是在应该用中出现当server_name后跟多个域名时,
    其中一个域名怎么都无法访问:
     
    设置如下:
    没更改之前,通过server_name 中的www.xxx.com kevin.com均可访问服务器,加入禁止IP访问的设置后,通过kevin.com无法访问服务器了,www.xxx.com可以访问
    用 nginx -t 检测配置文件会提示warning:
     
    最后通过在listen 80 default;后再加server_name _;解决,形式如下:
    #禁止IP访问(如果vhosts下面有很多域名的conf配置,那么只需要创建创建一个文件,比如deny.ip.conf,输入下面五行内容,这样就全局禁止了ip访问,只能使用域名访问了!)
    server{
    listen 80 default;
    server_name _;
    return 500;
    }
     
    或者
    server {
    listen 80 dufault;
    server_name _;
    rewrite ^(.*) http://www.xxx.com permanent;
    }
     
    这样,通过xxx.com就能访问服务器了,问题解决了。
    =====================================================================
    也可以使用如下设置:即在server段里插入如下内容即可
     
    if ($host != 'www.kevin.com' ) {
    return 403;
    }
     
    8.流量限制

    对于提供下载的网站,肯定是要进行流量控制的,例如BBS、视频服务,还是其它专门提供下载的网站。在nginx中我们完全可以做到限流,由Nginx模块中的Core模块提供了limit_rate、limit_rate_after命令,我们只需要调用命令实现流量限制就行。
    实现流量限制由两个指令limit_rate和limit_rate_after共同完成:
    limit_rate
    语法: limit_rate rate;
    默认值: limit_rate 0;
    作用域: http, server, location, location中的if字段
    命令概述:限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,需要明白的一点是该限制只是针对一个连接的设定,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。

    limit_rate_after
    语法: limit_rate_after size;
    默认值: limit_rate_after 0;
    作用域:http, server, location,location中的if字段
    设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。

    示例说明:
    server {
           listen 80;
           server_name ops.wangshibo.com;
           location /ops/{
                root /home/www/html;
                limit_rate_after 5m;
                limit_rate 20k;
          }
    }

    测试:
    [root@test-huanqiu ~]# wget http://ops.wangshibo.com/ops/seven.mp4

    9.并发连接数限制
    这个配置是基于ngx_http_limit_zone_module模块的,要简单完成并发限制,我们要涉及到limit_conn_zone和limit_conn 这两个指令:
    limit_conn_zone
    语法:limit_conn_zone zone_name $variable the_size
    默认值:no
    作用域:http
    本指令定义了一个数据区,里面记录会话状态信息。 variable 定义判断会话的变量;the_size 定义记录区的总容量。

    limit_conn
    语法:limit_conn zone_name the_size
    默认值:no
    作用域:http, server, location
    指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 "Service unavailable" (503)。

    示例说明:
    http {
           limit_conn_zone $binary_remote_addr zone=one:10m;
           .......
           .......
           server {
                 listen 80;
                 server_name ops.wangshibo.com;
                 location /ops/ {
                 limit_conn one 1;
                 }
    示例解释:
    1)定义一个叫“one”的记录区,总容量为 10M,以变量$binary_remote_addr作为会话的判断基准(即一个地址一个会话)。
    限制/ops/目录下,一个会话只能进行一个连接;简单来说,就是限制/ops/目录下,一个IP只能发起一个连接,多过一个,一律报错503。
    2)这里使用的是$binary_remote_addr而不是 $remote_addr。$remote_addr的长度为7至15 bytes,会话信息的长度为32或64bytes;而 $binary_remote_addr的长度为4bytes,会话信息的长度为32bytes;$binary_remote_addr是限制同一客户端ip地址;当 zone 的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用 32 bytes)。

    下面分享一个限制流量和并发送的配置:
    现象描述:
    中间一段时间,网站访问有点慢,初步怀疑是机房交换机问题(之前出现过网站访问很慢,热插拔网卡/重启网卡就好了)
    最后查看,发现机房流量很大!主要是论坛流量大,主站流量很小,应该是论坛人数访问一多,就把带宽占满了。

    解决办法:
    在论坛服务器上修改:
    1)首先限制并发数
    [root@server_web ~]# vim /etc/sysconfig/iptables
    .....
    -A INPUT -p tcp --dport 80 -m limit --limit 6/s -j ACCEPT
    [root@server_web ~]# /etc/init.d/iptables restart

    上面将每个用户限制在每秒6个请求,但效果不明显。

    2)设置nginx的流量请求
    [root@server_web ~]# vim /usr/local/nginx/conf/nginx.conf
    http{
         limit_conn_zone $binary_remote_addr zone=perip:10m;
        # limit_req_zone $binary_remote_addr zone=one2:10m rate=5r/s;
        # limit_req zone=one2 burst=5;
        ..........
        ..........
    }

    [root@server_web ~]# vim /usr/local/nginx/conf/vhost/forum.conf
          server {
                listen 80;
                server_name forum.wangshibo.com;
                root /var/www/html;
                    limit_conn perip 10;                           //这里调用上面的perip,需要写在server里面;即每个ip最多有10个并发连接
                    limit_rate 10k;                                  //限制每个连接的带宽,可以单独写这条,与连接数无关;
               }
    }

    [root@server_web ~]# /usr/local/nginx/sbin/nginx -s reload

  • 相关阅读:
    最新Navicat Premium12 破解方法,亲测可用
    (转)Navicat_12安装与破解激活,注册机亲测可用
    使用ApiPost模拟发送get、post、delete、put等http请求
    模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
    推荐一款接口文档生成工具,apipost,好用
    作为后端开发者,如何更优雅、便捷的生成接口文档?
    使用apipost调试api接口并快速生成接口文档的一些小技巧,比postman更好用
    中文版postman——apipost,不试一下,你就不知道它有多香
    ApiPost如何在预执行脚本里添加请求参数?
    ApiPost的预执行脚本和后执行脚本
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8855279.html
Copyright © 2020-2023  润新知