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

原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8855279.html