Nginx之企业优化最佳实践一

环境准备

[root@test ~]# uname -a    #查看系统版本
Linux test 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

安装nginx

[root@test ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@test ~]# yum install nginx -y
[root@test ~]# systemctl start nginx.service

1.Nginx基本安全优化

1.1调整参数隐藏Nginx版本信息

对于Linux客户端,可用curl命令进行查看Nginx版本号

[root@test nginx]# curl -I 192.168.56.32
HTTP/1.1 200 OK
Server:<span style="color: #ff0000;"> nginx/1.12.2</span>
Date: Wed, 29 Nov 2017 22:01:00 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 17 Oct 2017 13:25:49 GMT
Connection: keep-alive
ETag: "59e604dd-264"
Accept-Ranges: bytes

编辑nginx.conf配置文件在http标签增加”server_tokens off;“参数,实现隐藏Nginx版本号的方式如下:

http
{
 ......
 server_tokens off;
 ......
}

##此参数在http标签的作用是控制http response header内的Web服务版本信息的显示及错误信息的显示;
server_tokens参数的官方说明如下:

syntax: server_tokens on|off;       #<==意思on为开启状态,off为关闭状态;
default:server_tokens on;           #<==意思不配置该参数,软件默认情况的结果;
context:http,server,location      #<==意思server_tokens参数可以放置的位置;
官方地址:http://nginx.org/en/docs/http/ngx_http_core_module.html

 

配置完成之后保存,重新加载,再次curl查看,结果如下:

[root@test nginx]# nginx -s reload
[root@test nginx]# curl -I 192.168.56.32
HTTP/1.1 200 OK
Server: nginx    #<==版本号已隐藏
Date: Wed, 29 Nov 2017 22:52:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 17 Oct 2017 13:25:49 GMT
Connection: keep-alive
ETag: "59e604dd-264"
Accept-Ranges: bytes

1.2更改Nginx服务的默认用户

为了让Web服务更安全,尽可能改掉软件默认的所有配置,包括端口、用户等;

查看Nginx服务对应的默认用户;

[root@test nginx]# grep -w 'user' /etc/nginx/nginx.conf
user nginx;
1.为Nginx服务建立新用户
[root@test nginx]# useradd -s /sbin/nologin -M xionghaizi   #<==不需要系统登录权限,相当于apache里的用户
[root@test nginx]# id xionghaizi             #<==检查用户
uid=1002(xionghaizi) gid=1002(xionghaizi) groups=1002(xionghaizi)</pre>
2.配置Nginx服务,使用刚建立的xonghaizi用户

更改Nginx服务默认使用的用户,方法有两种:

第一种为直接修改配置参数,将默认的,改为如下内容:

user xionghaizi xionghaizi;

第二种直接更改nginx软件编译时的用户和组,命令如下:

./configure --prefix=/application/nginx-1.10.2 --user=xiognhaizi --group=<span style=xiognhaizi --with-http_stub_status_module --with-http_ssl_module
3.检查更改用户的效果
[root@test nginx]# ps -ef|grep [n]ginx
root 8909 1 0 05:53 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
xiongha+ 9442 8909 0 07:25 ? 00:00:00 nginx: worker process

2.根据参数优化Nginx服务性能

2.1Nginx服务的worker进程个数

在高并发,高访问量的Web服务场景,需要事先启动好更多的Nginx进程,以保证快速响应并处理大量并发用户的请求,而worker进程数并不是越多越好,就像饭店的服务员一样,服务员过多,没事做,饭店的成本也高;

1.优化Nginx进程对应的配置

优化Nginx进程对应Nginx服务的配置参数如下;

worker_processes 1;                #<==指定了Nginx要开启的进程数,结尾的数字就是进程的个数;
2.优化Nginx进程个数的策略

worker_processes 参数大下的设置最好和网站的用户数量相关联,如果是新配置,不知道用户数量;

搭建服务器时,worker进程数量最开始的设置可以等于CPU的核数,且worker进程数要多一些,这样不会因为访问量的增加而临时启动新进程提供服务的问题;

