6.21 Nginx调优
javascript
6.21.1 隐藏Nginx版本号php
第1步:上传源码并解压css
cd /root/softwareshtml
tar -xf nginx-1.14.1.tar.gz -C /usr/local/src前端
第2步:修改跟版本信息有关源代码文件java
1. 修改nginx软件版本号node
[root@nginx src]# cd /usr/local/src/nginx-1.14.1linux
[root@nginx nginx-1.14.1]# vim src/core/nginx.hnginx
改:c++
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,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这类文件浏览器没法解析,就直接下载让用户本身处理。
因为篇幅感受有点太长,因此把文章拆分红两篇:Nginx调优详解-一、Nginx调优详解-2
文章还未完,请继续关注!!!!!!!^_^