您的位置:首页 > 运维架构 > Nginx

Nginx调优详解

2019-08-11 23:52 1191 查看

6.21 Nginx调优

6.21.1 隐藏Nginx版本号

第1步:上传源码并解压

cd /root/softwares

tar -xf nginx-1.14.1.tar.gz -C /usr/local/src

第2步:修改跟版本信息有关源代码文件

1. 修改nginx软件版本号

[root@nginx src]# cd /usr/local/src/nginx-1.14.1

[root@nginx nginx-1.14.1]# vim src/core/nginx.h

改:

13 #define NGINX_VERSION      "1.14.1"

14 #define NGINX_VER          "nginx/" NGINX_VERSION

为:

13 #define NGINX_VERSION      "8.9.2"

14 #define NGINX_VER          "W_xruan/" NGINX_VERSION

 

2. 修改HTTP头信息中的connection字段,防止回显具体版本号

[root@nginx nginx-1.14.1]# vim src/http/ngx_http_header_filter_module.c

改:

49 static u_char ngx_http_server_string[] = "Server: nginx" CRLF;

为:

49 static u_char ngx_http_server_string[] = "Server: Wxruan" CRLF;

 

3. 修改ngx_http_special_response.c文件,防止报404错误时回显版本号

[root@nginx nginx-1.14.1]# vim src/http/ngx_http_special_response.c

改:

36 "<hr><center>nginx</center>" CRLF

为:

36 "<hr><center>Wxruan</center>" CRLF

第3步:编译安装nginx

先安装依赖软件包:

yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel

编译安装nginx:

./configure --prefix=/usr/local/nginx \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_realip_module \

--with-http_gzip_static_module \

--with-http_stub_status_module \

--with-pcre

make -j 4 && make install

4. 测试

启动nginx:

[root@nginx nginx-1.14.1]# /usr/local/nginx/sbin/nginx

[root@nginx nginx-1.14.1]# netstat -tunpl | grep :80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4441/nginx: master

用curl访问nginx:

[root@redis01 ~]# curl -I 172.16.1.84

HTTP/1.1 200 OK

Server: W_xruan/8.9.2

Date: Fri, 09 Aug 2019 01:48:10 GMT

Content-Type: text/html

Content-Length: 612

Last-Modified: Fri, 09 Aug 2019 01:47:18 GMT

Connection: keep-alive

ETag: "5d4cd0a6-264"

Accept-Ranges: bytes

说明:nginx服务器的类型和版本号都隐藏了。

 

测试404报错页面:

说明:nginx服务器的类型和版本号都修改了。

5)软件包和编译参数说明

软件包说明:

软件包

说明

gcc

c语言编译器。

gcc-c++

c++语言编译器。

autoconf automake

用于configure和 make编译的工具。

zlib

nginx提供gzip模块,需要zlib库支持。

openssl

nginx提供ssl功能。

pcre

支持地址重写rewrite功能。

 

编译参数说明:

参数

说明

--with-http_dav_module

启用支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)。

--with-http_stub_status_module

启用支持(获取Nginx上次启动以来的工作状态)。

--with-http_addition_module

启用支持(作为一个输出过滤器,支持不完全缓冲,分部分相应请求)。

--with-http_sub_module

启用支持(允许一些其他文本替换Nginx相应中的一些文本)。

--with-http_flv_module

启用支持(提供支持flv视频文件支持)。

--with-http_mp4_module

启用支持(提供支持mp4视频文件支持,提供伪流媒体服务端支持)。

--with-pcre

需要注意,这里指的是源码,用#./configure --help |grep pcre查看帮助。

6.21.2 修改环境变量和nginx运行用户

cat >> /etc/profile.d/nginx.sh << EOF

PATH=/usr/local/nginx/sbin/:\$PATH

export PATH

EOF

source /etc/profile.d/nginx.sh

添加nginx运行用户:

useradd -r -M -s /sbin/nologin nginx

修改nginx主配置文件:

sed -i 's/#user  nobody;/user  nginx;/g' /usr/local/nginx/conf/nginx.conf

启动nginx生效:

[root@nginx conf]# nginx

[root@nginx conf]# netstat -tunpl | grep nginx

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5200/nginx: master

 

6.21.3 设置nginx的cpu亲和力

1)配置nginx进程数

3 worker_processes  4;

12 events {

13     worker_connections  15000;

14 }

重载ngxin配置生效:

nginx -s reload