可以考虑将进程数提高至CPU核数*2

具体情况要根据实际的业务来选择,因为这个参数除了要和CPU核数匹配外,也和硬盘存储的数据及系统的负载有关;

设置为CPU的核数是一个好的起始配置,官方建议;

3.查看Web服务器CPU硬件资源信息

通过/proc/cpuinfo可查看CPU个数及总核数;

[root@test nginx]# grep processor /proc/cpuinfo|wc -l
2       #<==表示为1颗CPU两核
[root@test nginx]# grep -c processor /proc/cpuinfo
2       #<==表示为1颗CPU两核

查看CPU总核数的示例如下:

[root@test nginx]# grep "physical id" /proc/cpuinfo |sort|uniq|wc -l
2     #<==去重计数,表示2颗CPU

通过执行top命令,然后按数字1,即可显示所有的CPU核数,如下

[root@test nginx]# top             #<==按1显示多核CPU
top - 08:22:17 up 22:34, 3 users, load average: 0.08, 0.03, 0.05
Tasks: 360 total, 1 running, 359 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1868688 total, 504448 free, 616680 used, 747560 buff/cache
KiB Swap: 897020 total, 896336 free, 684 used. 1015896 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
 9691 root 20 0 146376 2280 1420 R 0.7 0.1 0:00.28 top 
 1 root 20 0 188804 3892 2376 S 0.0 0.2 0:04.79 systemd 
 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
 #<==这里单CPU两核的信息
例如:CPU核数为2,就配置worker_processes 2
4.实践修改Nginx配置

配置nginx.conf文件并使之生效:

[root@test nginx]# sed -i 's#worker_processes 1#worker_processes 2#g' /etc/nginx/nginx.conf
[root@test nginx]# grep "worker_processes" /etc/nginx/nginx.conf
worker_processes 2;
[root@test nginx]# nginx -t                     #<==检查语法
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@test nginx]# nginx -s reload              #<==重新加载使之生效
[root@test nginx]# ps -ef|grep [n]ginx          #<==查看修改后的worker进程数
root 8909 1 0 05:53 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
xiongha+ 9737 8909 0 08:29 ? 00:00:00 nginx: worker process
xiongha+ 9738 8909 0 08:29 ? 00:00:00 nginx: worker process

绑定的示例配置

http
{
 ......
 worker_processes 4;
 worker_cpu_affinity 0001 0010 0100 1000;
 ......
 worker_processes 2;
 worker_cpu_affinity 0101 1010;
 ......
}
6.Nginx事件处理模型优化

Nginx的连接处理机制在不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows中使用icop;

将Nginx的事件处理模型调整为epoll模型;

具体的配置参数如下:

events 
#<==events指令是设定Nginx的工作模式及连接数上限
{
 worker_connections 1024;
use epoll;
}

备注:#==>use是一个事件模块指令,用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig及/dev/poll
其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在
BSD系统中,对于Linux系统推荐使用epoll工作模式,这是高性能高并发的设置;

7.调整Nginx单个进程允许的客户端最大连接数

控制连接数的参数为worker_connectons

worker_connectons需要根据服务器的性能和程序的内存使用量来指定:

events
#<==events指令是设定Nginx的工作模式及连接数上限
 {
 worker_connections 1024;
 use epoll;
}
8.配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 1024;
#<==最大打开文件数,可设置为系统优化后的ulimit -HSn的结果

[root@test ~]# ulimit -HSn
1024

下面是worker_rlimit_nofile的官方说明:

参数语法:worker_rlimit_nofile number

默认配置:无

放置位置:主标签段

说明:次参数的作用是改变worker processes能打开的最大文件数

参数资料:http://nginx.org/en/docs/ngx_core_module.html

9.优化服务器域名的散列表大小

如果使用nginx.org和www.nginx.org来访问服务器是最频繁的,那将它们明确定义更为有效,命令如下:

server {
 listen 80;
 server_name nginx.org www.nginx.org *.nginx.org;
 ...
 #<==或者更简单的方法但是效率较低
 server_name .nginx.org
}

