nginx相关优化

nginx相关优化

一、隐藏nginx header内版本号信息

一些特定的系统及服务漏洞一般都和特定的软件和版本号有关,我们尽量隐藏服务器的敏感信息(软件名称及版本等信息),这样×××无法准确猜到有漏洞的服务是否对应服务的版本,从而确保web服务器最大的安全。

1、利用curl查看隐藏前header内的web版本号信息。

[root@centos4 ~]# curl -I 192.168.115.10

HTTP/1.1 502 Bad Gateway

Server: nginx/1.12.1    这里显示Nginx的版本

Date: Sun, 24 Sep 2017 13:33:25 GMT

2、用浏览器访问web服务有时候也会出现软件名称和版本号。

以上两种方式访问不但暴露了Nginx软件的名称,而且暴露了Nginx特定的版本号,这样就会给服务的安全带来一定的风险,应禁止掉。

 

3、修改配置文件参数实现隐藏版本号

在nginx配置文件nginx.conf中的http标签下加入“server_tokens off;”如下:

[root@centos4 conf]# vim nginx.conf

http {

server_tokens off;

…………………………………………………省略若干

:wq

 

[root@centos4 conf]# /usr/local/nginx-1.12.1/sbin/nginx -s reload  [root@centos4 conf]# curl -I 192.168.115.10

HTTP/1.1 200 OK

Server: nginx    这里已经没有Nginx的版本了

Date: Sun, 24 Sep 2017 13:55:24 GMT

 

注意:server_tokens off;的放置位置为http标签内,如果放错了位置,加载nginx时会出现如下报错信息。

[root@centos4 conf]# /usr/local/nginx-1.12.1/sbin/nginx -s reload

nginx: [emerg] "server_tokens" directive is not allowed here in /usr/local/nginx-1.12.1/conf/nginx.conf:5

 

二、更改nginx的默认用户及用户组nobody

1、nginx服务启动,使用的默认用户是nobody,为了防止×××猜到这个用户,我们需要更改用户和用户组,提供给nginx服务用。

[root@centos4 conf]# grep user nginx.conf

#user  nobody;

 

2、更改默认用户的方法有两种,第一种为设置Nginx worker进程运行的用户以及用户组,如果注释或不设置,默认即是nobody用户和组,不推荐使用nobody用户名称,最好采用一个普通用户,如:nginx

[root@centos4 conf]# useradd nginx -s /sbin/nologin -M  创建一个不能登录系统的普通用户

[root@centos4 conf]# grep user nginx.conf

user  nginx nginx;

 

3、更改默认用户的第二种方法为编译的时候添加”--user=nginx --group=nginx”这两个参数即可。

[root@centos4 nginx-1.12.1]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.12.1

 

4、最后检查nginx进程的对应用户

[root@centos4 ~]# ps -ef|grep nginx|grep -v grep

root      1854     1  0 21:28 ?        00:00:00 nginx: master process /usr/local/nginx-1.12.1/sbin/nginx

nginx     1986  1854  0 22:04 ?        00:00:00 nginx: worker process

我们看到worker process的进程对应的用户都变成Nginx了。

 

三、配置nginx worker优化进程个数

1、指定nginx开启的进程数方法

在高并发场景,我们需要事先启动更多的nginx进程以保证快速响应并处理用户的请求。具体的配置参数如下:

[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf

worker_processes  1;     

指定了nginx要开启的进程数,建议指定和CPU数量相等或CPU的两倍

worker_processes参数开始的设置可以等于CPU的个数或核数(worker_cpu_affinity参数中的配置可以指定第一个到最后一个进程分别使用的哪个CPU),进程数多一些,起始提供服务时就不会临时启动新进程提供服务,减少了系统的开销,提升了服务速度。特殊场合也可以考虑提高至CPU*2的进程数,可根据实际情况作出调整。这个参数除了CPU核数影响外和硬盘存储的数据以及负载也有关。

2、查看Linux服务器的核数

[root@centos4 ~]# grep "physical id" /proc/cpuinfo |sort|uniq|wc -l  查看物理CPU的核数

0

[root@centos4 ~]# grep "cpucores" /proc/cpuinfo|uniq   查看CPU单核心数

[root@centos4 ~]# grep "processor" /proc/cpuinfo|wc -l   查看CPU逻辑核心数

1

 

3、这里我们修改worker_processes的参数值为4,然后重新加载nginx

[root@centos4 ~]# sed -i 's/worker_processes  1/worker_processes  4/g' /usr/local/nginx-1.12.1/conf/nginx.conf     修改参数为4

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

[root@centos4 ~]# grep worker_processes /usr/local/nginx-1.12.1/conf/nginx.conf

worker_processes  4;         查看修改后的参数

4、检查进程数,可以看到,当worker_processes 4时,worker进程数为4个,master主进程不包含在内。

[root@centos4 ~]# ps -ef|grep nginx|grep -v grep

root      1858     1  0 10:47 ?        00:00:00 nginx: master process /usr/local/nginx-1.12.1/sbin/nginx

nginx     1859  1858  0 10:47 ?        00:00:00 nginx: worker process            

nginx     1860  1858  0 10:47 ?        00:00:00 nginx: worker process            

nginx     1861  1858  0 10:47 ?        00:00:00 nginx: worker process            

nginx     1862  1858  0 10:47 ?        00:00:00 nginx: worker process   

 

四、根据CPU核数进行nginx进程优化

默认情况nginx的多个进程可能更多的跑在一颗CPU上,这里是分配不同的进程给不同的CPU处理,达到充分利用硬件多核多CPU的目的。

1、不同的CPU对应配置如下

四核CPU服务器:

编辑nginx.conf配置文件,在里面加入如下信息

[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf

worker_processes  4;

worker_cpu_affinity 0001  0010  0100  1000;

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

nginx进程CPU亲和力,即把不同的进程分给不同的CPU处理这里0001  0010  0100  1000是掩码,表示第1、2、3、4CPU核心。

 

八核CPU服务器:

编辑nginx.conf配置文件,在里面加入如下信息

[root@centos4 ~]# vim /usr/local/nginx-1.12.1/conf/nginx.conf

worker_processes  8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;

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

 

2、掩码修改完成之后,使用压力测试命令查看结果

[root@centos4 ~]# webbench -c 20000 -t 180 http://192.168.115.10/

通过观察,发现配置后不同CPU使用率相对平均,和配置前变化不大,因此默认就比较平均,一方面是软件自身在逐渐的优化使用多核CPU,另一方面测试的数据也有待调整。

 

taskset是一个Linux中调节CPU亲和力(分配CPU)的命令

taskset -c 1,2,3 /etc/init.d/mysql start 让MySQL进程跑到CPU的1,2,3核心上。

 

五、nginx事件处理模型优化

nginx的连接处理机制在不同的操作系统中会采用不同的I/O模型:Linux上使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在Solaris中使用/dev/poll方式的多路复用模型,在windows中使用icop.等等。

根据系统类型的不同,选择不同use[ kqueue | rtsig | epoll | /dev/poll | select | poll ];该参数结合系统使用,不同系统使用参数不同,我们使用的是centos 6.8,因此我们调整为epoll模型。

具体的配置参数如下。

events    events指令是设定Nginx的工作模式及连接数上限

{

worker_connections  1024;

use epoll;

use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有selectpollkqueueepollrtsig/dev/poll。其中selectpoll都是标准的工作模式,kqueueepoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统linux2.6+的内核,推荐选择epoll工作模式,这是高性能高并发的设置。

}

 

六、调整单个进程允许的客户端最大连接数。

这个值根据具体服务器性能和程序的内存使用量来指定(一个进程启动使用的内存根据程序确定)

events {       events指令是设定Nginx的工作模式及连接数上限

    worker_connections  1024;

worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024,最大客户端连接数由worker_processesworker_connections决定,即Max_client=worker_processes*worker_connections。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -Hsn 65535”或配置相应文件后worker_connections的设置才能生效。

}

 

 

七、配置每个进程最大文件打开数

worker_rlimit_nofile 65535;

每个进程打开的最大文件数,可设置为系统优化后的ulimit-Hsn的结果,在之前安装系统时,调整文件描述符和这个处理的一个问题。在http://nginx.org/en/docs/ngx_core_module.html这个模块里。

 

八、优化服务器名字的hash表大小

确切名字和通配符名字存储在哈希表中,哈希表和监听端口关联,每个端口最多关联到三张表,确切名字的哈希表,以星号起始的通配符名字的哈希表和以星号结束的通配符名字的哈希表。哈希表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中失败来找到名字。因为名字是按照域名的节来搜索的,所以搜索通配符名字的哈希表比搜索确切名字的哈希表慢。

注意:.nginx.org存储在通配符名字的哈希表中,而不在确切名字的哈希表中。正则表达式是一个一个串行的测试,所以是最慢的,而且不可扩展。

     鉴于以上原因,请尽可能使用确切的名字,例如:使用nginx.org和www.nginx.org来访问服务器是最频繁的,那么将他们明确的定义出来就更为有效。

server {

    listen       80;

    server_name  nginx.org  www.nginx.org;

不要使用*.nginx.org这样的域名匹配。

……………………………..

      }

 

下面这种方法相比更简单,但是效率也更低:

server {

    listen       80;

    server_name  .nginx.org;

……………

}

如果定义了大量名字,或者定义了非常长的名字,那就需要在http配置块中调整server_names_hash_max_size和server_names_hash_bucket_size的值。

server_names_hash_bucket_size的默认值可能是32,或者64,或者是其他值,取决于CPU的缓存行的长度。如果这个值是32,那么定义”too.long.server.name.nginx.org”作为虚拟主机名就会失败,显示下面错误的信息:

could not build the server_names_hash,

you should increase server_names_hash_bucket_size: 32

出现了这种情况,那就需要将设置值扩大一倍

http {

   server_names_hash_bucket_size 64;

如果定义了大量名字,得到了另外一个错误.

could not build the server_names_hash,

you should increase either server_names_hash_max_size: 512

or server_names_hash_bucket_size: 32

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

如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟机主机名了(也不会建立那些名字哈希表)。不过,有一个例外,如果server_name是一个含有捕获组的正则表达式,这是nginx就不得不执行这个表达式以得到捕获组。

server_names_hash_max_size 512;

默认是512KB,一般要查看系统给出确切的值,这里一般CPU L14-5倍。

 

九、开启高效文件传输模式

sendfile on;

sendfile参数用于开启文件高效传输模式。同时将tcp_nopushtcp_nodelay两个指令设置为on用于防止网络阻塞。

tcp_nopush  on;

打开LinuxTCP_CORKsendfile参数打开时才有效,作减少报文段的数量之用

 

十、设置连接的超时时间

keepalive_timeout  65;

设置客户端连接保持会话的超时时间。超过这个时间服务器会关闭该连接

 

tcp_nodelay  on;

打开tcp_nodelay,在包含了keepalive参数才有效

 

client_header_timeout  15;

设置客户端请求头读取超时时间,如超过这个时间,客户端还没有发送任何数据,nginx将返回”Request timeout(408)”错误。

 

client_body_timeout  15;

设置客户端请求主体读取超时时间。如超过这个时间,客户端还没有发送任何数据,nginx将返回”Request timeout(408)”错误,默认值是60

 

send_timeout  15;

指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

 

十一、上传文件大小限制(动态应用)

Nginx主配置文件nginx.conf里加入如下参数,具体大小根据自己的业务做调整。

client_max_body_size  10m;

 

十二、fastcgi调优(配合PHP引擎动态服务)

fastcgi_connect_timeout 300;

指定连接后到后端fastCGI的超时时间

 

fastcgi_send_timeout 300;

fastCGI传送请求的超时时间,这个值是指已经完成两次握手后向fastCGI传送请求的超时时间

 

fastcgi_read_timeout 300;

指定接收fastCGI应答的超时时间,这个值是指已经完成两次握手后接收fastCGI应答的超时时间

 

fastcgi_buffer_size 64k;

指定读取fastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用164KB的缓冲区读取应答的第一部分(应答头),可以 设置为fastcgi_buffers选项指定的缓冲区大小。

 

fastcgi_buffers 4 64k;

指定本地需要用多少和多大的缓冲区来缓冲fastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配464KB的缓冲区来缓存;如果页面大小大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的塑胶处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为”16 16k””4 64k”等。

 

fastcgi_busy_buffers_size 128k;

建议为fastcgi_buffers的两倍

 

fastcgi_temp_file_write_size 128k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,设置上述数值设置太小时若负载上来时可能报502 Bad Gateway

 

fastcgi_cache oldboy_nginx;

表示开启fastCGI缓存并为其指定一个名词。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发送,但是开启缓存也肯会引起其他问题,要根据具体情况选择

 

fastcgi_cache_valid 200 302 1h;

用来指定应答代码的缓存时间,实例中的值表示将200302应答缓存一个小时

 

fastcgi_cache_valid 301 1d;

301应答缓存1

 

fastcgi_cache_valid any 1m;

将其他应答缓存为1分钟

 

fastcgi_cache_min_uses 1;

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数

 

十三、配置Nginx gzip压缩功能

Nginx gzip压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容在发送到客户端之前根据具体的策略进行压缩,以节约网站带宽,同时提升用户访问体验。缺点是占用服务器CPU资源。

此功能同Apache的mod_deflate压缩功能,依赖ngx_http_gzip_module模块,默认已装。

压缩从程序来看,所有的程序文件(包括js,css,html文件)都需要压缩;不需要压缩的内容有(图片,视频,flash文件)不需要压缩。总之就是数据、文本需要压缩,二进制文件,视频等不需要压缩。

 

对应的压缩参数说明如下

gzip on;   开启gzip压缩功能

 

gzip_min_length  1k;

设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大。

 

gzip_buffers  4 16k;

压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结构流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

 

gzip_http_version 1.0;

压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可(这个参数可以不加)。

 

gzip_comp_level 2;

压缩比率,用来指定gzip压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。

 

gzip_types  text/plain application/x-javascript  text/css  application/xml;

用来指定压缩的类型,”text/html”类型总是会被压缩。

 

gzip_vary  on;

vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据。

 

完整的配置如下(这些配置可以放在http标签下面,表示全局生效;也可以放在server标签下面,表示server标签内的主机生效)

[root@centos4 ~]# /usr/local/nginx-1.12.1/sbin/nginx   启动Nginx服务

[root@centos4 ~]# cd /usr/local/nginx-1.12.1/conf/

[root@centos4 conf]# vim nginx.conf

http {

gzip on;

gzip_min_length  1k;

gzip_buffers  4 32k;

gzip_http_version 1.1;

gzip_comp_level 9;

gzip_types  text/plain application/x-javascript  text/css  application/xml;

gzip_vary  on;

……………………………………….下面省略若干

通过火狐浏览器加yslow插件查看gzip压缩及expires缓存结果。

image.png

通过curl命令查看nginx的gzip压缩结果

 [root@centos6 nginx-1.12.1]# curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.115.10/jquery.js"

HTTP/1.1 200 OK

Server: nginx/1.12.1

Date: Thu, 26 Oct 2017 05:25:06 GMT

Content-Type: application/javascript     这里是gzip压缩的文件类型

Last-Modified: Mon, 09 Oct 2017 07:18:26 GMT

Connection: keep-alive

Vary: Accept-Encoding

ETag: W/"59db22c2-119ee"

Content-Encoding: gzip   这里显示gzip就说明启用了gzip压缩功能

 

需要和不需要压缩的对象。

   大于1K的纯文本文件html,js,css,xml,shtml等需要压缩。

   图片,视频等不要压缩。因为不但不会减小,在压缩时还消耗CPU,MEM资源。

 

十四、配置nginx expires缓存功能

1、设置expires缓存的优缺点

设置expires优点:可以降低网站购买的带宽,节约成本同时提升了用户的访问体验,减轻服务器的压力,是web服务非常重要的功能。

 

设置expires缺点:被缓存的页面更新了,用户看到的可能还是旧的内容(jss,css,图片),反而影响用户体验。

 

解决方法:

  1、缩短缓存时间。

  2、对缓存的对象改名。图片,附件一般不会被用户修改,如果用户修改了,实际上也都是改文件名重新上传,网站升级对于js,css元素,一般可以改名。把css,js,推送到cdn。

 

2、一般不需要缓存的内容

一般不需要缓存的内容:广告图片,网站流量统计文件,更新频繁的文件。

     在网站开发和运营中,对图片,CSS,JS等元素更改机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,HTML等代码缓存10天,这样用户第一次打开页面后,会在本地的浏览器缓存相应的上述内容,这样的缓存可以提高下次用户打开类似页面的加载速度,并节省服务器端大量的带宽。此功能同Apache的expires

3、通过location配置expires缓存

这里通过location的功能,将需要缓存的扩展名列出来,然后指定缓存时间。

1

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 3650d;

}

 

2

location ~ .*\.(js|css)?$

{

expires 30d;

}

 

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

 

4、根据目录进行判断,添加 expires 功能范例

location ~ ^/(images|javascript|js|css|flash|media|static)/  {

expires 360d;

}

 

可以使用yslow插件或通过curl命令即可查看gzip压缩和expires缓存结果。

image.png

5、通过curl命令查看缓存结果

[root@centos1 ~]# curl -I https://www.taobao.com                                                  

HTTP/1.1 200 OK

Server: Tengine

Date: Thu, 26 Oct 2017 08:22:04 GMT

Content-Type: text/html; charset=utf-8

Connection: keep-alive

Vary: Accept-Encoding

Vary: Ali-Detector-Type, X-CIP-PT

Cache-Control: max-age=60, s-maxage=90

Via: cache7.l2cn708[384,200-0,M], cache3.l2cn708[385,0], cache1.cn310[0,200-0,H], cache5.cn310[1,0]

Age: 44

X-Cache: HIT TCP_MEM_HIT dirn:-2:-2 mlen:-1

X-Swift-SaveTime: Thu, 26 Oct 2017 08:21:20 GMT

X-Swift-CacheTime: 90

Timing-Allow-Origin: *

EagleId: 7cc1ebe615090061244154222e

Set-Cookie: thw=cn; Path=/; Domain=.taobao.com; Expires=Fri, 26-Oct-18 08:22:04 GMT;

Strict-Transport-Security: max-age=31536000

6、单个文件添加expires功能范例

给robots.txt设置过期时间,这里为robots.txt为7天并不记录404错误日志。

location ~(robots.txt) {

       log_not_found  off;

       expires  7d;

       break;

}

总体完全配置为:

server

{

listen  80;

server_name  www.long.com;

index index.html index.htm index.php;

root  /data/www/blog;

access_log  /var/logs/blog_access.log  commonlog;

location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires   3650d;

}

 

location ~ .*\.(js|css)?$

{

expires  30d

}

  

location ~robots.txt {

      log_not_found  off;

      expires  7d;

      break;

}

#add expires header according to dir.

location ~ ^/(images|javascript|js|css|flash|media|static)  {

expires  360d;

}

}

 

十五、Nginx日志相关优化与安全

1、编写脚本实现Nginx access日志轮循

Nginx没有类似Apache的cronolog日志分割处理的功能,但是可以通过Nginx的信号控制功能或者reload重新加载,然后用脚本实现日志的自动切割。

详细操作过程如下:

n  配置日志切割脚本

cat cut_nginx_log.sh

#!/bin/bash

cd /usr/local/nginx/logs &&\

/bin/mv  www_access.log  www_access_$(date +%F –d -1day).log

/usr/local/nginx/sbin/nginx –s reload

这个脚本的功能很简单,就是把原来的日志改名,然后重新加载Nginx,生成文件记录日志

n  将这段脚本保存后加入到linux的crontab守护进程,让此脚本在每天凌晨执行,就可以实现日志的每天分割功能了,

2、禁止记录不需要的访问日志

  对于健康检查或某些图片的日志,一般不需要记录,因为在统计PV时是按照页面的计算。而且日志写入频繁会消耗磁盘IO,降低服务性能。

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

   access_log  off;

}

 

 

十六、最小化网站目录及文件权限设置。

为了保证网站不遭受×××***上传及修改文件。

安全的权限:

1、所有站点目录的用户和组都应该为root

2、所有目录权限是默认的755

3、所有文件权限是默认的644

注意:网站服务的用户不能用root

 

十七、最小化日志目录权限。

假如日志目录为/var/logs,则授权方法为:

chown –R root.root /var/logs

chmod –R 700 /var/logs

 

十八、Nginx站点目录及文件URL访问控制

Nginx下禁止访问资源目录下的PHP程序文件,配置方法如下:

1Nginx配置限制指定目录下的PHP程序被解析

location ~ ^ /images/.*\.(php|php5)$

   {

      Deny all;

}

#静态文件中有php文件就拒绝执行。

location ~ ^ /static/.*\.(php|php5)$   

       {

           dell  all;

       }

 

location ~* ^ /data/(attachment|avatar)/.*\.(php|php5)$

     {

       deny  all;

     }

 

这些目录的限制必须写在一些配置的前面:

location ~ .*\.(php|php5)?$

{

       fastcgi_pass   127.0.0.1:9000;

       fastcgi_index  index.php;

       include fcgi.conf;

}

 

2Nginx下配置禁止访问*.txt文件

location ~* \.(txt|doc)$  {

      if (-f  $request_filename)  {

      root  /date/www/www;

#     rewrite  ……..可以重定向到某个URL

      break;

      }

}

 

location ~* \.(txt|doc)$  {

      root  /date/www/www;

      deny  all;

}

 

十九、禁止访问指定目录下所有的文件和目录。

1:配置禁止访问指定的单个或多个目录。

单目录:

location ~ ^/(static)/  {

      deny  all;

}

 

location ~ ^/static  {

     deny  all;

}

 

多目录:

location ~ ^/(static|js)  {

      deny  all;

}

 

2:禁止访问目录并返回指定的http状态码。

location  /admin/  { return 403; }

location  /templates/  { return  403;}

 

例:

server {

listen    80;

server_name  www.long.com  long.com;

root   /data0/www/www;

index  index.html  index.htm;

access_log  /var/logs/www_access.log  commonlog;

location  /admin/  { return 404; }

location  /templates/  { return 403; }

 

二十、限制来源IP访问。

使用ngx_http_access_module限制IP访问

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

location ~ ^/long/  {

     allow  202.111.12.211;

     deny  all;

}

     location ~ .*\.(php|php5)?$  {

fastcgi_pass  127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;

include        fastcgi_params;

 }

 

2:限制及指定IPIP段访问

location / {

      deny  192.168.1.1;

      allow  192.168.1.0/24;

      allow  10.1.1.0/16;

      deny  all;

}

 

二十一、设置Nginx错误页面优雅显示

1:错误码403跳转

server {

     listen   80;

     server_name   www.long.com;

     location / {

          root   html/www;

          index  index.html  index.htm;

    }

     error_page  403  /403.html;   此路径相对于root  html/www;

 }

 

2:错误码404错误本地文件优雅显示

error_page   404      /404.html;

server {

     listen   80;

     server_name   www.long.com;

     location  /  {

         root   /data0/www/bbs;

         index  index.html  index.htm;

         error_page  404    /404.html;

         access_log   /var/logs/bbs_access_log   commonlog;

      }

}

提示:注意写法,/404.html/data0/www/bbs目录下的文件。

 

3: 50x页面本地单独目录下文件优雅显示。

error_page  500 502 503 504  /50x.html;

   location = /50x.html  {

        root   /data0/www/html;

}

提示:指定单独的站点目录存放50x.html文件。

 

4:改变状态码为新的状态码,并显示指定的文件内容。

server {

     listen   80;

     server_name  www.long.com;

     location / {

          root  /data0/www/bbs;

          index  index.html  index.htm;

fastcgi_intercept_errors  on;

          error_page  404 = 200    /ta.jpg;

          access_log   /var/logs/bbs_access.log  commonlog;

 

5:错误状态码url重定向。

error_page  403       http://example.com/forbiden.html;

error_page  404 = 301  http://example.com/notfound.html;

fastcgi_intercept_errors  on;

error_page   403   /403.html;

error_page   404   http://long.blog.51cto.com;

 

 

6:将错误状态码重定向到一个location.

location  /  {

    error_page  404 = @fallback;

}

 

location  @fallback {

    proxy_pass  http://backend;

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章