nginx调优

一、 隐藏nginx版本号
1、 修改nginx源代码
[root@xuegod120 ~]# tar xf nginx-1.14.1.tar.gz

修改nginx的软件版本号
[root@xuegod120 ~]# cd nginx-1.14.1/
[root@xuegod120 nginx-1.14.1]# vim src/core/nginx.h
改:
13 #define NGINX_VERSION “1.14.1”
14 #define NGINX_VER “nginx/” NGINX_VERSION
为:
#define NGINX_VERSION “8.8.2” #此行修改的是你想要的版本号。
#define NGINX_VER “XWS/” NGINX_VERSION #此行修改的是你想修改的软件名称。

修改HTTP头信息中的connection字段,防止回显具体版本号
[root@xuegod120 nginx-1.14.1]# vim src/http/ngx_http_header_filter_module.c
改:49 static char ngx_http_server_string[] = “Server: nginx” CRLF;
为:49 static char ngx_http_server_string[] = “Server: XWS” CRLF;

修改ngx_http_special_response.c文件定义了nginx报404错误,不回显版本号
主:nginx1.14.1版本,不需要修改。nginx1.10以下版本还需要修改
[root@xuegod120 nginx-1.14.1]# vim src/http/ngx_http_special_response.c
改:36 “


nginx
” CRLF
为:36 “
XWS
” CRLF

2、 编译安装
安装nginx的依赖包
[root@xuegod120 ~]# yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel

创建nginx运行用户,不创建家目录和不允许登录系统
[root@xuegod120 ~]# useradd -M -s /sbin/nologin nginx

编译
[root@xuegod120 ~]# cd nginx-1.14.1/
[root@xuegod120 nginx-1.14.1]# ./configure --prefix=/usr/local/nginx --user=nginx–group=nginx --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-pcre

参数说明:
–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查看帮助。

安装
[root@xuegod120 ~]# make && make install

3、 启动nginx服务
创建nginx环境变量,直接使用nginx命令启动
[root@xuegod120 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

启动nginx服务
[root@xuegod120 ~]# nginx
[root@xuegod120 ~]# netstat -antup | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10138/nginx: master

4、 查看nginx版本号
[root@xuegod120 ~]# curl -I localhost
HTTP/1.1 200 OK
Server: XWS/8.8.8 #显示修改后的版本号
Date: Thu, 08 Aug 2019 12:16:11 GMT

5、 查看访问错误页面,回显版本号
404错误页面,返回版本号已经修改
在这里插入图片描述

二、 修改nginx运行用户-设置nginx的cpu亲和力
1、 修改nginx的运行用户
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
改:2 #user nobody;
为:2 user nginx;

动态加载配置文件
[root@xuegod120 ~]# nginx -s reload
[root@xuegod120 ~]# ps -ef | grep nginx
root 10138 1 0 20:15 ? 00:00:00 nginx: master process nginx
nginx 10181 10138 0 20:19 ? 00:00:00 nginx: worker process #使用nginx用户
注:第一个root用户的运行的是nginx的主进程,master process ngin的worker进程
第二个ngnix用户运行的是nginx的工作进程,所有给用户提供服务都是这个进程来完成

2、 设置nginx运行进程个数
nginx运行进程个数一般设置为CPU的核心数或者核心数的2倍
查看CPU的核心数
[root@xuegod120 ~]# top #运行top命令后,按下数字1,可以看到有4核心CPU。
可以看到这里的CPU是四核心的
在这里插入图片描述

设置nginx运行进程的cpu个数是4
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
改: 3 worker_processes 1;
为: 3 worker_processes 4;

重新加载nginx配置文件
[root@xuegod120 ~]# nginx -s reload

查看nginx的运行进程个数
[root@xuegod120 ~]# ps -ef | grep nginx #可以看到有四个nginx进程
在这里插入图片描述

查看nginx管理进程和4个worker进程的父子关系
[root@xuegod120 ~]# yum -y install psmisc #pstree的命令在psmisc包里面
[root@xuegod120 ~]# pstree -p | grep nginx
在这里插入图片描述
默认给nginx配置几个cpu,nginx工作进程就运行在这几个cpu上,比如设置nginx的运行cpu为4个,那么nginx的工作进程就随机运行在这四个cpu上,如下:
在这里插入图片描述

3、设置nginx运行cpu的亲和力
[root@xuegod120 ~]#vim /usr/local/nginx/conf/nginx.conf
3 worker_processes 4; #在此行下添加
4 worker_cpu_affinity 0001 0010 0100 1000;

比如服务器是8核8线程的cpu,应该配置为如下:
3 worker_processes 8;
4 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
以此类推。

重载nginx配置文件
[root@xuegod120 ~]# nginx -s reload

查看CPU的亲和力
[root@xuegod120 ~]# pstree -p | grep nginx
|-nginx(1340)-±nginx(1375)
| |-nginx(1376)
| |-nginx(1377)
| `-nginx(1378)

查看nginx运行在那个cpu上
在这里插入图片描述

三、 设置nginx每个进程最多可以打开的文件数和事件处理模型
1、 设置nginx最多打开文件数
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
4 worker_cpu_affinity 0001 0010 0100 1000; #在这一行下面,插入以下内容
5 worker_rlimit_nofile 102400;
注:这个参数表示,一个nginx进程最多可以打开的文件数,注意:这里的数值大小设置,理论上应该是(ulimint -n)查看的数值/nginx的进程数。即(ulimit -n)/worker_process。但是需要注意nginx的分配请求不是很均匀,所以这里的数值最好设置的和ulimit -n的数值相同

2、 设置nginx事件处理模型
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
14 events {
15 use epoll; #添加这一行,使用epoll模式
16 worker_connections 102400;
17 }

3、 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@xuegod120 nginx]# cat /proc/sys/fs/file-max
198588
2) 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3) Epoll在这点上使用了“共享内存”,更省内存,效率更高。

4、 单个进程允许客户单最大并发数设置
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
改:16 worker_connections 1024; #改第16行
为:16 worker_connections 102400;

worker_connections:这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统ulimit -n设定的值和nginx的worker_connections的值。一般情况下系统ulimit -n、worker_rlimit_nofile 、worker_connections三者的值是一样的。
nginx服务器实际最大并发值就是:worker_processes*worker_connections 的乘积。

总结:nginx服务器最大的并发值= worker_processesworker_connections(nginx的进程数量单个进程最大并发数)

重载nginx配置
[root@xuegod120 ~]# nginx -s reload

查看每个进程使用nginx的内存大小
[root@xuegod120 ~]# top -u nginx
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1398 nginx 20 0 88436 43900 580 S 0.0 2.2 0:01.49 nginx
1399 nginx 20 0 88436 43900 580 S 0.0 2.2 0:01.68 nginx
1400 nginx 20 0 88436 43900 580 S 0.0 2.2 0:01.75 nginx
1401 nginx 20 0 88436 43900 580 S 0.0 2.2 0:01.74 nginx
通过查看,启动的nginx的单个进程最大占用内存43M,这里使用的内存大小和设置的并发数有关联,并发数设置的越大,占用的内存也就越大,客户端在访问请求的速度越快,因为有预派生进程,提前占用内存。

四、 ServerName和location匹配及高效传输模式
1、 ServerName匹配
对应需要修改的配置文件的位置是40行和46行
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf

1)ServerName匹配方式
(1)、精确匹配:www.aa.com
(2)、左侧通配符匹配:.aa.com
(3)、右侧通配符匹配:www.

(4)、正则表达式:~ ^.*.aa.com$
(5)、default_server
(5)、服务IP地址

2、 修改server_name 值为xuegod120.cn
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
改:40 server_name localhost;
为:40 server_name xuegod120.cn;
注:nginx配置文件中,每个参数都是以分号;结束的

[root@xuegod120 ~]# nginx -t #检测nginx配置文件是否正确。
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

[root@xuegod120 ~]# nginx -s reload #重新加载配置文件。

3、 location匹配
1)location匹配方式,如下:
= 或 / 绝对匹配。
^~ URL前半部分匹配,不检查正则。
~ 正则匹配,区分大小写。
~* 正则匹配,不区分大小写。
\ 转义。

  •    配置任意个任意字符。
    

$ 以什么结尾。

例:匹配出以.php结尾的文件且配置时区分大小写。
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
68 #location ~ .php$ { #~ .php$ 表示url中以.php结尾的文件且区分大小写,都按{。。。}中的方法进行处理 。 这个就可以完成我们的需求。
69 # root html;
70 # fastcgi_pass 127.0.0.1:9000;
71 # fastcgi_index index.php;
72 # fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
73 # include fastcgi_params;
74 #}

说明:安装php之后,nginx的配置文件会自动取消这些注释行,修改72行的路径为绝对路径。配置效果表示,/usr/local/nginx/html下的所有以.php结尾的文件都会按照{}内的参数来执行操作。

4、 开启高效传输模式
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
Include mime.types; #媒体类型。
default_type application/octet-stream; 默认媒体类型 足够。
30 sendfile on; 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
31 tcp_nopush on; 必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量。

5、 设置连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事儿,也就是我建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉!
同时我们也希望php建议短链接,消耗资源少。
34 keepalive_timeout 65; #在此行下加入如下
tcp_nodelay on;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 15;

keepalived_timeout 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
tcp_nodelay;也是防止网络阻塞,不过要包涵在keepalived参数才有效。
client_header_timeout 客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误。
client_body_timeout 客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示。
send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接。

文件上传大小限制
我们知道PHP可以修改上传文件大小限制,nginx也可以修改。
http {
……
40 client_max_body_size 10m;

五、 fastcgi调优-gzip压缩网页调优-expires缓存调优
1、 fastcgi相关概念如下:
cache:写入缓冲区
buffer:读取缓冲区
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 gnix; #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择。
fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用。
fastcgi_cache_valid 301 1d; #将301应答缓存一天。
fastcgi_cache_valid any 1m; #将其他应答缓存为1分钟。
fastcgi_cache_min_uses 1; #请求的数量。
fastcgi_cache_path #定义缓存的路径。

2、 修改nginx的fastcgi配置
[root@xuegod120 nginx]# vim /usr/local/nginx/conf/nginx.conf
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; #这里写的路径,nginx用户必须有访问权限,下面一样。
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 #缓存路径,levels目录层次级。
keys_zone=ngx_fcgi_cache:512m #定义了一个存储区域名字,缓存大小。
inactive=1d max_size=40g; #不活动的数据在缓存中多长时间,目录总大小。

在server location标签添加如下:
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
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:// h o s t host hostrequest_uri;
}
fastcgi cache资料:
官方文档:
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

3、 gzip压缩网页调优
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

相关参数说明:
gzip on; #开启压缩功能。
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压缩的数据。

gzip压缩类型汇总文件:
[root@xuegod ~]# ll /usr/local/nginx/conf/mime.types
-rw-r–r-- 1 root root 5170 Jun 25 21:08 /usr/local/nginx/conf/mime.types
在这里插入图片描述

配合压缩相关参数
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
改:41 #gzip on;
为:41 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; #可以让前端的缓存服务器缓存压缩后的文件
[root@xuegod ~]# nginx -t
[root@xuegod ~]# nginx -s reload

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

Expires缓存配置在server字段里面:
location ~ ..(gif|jpg|jpeg|png|bmp|swf)$
{
expires 365d;
}
location ~ .
.(js|css)?$
{
expires 30d;
}
同时也可以对目录及其进行判断:
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
location ~(robots.txt) {
expires 7d;
break;
}
expire功能优点:
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能

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

解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天。
第二个 对缓存的对象改名。
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已。
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
网站不希望被缓存的内容:
1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)

六、 日志切割优化-目录文件访问控制-来源访问控制
1、 日志切割优化
日志优化的目的,是为了将一天日志进行压缩,按天存放,超过10天就删除,我们可以通过脚本来实现
[root@xuegod ~]# cd /usr/local/nginx/logs/
[root@xuegod logs]# vim cut_nginx_log.sh
#!/bin/bash
date=KaTeX parse error: Expected group after '_' at position 114: ….log cut/access_̲(date +%F -d -1day).log
mv error.log cut/error_ ( d a t e + / u s r / l o c a l / n g i n x / s b i n / n g i n x − s r e l o a d t a r − j c v f c u t / (date +%F -d -1day).log /usr/local/nginx/sbin/nginx -s reload tar -jcvf cut/ (date+/usr/local/nginx/sbin/nginxsreloadtarjcvfcut/date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
cat >>/var/spool/cron/root<<eof
00 00 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1
eof
find -type f -mtime +10 | xargs rm -rf
健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,我们可以屏蔽这些如图片,js,css这些不宜变化的内容。
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}

日志目录权限优化:
[root@xuegod120 logs]# chown -R root.root /usr/local/nginx/logs/
[root@xuegod120 logs]# chmod -R 777 /usr/local/nginx/logs/

日志格式优化
log_format access ‘$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “ r e q u e s t ” ‘ ‘ request” ‘‘ requeststatus b o d y b y t e s s e n t “ body_bytes_sent “ bodybytessenthttp_referer” ‘‘”$http_user_agent” $http_x_forwarded_for’;
其中,各个字段的含义如下:
1. r e m o t e a d d r 与 remote_addr 与 remoteaddrhttp_x_forwarded_for 用以记录客户端的ip地址;
2. $remote_user :用来记录客户端用户名称;
3. $time_local : 用来记录访问时间与时区;
4. request : 用来记录请求的url与http协议;
5. status : 用来记录请求状态,功是200;
6. body_bytes_s ent :记录发送给客户端文件主体内容大小;
7. http_referer :用来记录从哪个页面链接访问过来的;
8. http_user_agent :记录客户端浏览器的相关信息;

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

例1:禁止访问images下面的php程序文件
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf #在location / {下添加
location ~ ^/images/.*.(php|php5|.sh|.py|.pl)$ {
deny all;
}
[root@xuegod120 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@xuegod120 ~]# mkdir /usr/local/nginx/html/images
[root@xuegod120 ~]# echo “<?php phpinfo(); ?>” > /usr/local/nginx/html/images/index.php
[root@xuegod120 ~]# echo xuegod120 > /usr/local/nginx/html/images/index.html
测试访问
images的目录的php文件可以访问
在这里插入图片描述
images目录下的php文件不能访问
在这里插入图片描述
images目录下的除php文件外的文件都能访问
在这里插入图片描述

多目录组合配置方法
location ~ ^/images/(attachment|avatar)/.*.(php|php5|.sh|.py|.py)$ {
deny all;
}

例2:配置nginx禁止访问*.txt文件
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf #server字段中
location ~* .(txt|doc)$ {
if ( -f $request_filename) {
root /usr/local/nginx/html;
break;
}
deny all;
}

访问测试
[root@xuegod120 ~]# echo txt > /usr/local/nginx/html/aa.txt
[root@xuegod120 ~]# echo txt > /usr/local/nginx/html/aa.doc
在这里插入图片描述
在这里插入图片描述

例3:禁止访问后重定向到另外一个URL
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~* .(txt|doc)$ {
if ( -f KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^/(.*) http://www.baidu.com last;
break;
}
}

访问测试
访问http://192.168.0.120/aa.txt后直接跳转到www.baidu.com
在这里插入图片描述

例3:对目录进行限制
[root@xuegod120 ~]# mkdir -p /usr/local/nginx/html/{xuegod,godxue}
[root@xuegod120 ~]# echo xuegod > /usr/local/nginx/html/xuegod/index.html
[root@xuegod120 ~]# echo god > /usr/local/nginx/html/godxue/index.html
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
location /xuegod/ { return 404 ; }
location /godxue/ { return 403 ; }
[root@xuegod120 ~]# /usr/local/nginx/sbin/nginx -s reload

访问测试
在这里插入图片描述
在这里插入图片描述

上面直接给出的返回状态码,同样可以通过匹配deny all方式来实现

3、 来源访问控制
这个需要ngx_http_access_module模块支持,不过,默认会安装。
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf #写法类似Apache。
location ~ ^/(xuegod)/ {
allow 192.168.0.0/24;
deny all;
}

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

访问测试
http://192.168.0.120/xuegod/index.html
在这里插入图片描述
接着上面的实验,就可以访问了,下面是针对整个网站的写法,对/限制就OK。
location / {
allow 192.168.0.0/24;
deny all;
}
当然可以写IP,可以写IP段,但是注意次序,上下匹配。
同时,也可以通过if语句控制,给以友好的错误提示。
if ( $remote_addr = 192.168.0.38 ) {
return 404;
}

例:
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/(xuegod)/ {
if ( $remote_addr = 192.168.0.103 ) {
return 404;
}
}
[root@xuegod120 ~]# /usr/local/nginx/sbin/nginx -s reload

访问测试
在这里插入图片描述

七、 禁止使用IP访问网站和301优化-防盗链-错误页面的提示-开启认证功能
1、 禁止使用IP访问网站和301优化
有时候,我们发现访问网站的时候,使用IP也是可以得,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转。
跳转的做法:
server {
listen 80 default_server;
server_name _;
rewrite ^ http://www.baidu.comKaTeX parse error: Expected 'EOF', got '}' at position 15: request_uri?; }̲ 403反馈的做法 serve…host = ‘a.com’ ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}

2、 防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
1)水印,品牌宣传,你的带宽,服务器足够
2)防火墙,直接控制,前提是你知道IP来源
3)防盗链策略
下面的方法是直接给予404的错误提示:
location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.a.com a.com;
if (KaTeX parse error: Expected 'EOF', got '}' at position 74: … } }̲ 同时,我们也可以设置一个独有… {
valid_referers none blocked *.a.com a.com;
if ($invalid_referer) {
rewrite ^/ http://www.a.com/img/nolink.png;
}
}

3、 错误页面的提示
对于自定义的错误页面,我们只需要将errorpage写入到配置文件。
error_page 404 /404.html;

4、 开启认证功能
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ /xuegod/ {
auth_basic “haha”;
auth_basic_user_file /usr/local/nginx/conf/passwd;
}

用户创建:
[root@xuegod120 ~]# rpm -ivh /mnt/Packages/httpd-tools-2.4.6-67.el7.centos.x86_64.rpm
[root@xuegod120 ~]# htpasswd -cmb /usr/local/nginx/conf/passwd aaa 123
[root@xuegod120 ~]# chmod 400 /usr/local/nginx/conf/passwd
[root@xuegod120 ~]# chown nginx /usr/local/nginx/conf/passwd
[root@xuegod120 ~]# /usr/local/nginx/sbin/nginx -s reload

访问测试
在这里插入图片描述

5、 防止DDos攻击
通过使用limit_conn_zone进行控制单个IP或者域名的访问次数。
[root@xuegod120 ~]# vim /usr/local/nginx/conf/nginx.conf
http字段中配置:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server的location字段配置
location / {
root html;
limit_conn addr 1;
[root@xuegod130 ~]# ab -c 2 -t 1 http://192.168.1.63/xuegod/index.html
[root@xuegod120 ~]# tail -f /usr/local/nginx/logs/access.log
在这里插入图片描述

= 开头表示精确匹配。
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配。
~* 开头表示不区分大小写的正则匹配。
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则。
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考)。
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
set n o c a c h e 0 ; i f ( no_cache 0; if ( nocache0;if(request_method = POST) {
set KaTeX parse error: Expected 'EOF', got '}' at position 21: …che 1; }̲ if (query_string != “”) {
set $no_cache 1;
}

    if ($request_uri ~* "(/zb_system/)") {
            set $no_cache 1;
    }
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值