参数说明:

worker_processes:设置nginx进程数,改参数值一般是等于CPU物理核心数或物理核心数乘以1.5-2之间的值(经验数据)。

worker_connections:一个进程允许的并发连接数。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统ulimit -n设定的值和nginx的worker_connections的值。一般情况下系统ulimit -n、worker_rlimit_nofile 、worker_connections三者的值是一样的。

worker_processes* worker_connections就是nginx能够处理的并发连接数,如:nginx需要处理60000的并发请求,可以设置worker_processes=4,worker_connections=15000;或worker_processes=8,orker_connections=7500。

查看每个nginx进程使用的内存数:

[root@nginx ~]# top -u nginx

每个nginx使用的内存为2M左右。

2)设置Nginx运行CPU的亲和力:

CPU的亲和力,就是把nginx每个进程绑定到固定的cpu上,从而减少cpu上下文切换导致的额外的开销。

比如服务器是4核4线程的cpu,nginx.conf文件应该配置为如下:

3 worker_processes  4;

4 worker_cpu_affinity 0001 0010 0100 1000;

8核服务器8核心8线程的CPU,nginx.conf文件应该设置为如下:

3 worker_processes  8;

4 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

说明:

1. worker_cpu_affinity配置项只能对应用二进制表示的CPU编号。

2. worker_cpu_affinity项的配置必须与worker_processes项配合,如:

worker_processes 2;

worker_cpu_affinit 01 10;

3. worker_cpu_affinity配置项在实际工作中很少场景用得到,通常用在一些极端应用,需要压榨CPU性能的应用,大部分情况配置worker_processes项为auto或是CPU核心数 或 CPU核心数*(1-2)即可。

 

查看CPU亲和力设置效果:假设nginx.conf配置如下

worker_processes  2;

worker_cpu_affinity 001 100;

查看nginx进程和号:

