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运行用户
添加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,worker_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.12 测试中遇到的问题
1)访问目录下被禁止的文件类型时抛出下载对话框
原因:两个匹配的location(缓存目录和禁止访问指定类型文件)顺序写得不对。
缓存目录的location放在了禁止访问指定文件的location前面。
解决:调整两个location位置:
原理解析:
1. 原因是两个配置都使用了万能location匹配,优先级是一样的,nginx从上而下读取配置,优先级一样的先读到就先匹配。
2. 因为先匹配到了缓存目录的location,目录下的文件已经缓存到本地浏览器了,所以在去访问被禁止的文件时,浏览器就直接到缓存取文件,但浏览器没有nginx配置的deny all策略,因此不会禁止访问,但.php这类文件浏览器无法解析,就直接下载让用户自己处理。
由于篇幅感觉有点太长,所以把文章拆分成两篇:Nginx调优详解-1、Nginx调优详解-2
文章还未完,请继续关注!!!!!!!^_^