如果定义的大量的非常长的名字,那就需要在HTTP配置块中调整server_names_hash_max_sizeserver_names_hash_bucket_size的值;

http
{
      ......
      server_names_hash_max_size 512;      #<==设置存放域名的最大散列表的大小;
      server_names_hash_bucket_size 64;    #<==设置存放域名的最大散列表的存储桶的大小,域名较长定义;
      ......
}

如果定义的大量名字,出现报错

那么应该先尝试设置server_names_hash_max_size的值,此值差不多等于名字列表名字总量,如果还不能解决问题,或者服务器启动非常缓慢,在尝试设置server_names_hash_bucket_size的值;

10.开启高效文件传输模式

(1)设置参数:sendfile on

sendfile参数用于开启文件的高效传输模式,同时将tcp_nopushtcp_nodelay两个指令设置为no,可防止网络及磁盘I/O阻塞,提升Nginx工作效率;

sendfile参数的官方说明:

syntax: sendfile on|off;                         #<==参数语法
default:sendfile off;                            #<==参数默认配置
context:http,server,location,if in location    #<==可以放置的标签段

参数作用:激活或禁用sedfile()功能,sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作在内核之中的,被称为”零拷贝“,sendfile()readwrite函数要高效很多,因为,readwrite函数要把数据拷贝到应用层在进行操作;相关控制参数还有sendfile_max_chunk

参考资料:http://nginx.org/en/docs/http/ngx_core_module.html#sendfile

(2)设置参数:tcp_nopush on;

官方说明:

syntax: tcp_nopush on|off;            #<==参数语法
 default:tcp_nopush off;              #<==参数默认配置
 context:http,server,location       #<==可以放置的标签段

参数作用:激活或禁用Linux上的TCP_CORK socket选项,此选项仅仅当开启sendfile时才生效,激活这个tcp_nopush参数可以允许把http response header和文件的开始部分放在一个文件里发布,其积极的作用是减少网络报文段的数量

参考资料:http://nginx.org/en/docs/http/ngx_core_module.html

2.2优化Nginx连接参数,调整连接超时时间

1.连接超时的作用
  1. 无用的连接设置为超时,可以保护服务器系统资源(cpu、内存、磁盘)
  2. 减少占用服务器资源
  3. 断掉恶意占用资源的连接
2.Nginx连接超时的参数设置

(1)参数设置:keepalive_timeout 60;

备注:用于设置客户端连接保持会话的超时时间为60秒;超过这个时间,服务器会关闭该连接。

keepalive_timeou参数官方说明如下:

 syntax: keepalive_timeout timeout [header_timeout];    #<==参数语法
 default:keepalive_timeout 75s;                         #<==参数默认配置
 context:http,server,location,                        #<==可以放置的标签段

(2)设置参数:tcp_nodelay on;

用于激活tcp_nodelay on功能,提高I/O性能。

tcp_nodelay参数的官方说明如下:

 syntax: tcp_nodelay on|off;              #<==参数语法
 default:tcp_nodelay on;                  #<==参数默认配置
 context:http,server,location           #<==可以放置的标签段

参数作用:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能。但是,在每次只发送很少字节的业务场景中,使用tcp_nodelay功能,等待时间会比较长。

参数生效条件:激活或禁用TCP_NODELAY选项,当一个连接进入keep-alive状态时生效。参考:http://nginx.org/en/docs/http/ngx_http_core_module.html

 

(3)设置参数:client_header_timeout 15;

用于设置读取客户端请求头数据的超时时间。此处的数值15,其单位是秒,为经验参考值;

client_header_timeou参数的官方说明如下:

 syntax: client_header_timeout time;                                 #<==参数语法
 default:client_header_timeout 60s;                                  #<==参数默认配置
 context:http,server,                                              #<==可以放置的标签段

参数作用:设置读取客户端请求头数据的超时时间,如果超过这个时间,客户端还没有发送完整的header数据,服务器端将返回'Request time out (408)'错误,可指定一个超时时间,防止客户端利用http协议进行攻击,参考:http://nginx.org/en/docs/http/ngx_http_core_module.html

(4)设置参数:client_body_timeout 15;

用于设置读取客户端请求主体的超时时间,默认值是60

client_body_timeout参数的官方说明:

 syntax: client_header_timeout time;          #<==参数语法
 default:client_header_timeout 60s;           #<==参数默认配置
 context:http,server, location              #<==可以放置的标签段

参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个时间内,客户端没有发送任何数据,Nginx将返回"Request time out (408)"错误,默认值是60

(5)设置参数:send_timeout 25;

用于指定响应客户端的超时时间。

2.3上传文件大小的限制(动态应用)

client_max_body_size 8m;

client_max_body_size参数的官方说明:

 syntax: client_max_body_size size;                 #<==参数语法
 default:client_max_body_size 1m;                   #<==参数默认配置
 context:http,server,location                      #<==可以放置的标签段

参数作用:设置最大的允许的客户端请求主体大小,在请求头域有"Content-Length",如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确显示。设置为0表示禁止检查客户端请求主体大小。此参数对提高服务器端的安全性有一定的作用。

参考:http://nginx.org/en/docs/http/ngx_http_core_module.html

2.4配置Nginx gzip压缩实现性能优化

1.Nginx gzip压缩功能介绍

Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

2.Nginx gzip压缩的优点

  1. 提升用户体验
  2. 节约网站带宽成本

3.需要和不需要压缩的对象

  1. 纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件
  2. 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大
  3. 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。

4.参数介绍及配置说明

Nginxgzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装

对应的压缩参数说明如下:

#压缩配置
gzip on;                     #<==开启gzip压缩功能
gzip_min_length 1k;          #<==设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,
表示不管页面多大都进行压缩。建议设置成大于1k,如果小于1k可能会越压越大
gzip_buffers 4 16k;          #<==压缩缓存区大小,表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大
小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1;       #<==压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1,
目前大部分浏览器已经支持GZIP解压,使用默认即可。
gzip_comp_level 2;           #<==压缩比例。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,处理
最慢也比较消耗CPU资源
gzip_types text/css text/xml application/javascript;#<==用来指定压缩类型,"text/html"类型总是会被压缩,这个就是 HTTP
原理部分讲的媒体类型;
gzip_vary on;                #<==vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如 用Squid缓
存经过 Nginx缓存 经Nginx压缩的数据;

完整的配置如下:

 gzip on;
 gzip_min_length 1k;
 gzip_buffers 4 32k;
 gzip_http_version 1.1;
 gzip_comp_level 9;
 gzip_types text/css text/xml application/javascript;
 gzip_vary on;

2.5配置Nginx expires缓存实现性能优化

1.Nginx expires功能介绍

简单说:Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。

更深入的理解:expires的功能就是允许通过Nginx配置文件控制HTTP的”Expires”和”Cache-Control”响应头部内容,告诉客户端浏览器是否缓存和缓存多久以内访问的内容。这个expires模块控制Nginx服务器应答时的expires头内容和Cache-Control头的max-age指令。缓存的有效期可以设置为相对于源文件的最后修改时刻或客户端的访问时刻。

这些HTTP头向客户端表明了内容的有效性。如果客户端本地有内容缓存,则内容就可以从缓存(除非过期)而不是从服务器中读取,然后客户端会检查缓存中的副本,看其是否过期或失效,以决定是否重新从服务器获得内容更新。

2.Nginx expires作用介绍

在网站的开发和运营中,视频、图片、CSS、JS等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户浏览器本地缓存365天或3650天,而将CSS、JS、html等代码缓存10~30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存相应的内容,下次用户再打开类似的页面时,重复的元素就无需下载了,从而加快用户访问速度。用户的访问请求和数据减少了,也可以节省大量的服务器端带宽。功能和Apache的expires功能类似。

3.Nginx expires功能优点

  1. expires可以降低网站的带宽,节约成本
  2. 加快用户访问网站的速度,提示用户访问体验
  3. 降低服务器访问量从而压力减轻,成本下降,节约人力成本

4.Nginx expires配置详解
这里以location标签为例,通过location URI规则将需要缓存的扩展名列出来,然后指定缓存时间,如果针对所有内容设置缓存,也可以不用location,Nginx默认安装了expires功能。

(1)根据文件扩展名进行判断,添加expires功能范例

范例1:

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 3650d;
 }

该范例的意思是当用户访问网站URL结尾的文件扩展名为上述指定类型的图片时,设置缓存3650天,即10年。

范例2:

 location ~ .*\.(js|css)?$
 {
 expires 30d;
 }

该范例的意思是当用户访问网站URL结尾的文件扩展名为js,css类型的元素时,设置缓存30天,即1个月。

上述两个范例的实际配置结果如下:

server {
 listen 80;
 server_name localhost;
 location / {
 root /usr/share/nginx/html;
 index index.html index.htm;
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 3650d;
 }

location ~ .*\.(js|css)?$
 {
 expires 30d;
 }

error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 root /usr/share/nginx/html;
 }
 }

特别注意:location内容一般放到虚拟主机配置中,即server标签中。

(2)根据URI中的路径(目录)进行判断,添加expires功能范例

范例3:

 location ~ ^/(images|javascripts|js|css|flash|media|static)
 {
 expires 360d;
 }

该范例的意思是当用户访问网站URL中包含上述路径(例:images、js、css,这些在服务器端是程序目录)时,把访问的内容设置缓存360天,即1年。

(3)单个文件添加expires功能的范例

下面命令给robots.txt机器人文件设置过期时间(这里为7天)在这7天并不记录404错误日志。

 location ~ (robots.txt)
 {
 expires 7d;
 break;
 }

2.6Nginx日志相关优化与安全

1.编写脚本实现Nginx access日志轮询

1)如下

 [root@izm5eh8g1nh0vcbupue6dnz scripts]# pwd
 /server/scripts
 [root@izm5eh8g1nh0vcbupue6dnz scripts]# cat crontab_nginx.sh
 #!/bin/bash
 logPath=/application/nginx/logs/access.log
 mv $logPath ${logPath}_$(date +%F -d -1day)
 /application/nginx/sbin/nginx -s reload
 [root@izm5eh8g1nh0vcbupue6dnz scripts]# crontab -l
 #mv nginx logs
 00 00 * * 7 /bin/sh /server/scripts/crontab_nginx.sh &amp;&gt;/dev/null

2.不记录不需要的访问日志

在实际工作中,对于负载均衡器健康节点检查或某些特定文件(比如图片、JS、CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入太频繁会消耗大量磁盘I/O,降低服务的性能。

具体配置如下:

 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
 access_log off;
 }

这里用location标签匹配不记录日志的元素扩展名,然后关掉日志。

3.访问日志的权限设置

 [root@izm5eh8g1nh0vcbupue6dnz extra]# chown -R root.root /application/nginx/logs/
 [root@izm5eh8g1nh0vcbupue6dnz extra]# chmod -R 700 /application/nginx/logs/

2.7Nginx站点目录及文件URL访问控制

1.根据扩展名限制程序和文件访问

Web2.0时代,绝大多数网站都是以用户为中心的,例如:bbs、blog、sns产品,这几个产品都有一个共同特点,就是不但允许用户发布内容到服务器,还允许用户发图片甚至上传附件到服务器上,由于为用户开了上传的功能,因此给服务器带来了很大安全风险。虽然很多程序在上传之前会做一定的控制,例如:文件大小、类型等,但是,一不小心就会被黑客钻了空子,上传木马程序。

此处利用Nginx配置禁止访问上传资源目录下的PHP、Shell、Perl、Python程序文件,这样用户即使上传了木马文件也没法执行,从而加强网站的安全。

范例1:配置Nginx,禁止解析指定目录下的指定程序

server {
 listen 80;
 server_name www.xionghaier.com;
 location / {
 root html/blog;
 index index.php index.html index.htm;
 }

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
 access_log off;
 }

 location ~ ^/images/.*\.(php|php5|sh|pl|py)$ {
 deny all;
 }

location ~ ^/static/.*\.(php|php5|sh|pl|py)$ {
 deny all;
 }

 location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ {
deny all;
 }

#<==对上述目录的限制必须写在Nginx处理PHP服务配置的前面,如下:

 location ~* .*\.(php|php5)?$ {
 root html/blog;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 }
 }

范例2:Nginx下配置禁止访问*.txt*.doc文件

配置如下:

 location ~* \.(txt|doc)$ {
 if (-f $request_filename) {
 root /data/www/www;
 #rewrite ... 可以重定向到某个URL
 break;
 }
 }

location ~* \.(txt|doc)$ {
 root /data/www/www;
 deny all;
 }

2.8禁止访问指定目录下的所有文件和目录

范例1:禁止访问指定的单个或多个目录

 禁止访问单个目录的命令:
 location ~ ^/(static)/ {
 deny all;
 }

location ~ ^/static {
 deny all;
 }
 禁止访问多个目录的命令:
 location ~ ^/(static|js) {
 deny all;
 }

范例2:禁止访问目录并返回指定的HTTP状态码,命令如下:

 server {
 listen 80;
 server_name www.xionghaier.com;
 location / {
 root html/blog;
 index index.php index.html index.htm;
 location /admin/ { return 404; }
 }

作用:禁止访问目录下的指定文件,或者禁止访问指定目录下的所用内容。
最佳应用场景:对于集群的共享存储,一般是存放静态资源文件,所有可禁止执行指定扩展名的程序,例:php、sh、pl、py

2.9限制网站来源IP访问

使用ngx_http_access_module限制网站来源IP访问

范例1:禁止某目录让外界访问,但允许某IP访问该目录,且支持PHP解析,命令如下:

 location ~ ^/chengzi/ {
 allow 202.187.34.56;
 deny all;
 }

范例2:限制指定IP或IP段访问,命令如下:

 location / {
 deny 192.168.56.1;
 allow 192.168.56.0/24;
 allow 10.34.1.0/16;
 deny all;
 }

参考:http://nginx.org/en/docs/http/ngx_http_access_module.html

企业问题案例:Nginx做反向代理的时候可以限制客户端IP吗
具体方法如下:
方法1:使用if来控制,命令如下:

if ( $remote_addr = 10.0.0.6 ) {
 return 403;
 }

if ( $remote_addr = 218247.17.130 ) {
 set $allow_access_root 'ture';
 }
 http://nginx.org/en/docs/varindex.html

方法2:利用deny和allow只允许IP访问,命令如下:

 location / { 
 root html/blog; 
 index index.php index.html index.htm; 
 allow 10.0.0.7; deny all; 
 }

方法3:只拒绝某些IP访问命令如下:

 location / { 
 root html/blog;
 index index.php index.html index.htm;
 deny 10.0.0.7; allow all;
 }

注意事项:
deny一定要加一个IP,否则会直接跳转到403,不再往下执行了,如果403默认页是在同一域名下,会造成死循环访问
对于allow的IP段,从大到小127.0.0.0/24到10.0.0.0/16
以deny all;结尾,表示除了上面允许的,其他的都禁止

3.0配置Nginx,禁止非法域名解析访问企业网站

问题:Nginx如何防止用户IP访问网站(恶意域名解析,也相当于是直接IP访问网站)

方法1:让使用IP访问网站的用户,收到501错误,命令如下:

server {
 listen 80 default_server;
 server_name _;
 return 501;
}

方法2:通过301跳转到主页,命令如下:

 server {
 listen 80 default_server;
 server_name _;
 rewrite ^(.*) http://xionghaier.centoscn.cn/$1 permanent;
}

方法3:发现某域名恶意解析到公司的服务器IP,在server标签里添加以下代码即可,若多个server则要多处添加

if ($host !~ ^www/.xionghaier/.cn$) {
    rewrite ^(.*) http://xionghaier.centoscn.cn$1 permanent;
}

2
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到