[root@nginx ~]# pstree -p | grep nginx

           |-nginx(5200)-+-nginx(5603)

           |             `-nginx(5604)

查看进程分配的CPU编号:

[root@nginx ~]# taskset -cp 5603

pid 5603's current affinity list: 0   

[root@nginx ~]# taskset -cp 5604

pid 5604's current affinity list: 2

说明:

1. CPU编号从0开始,“worker_processes  2“ 表示使用2个CPU(或核心)运行nginx进程,“worker_cpu_affinity 001 100” 表示nginx的两个进程分别分配到第“0”号和第“2”好CPU。

2. 分配的nginx进程到哪个CPU编号跟二进制数“001”与“100”对应,与1所在的位置有关:

从右往左看,1所在第几位就分配给第几个CPU

001:分配第1个(编号为0)CPU

010:分配第2个(编号为1)CPU

100:分配第3个(编号为2)CPU

1000:分配第4个(编号为3)CPU

3. worker_processes项配置值与worker_cpu_affinity项的二进制个数必须是一致的,如:

worker_processe 4;,worker_cpu_affinity项就必须配置4个二进制数“0001 0010 0100 1000”。以此类推。

6.21.4 设置Nginx每个进程最多可以打开的文件数和事件处理模型

1)每个进程最多打开文件数

在nginx.conf配置全局设置中加入以下项:

worker_rlimit_nofile 102400;

说明:这个指令是指当一个Nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,即:(ulimit -n)/ worker_processes ,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。修改ulimit -n的值,可以参考linux系统调优的内容。

2)Nginx的事件处理模型

select,poll,epoll都是nginx下的IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

Epoll在Linux2.6内核中正式引入,和select和poll相似,其实都是I/O多路复用技术。

 

epoll优势:

1. Epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048,一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。

[root@nginx ~]# cat /proc/sys/fs/file-max

198351

2. 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。

3. Epoll在这点上使用了“共享内存”,更省内存,效率更高。

配置使用epoll:

在nginx.conf配置文件events段添加:默认也是epoll模式

13 events {

14     worker_connections  15000;

15     use epoll;

16 }

重载配置生效。

6.21.5 配置主机头和字符集及高效传输模式-连接超时时间

1)修改主机头

生产环境中都需要主机头:

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

36     server {

37         listen       80;

38         server_name www.xruan.com;

39

40         charset utf8;

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

说明:ServerName匹配方式:支持正则匹配

1. 精确匹配:www.xruan.com:域名为www.xruan.com

2. 左侧通配符匹配:*.aa.com:域名前面为任意0个或多个字符,后面为“.aa.com”

3. 右侧通配符匹配:www.*:域名前面为www.,后面为0个或多个字符

4. 正则表达式:~ ^.*\.aa\.com$:域名已任意字符开头,以“.a.com”结尾

5. default_server:

6. 服务IP地址:域名可以以IP地址代替

2)修改字符集

使用utf8作为WEB服务器字符集,基本上不会遇到编码问题:

40         charset utf8;

3)开启高效传输模式

主配置文件设置:

19     include       mime.types;

20     default_type  application/octet-stream;

28     sendfile        on;

29     tcp_nopush     on;

说明:

1. sendfile on;表示开启高效传输模式,此项默认开启。高效传输模式意思是传输层收到数据包后不作任何停留,全部发给应用层处理,假定nginx处理能力足够强, 多少数据包都能吞下。

2. 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

3. tcp_nopush on; 必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量。

4)设置连接超时时间

主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事儿,也就是我建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉!

同时我们也希望php建议短链接,消耗资源少。

修改主配置文件nginx.conf,在http段内,server外如下设置:

19 http {

20     include       mime.types;

21     default_type  application/octet-stream;

22

23     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

24     #                  '$status $body_bytes_sent "$http_referer" '

25     #                  '"$http_user_agent" "$http_x_forwarded_for"';

26

27     #access_log  logs/access.log  main;

28

29     sendfile        on;

30     tcp_nopush     on;

31

32     #keepalive_timeout  0;

33     keepalive_timeout  65;

34     tcp_nodelay on;

35     client_header_timeout 15;

36     client_body_timeout 15;

37     send_timeout 15;

38

参数说明:

参数项

设置值

说明

keepalive_timeout

65

客户端连接保持会话超时时间(单位:秒),超过这个时间,服务器断开这个链接。

tcp_nodelay

on

也是防止网络阻塞,不过要包涵在keepalived参数才有效。

client_header_timeout

15

客户端请求头读取超时时间(单位:秒),如果超过设个时间没有发送任何数据,nginx将返回request time out的错误。

client_body_timeout

15

客户端求主体超时时间(单位:秒),超过这个时间没有发送任何数据,和上面一样的错误提示。

send_timeout

15

响应客户端超时时间(单位:秒),这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接。

说明:tcp_nodelay、client_header_timeout;、client_body_timeout、send_timeout必须与keepalive_timeout项配合使用。

5)文件上传大小限制

限制上传文件大小可以避免占用过多服务器磁盘空间,也可以较少在传输过程中出错的机会。文件PHP可以修改上传文件大小限制,nginx也可以修改。

在http段内,server段外添加:client_max_body_size 10m;

19 http {

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

39     client_max_body_size 10m;

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

6.21.6 location匹配

nginx的location非常灵活,而且设置简单。

root html:表示站点默认根目录,这里是nginx安装目录下的html目录(/usr/local/nginx/html/)

index:表示站点默认主页索引文件,可以有多个。

1)绝对匹配

以“=”匹配url,最严格的匹配,有一点不同都匹配不成功。

例:

location = /file.txt {

root   /opt/www;

index  index.html index.htm;

}

如果在客户端访问的url不是http://ServerName/file.txt,则nginx不会到目录/opt/www下寻找文件file.txt,而是继续尝试能匹配的location。

2)正则匹配

以“~”或“~*”匹配url,很灵活。

~:区分大小写。

~*:不区分大小写。utl一般都不区分大小写。

例:

location ~ \.php$ {

root           html;

fastcgi_pass    127.0.0.1:9000;

fastcgi_index   index.php;

fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;

include        fastcgi_params;

}

匹配nginx安装目录下的html目录下的所有以“.php”结尾的文件,执行相应操作。

3)否定匹配

以“!~”匹配url。

!~:表示不匹配。

location !~ \.pnp$ {

root           html;

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

}

如果客户端访问的url不是以“.pnp”结尾的,就执行该location下的相应操作。

4)正则匹配中的符号含义

基本上跟Linux支持的正则匹配一样。

.:匹配任意一个字符。

$:以什么什么结尾。

^:以什么什么开头。

*:匹配任意个字符。

6.21.7 优化Fastcgi配置

1)Fastcgi相关概念

Fastcgi相关的个概念如下:

Cache:写入缓存区

Buffer:读取缓存区

Fastcgi是静态服务和动态服务的一个接口

2)配置fastcgi优化参数

在nginx.conf文件的httpd段加入以下内容:

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

#fastcgi_temp_path /data/ngx_fcgi_tmp;

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=nginx:512m inactive=1d max_size=40g;

注意:fastcgi_cache_path项指定的目录/data/ngx_fcgi_cache必须存在,且所有者为php-fpm的运行用户,这里是nginx,没有则需要手工创建:

[root@nginx ~]# mkdir -p /data/ngx_fcgi_cache

 

 

然后在location ~ \.php$ 段中加入以下内容:绿色字部分

        location ~ \.php$ {

            root          html;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;

            include       fastcgi_params;

            fastcgi_cache nginx;

            fastcgi_cache_valid 200 302 1h;

            fastcgi_cache_valid 301 1d;

            fastcgi_cache_valid any 1m;

            fastcgi_cache_min_uses 1;

            fastcgi_cache_use_stale error timeout invalid_header http_500;

            fastcgi_cache_key http://$host$request_uri;

        }

注意:其中nginx是keys_zone的名字,有上面的keys_zone=nginx语句定义。

 

检查nginx配置文件语法:

[root@nginx ~]# nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

检查配置成功。

 

名词解析:

1. URL(Uniform Resource Locator,统一资源定位符)

2. URN:Uniform Resource Name,统一资源名称

3. URI(Uniform Resource Identifier,统一资源标识符)

fastcgi cache资料:

官方文档:

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

 

3)Fastcgi优化参数说明

配置项

配置值

说明

fastcgi_connect_timeout

300

指定链接到后端FastCGI的超时时间。

fastcgi_send_timeout

300

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

fastcgi_read_timeout

300

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

fastcgi_buffer_size

64k

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

fastcgi_buffers

4 64k

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

fastcgi_busy_buffers_size

128k

建议设置为fastcgi_buffer的两倍,繁忙时候的buffer。

fastcgi_temp_file_write_size

128k

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

fastcgi_cache

nginx

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

fastcgi_cache_valid   200 302

1h

用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用。

fastcgi_cache_valid   301

1d

将301应答缓存一天。

fastcgi_cache_valid

1m

将其他应答缓存为1分钟。

fastcgi_cache_min_uses

1

请求的数量。

fastcgi_cache_path


定义缓存的路径。

 

6.21.8 gzip压缩网页调优

1)为什么要压缩

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。

Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate

一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的。

2)配置nginx压缩

修改主配置文件nginx.conf,按如下设置:

41     gzip  on;

42     gzip_min_length  1k;

43     gzip_buffers     4 32k;

44     gzip_http_version 1.1;

45     gzip_comp_level 9;

46     gzip_types  text/css text/xml application/javascript;

47     gzip_vary on;

nginx默认配置并没有开启压缩。

3)压缩配置参数说明

配置项

配置值

说明

gzip

on

启用压缩,nginx默认没有开启。

gzip_min_length

1k

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

gzip_buffers

4 32k

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

gzip_http_version

1.1

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

gzip_comp_level

9

压缩级别,也叫压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。

gzip_types

text/css text/xml   application/javascript

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

gzip_vary

on

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

6.21.9 缓存优化

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!

Expires缓存配置在server段里面:

server {

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

    location ~ .*\.(gif|jpe|jpeg|pnp|bmp|swf)$ {

        expires  365d;

 

}

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

        expires  30d;

}

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

}

 

也可以缓存整个目录:注意这里可能会跟访问 目录下的php文件配置有冲突,正在查找原因

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

expires 360d;

}

 

expire功能优点:

1. expires可以降低网站购买的带宽,节约成本。

2. 同时提升用户访问体验。

3. 减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

 

expire功能缺点:

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。

 

解决办法:

第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天。

第二个 对缓存的对象改名。

a. 图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已。

b. 网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。

 

网站不希望被缓存的内容:

1)广告图片

2)网站流量统计工具

3)更新频繁的文件(google的logo)

6.21.10 日志切割优化

1)日志切割的重要性

服务器日志需要定时归档或清除,因为有些服务器日志是很疯狂的,不清除很快会耗尽整个磁盘的空间。

日志优化的目的,是为了一天日志一压缩,按天存放,并且删除超过10天的归档。

实现方式:使用shell编写脚本,每天分割日志,脚本统一保存在/server/scripts/目录下。

编写脚本/server/scripts/cut_nginx_log.sh,添加以下内容:

#!/bin/bash

LOGDATE=$(date +%F -d -1day)

cd /usr/local/nginx/logs

if [ ! -d cut ];then

    mkdir cut

fi

mv access.log cut/access_$LOGDATE.log

mv error.log cut/error_$LOGDATE.log

/usr/local/nginx/sbin/nginx -s reload

/usr/bin/tar jcvf cut/$LOGDATE.tar.bz2 cut/*

rm -f cut/access*

rm -f cut/error*

find cut -type f -mtime +10 | xargs rm -f

 

编写计划任务:

cat >> /var/spool/cron/root << EOF

# Cut Nginx log every day scripts by xruan 2019-02-03

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh > /dev/null 2>&1

EOF

2)排除记录健康检查日志减少磁盘IO

健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,可以屏蔽这些如图片,js,css这些不宜变化的内容。

在server段下添加以下location:

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

access_log  off;

}

3)日志格式优化

nginx的日志记录格式默认没有开启,手工开启就行:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                  '$status $body_bytes_sent "$http_referer" '

                  '"$http_user_agent" "$http_x_forwarded_for"';

其中,各个字段的含义如下:

main:表示日志格式的名字,可以自定义,如:access。

1. $remote_addr:                  与$http_x_forwarded_for 用以记录客户端的ip地址;

2. $remote_user:                   用来记录客户端用户名称;

3. $time_local:                      用来记录访问时间与时区;

4. $request:                           用来记录请求的url与http协议;

5. $status:                              用来记录请求状态,成功是200;

6. $body_bytes_sent:            记录发送给客户端文件主体内容大小;

7. $http_referer:                    用来记录从哪个页面链接访问过来的;

8. $http_user_agent:             记录客户端浏览器的相关信息;

6.21.10 目录文件访问控制

主要用在禁止目录下指定文件被访问,当然也可以禁止所有文件被访问!一般什么情况下用?比如是有存储共享,这些文件本来都只是一些下载资源文件,那么这些资源文件就不允许被执行,如sh,py,pl,php等等。

1)配置限制访问的文件

修改nginx主配置文件nginx.conf,在server段添加以下内容:

location ~ /images/.*\.(php|php5|js|sh|pl)$ {

deny all;

}

 

2)测试

注意:测试前先清空一下Chrome浏览的缓存,避免影响测试结果。

在Windows端使用chrome浏览器访问:

成功禁止访问index.php文件。

再测试访问文本文件:

访问tt.txt文件没有问题。

3)多目录组合配置方法

location ~ ^/images/(attachment|avatar)/.*\.(php|php5|.sh|.py|.py)$ {

deny all;

}

4)使用条件规则配置禁止访问文件

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

if ( -f $request_filename ) {

root /usr/local/nginx/html;

break;

}

deny all;

}

 

测试:

第1步:创建测试文件

 echo "Linux is a good system." > /usr/local/nginx/html/Linux.txt

第2步:在客户端上浏览器访问:

6.21.11 来源访问控制

这个需要ngx_http_access_module模块支持,默认会安装。

1)简单案例

例:允许192.168.0.0/24网段主机访问站点下的doc目录,其它则不允许访问。

在server段中添加需要限制来源访问的location匹配:

vim /usr/local/nginx/conf/nginx.conf

添加location匹配:

location ~ /doc {

allow 192.168.0.0/24;

    deny all;

}

说明:allow和deny后面可以是IP地址或IP地址段。

重载nginx配置生效:

nginx -s reload

2)用条件规则实现

还可以返回友好提示的404页面:

if ( $remote_addr = 192.168.0.66 ) {

return 404;

}

6.21.x 测试中遇到的问题

1)访问目录下被禁止的文件类型时抛出下载对话框

原因:两个匹配的location(缓存目录和禁止访问指定类型文件)顺序写得不对。

缓存目录的location放在了禁止访问指定文件的location前面。

解决:调整两个location位置:

原理解析:

1. 原因是两个配置都使用了万能location匹配,优先级是一样的,nginx从上而下读取配置,优先级一样的先读到就先匹配。

2. 因为先匹配到了缓存目录的location,目录下的文件已经缓存到本地浏览器了,所以在去访问被禁止的文件时,浏览器就直接到缓存取文件,但浏览器没有nginx配置的deny all策略,因此不会禁止访问,但.php这类文件浏览器无法解析,就直接下载让用户自己处理。



文章还未完,请继续关注!!!!!!!^_^

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: