LNMP调优for Nginx

1
2
3
4
5
6
7
8
实验环境: Centos6.5 minimal 64位系统
服务器IP:192.168.10.22
说明:
1. 生产环境中,部署了nginx之后,在上线之前,从安全和性能方面做诸多的优化调试才行
2. 源码包去官网下载,不要去其他没听说过的站点下载,防止源码包被别有用心的人动过手脚,导致对公司业务造成不必要的损失
3. 关注官网的补丁发布情况,一旦有新的补丁,尽早打上,尤其安全补丁
4. LNMP环境已经安装完成,可参考之前文章,这里不再演示
5. 所有的服务安装路径都在/a01/apps/xxxxxxx

LNMP包版本:

1
2
3
Nginx: 	nginx-1.12.0.tar.gz
PHP: libmcrypt-2.5.7.tar.gz、php-7.1.7.tar.gz
MySQL: mysql-5.7.19.tar.gz或者mysql-boost-5.7.19.tar.gz

一、隐藏或修改nginx软件名、版本等敏感信息

一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务对访问的用户显示各类敏感信息,比如WEB软件名称及版本号等信息,这样恶意的用户就比较难猜到他所攻击的服务器所用的是否是特定漏洞的软件,或者是否有对应版本的漏洞存在。

在开始之前,我们先来看看nginx的敏感信息

1
curl -I 192.168.10.22

Pjf45n.png

再看看错误返回信息(随意输入一个不存在的路径即可)

Pjfo80.png

1、隐藏版本信息(重启生效)

1
2
vim /etc/nginx/nginx.conf
在http段加入server_tokens off;

PjfT2V.png

2、修改源码更改nginx软件名及版本号

接下来可以通过对源码的修改,隐藏或更改为其他Web服务软件名,迷惑Hacker,增强Web服务安全性。nginx模块不支持更改软件名,所以需要更改源代码,就得重新编译nginx。

1)vim /a01/apps/apps_src/nginx-1.12.0/src/core/nginx.h
1
2
#define NGINX_VERSION      "888.888.888"					#修改成想要的版本号
#define NGINX_VER "Mr.nong/" NGINX_VERSION #修改成想要的软件名称

Pjf7vT.png

2)vim /a01/apps/apps_src/nginx-1.12.0/src/http/ngx_http_header_filter_module.c
1
static u_char ngx_http_server_string[] = "Server: Mr.nong" CRLF;		#此处是curl –I显示名称

PjfbKU.png

3)vim /a01/apps/apps_src/nginx-1.12.0/src/http/ngx_http_special_response.c
1
"<hr><center>Mr.nong(www.nongziyi.xin)</center>" CRLF			#错误页面回显信息

PjfqrF.png

4)接下来就是重新编译nginx了

获取原来编译参数:

1
nginx -V

停掉nginx并进入源码目录重新编译

1
2
3
4
5
6
7
service nginx stop
cd /a01/apps/apps_src/nginx-1.12.0
make clean

./configure --prefix=/a01/apps/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/a01/apps/nginx/run/nginx.pid --user=www --group=www --http-log-path=/a01/apps/nginx/log/access.log --error-log-path=/a01/apps/nginx/log/error.log --with-http_ssl_module --with-http_dav_module --with-http_stub_status_module --with-http_mp4_module

make -j 4 && make install && echo $?
5)重新启动nginx,并查看是否优化成功
1
2
3
service nginx start

curl -I 192.168.10.22

PjfLb4.png

PjfXVJ.png

二、更改nginx服务默认用户

为nginx创建新用户www

1
useradd -M -s /sbin/nologin www
更改用户方法一:

直接在编译nginx的时候指定用户和组,其实在上边已经这么做了,可以来看看

PjhMM8.png

如上图,其中worker进程是www用户了,master是监控进程,也叫主进程。可以直接理解为master是管理员,worker进程才是为用户提供服务的。

更改用户方法二:
1
vim /etc/nginx/nginx.conf

Pjhlqg.png

(取消注释并修改为www即可,由于我已经在编译的时候指定了nginx用户和组为www,这里不再更改)

三、优化nginx运行进程(worker)个数

在高并发、访问量的Web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求.

优化Nginx进程对应nginx服务的配置参数如下:

1
worker_processes  4;

上述参数调整的是nginx服务的worker进程数,系统的cpu线程线程为几就设置几即可,我们来看看我的这条服务器cpu线程是不是4

1
lscpu

Pjh8aj.png

如上图,总共4核,1核支持1线程,总线程是4,有些CPU支持超线程的话,就需要看看1核支持多少线程,然后再相乘即可,嗯哼,学到了没?

四、优化nginx运行cpu亲和力(绑定不同的nginx进程到不同的CPU上)

默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。

1
2
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

worker_cpu_affinity就是配置nginx运行cpu亲和力的参数,就是把不同的进程分配给不同的cpu处理。这里0001 0010等是掩码,分别代表1、2、3、4cpu,这个要根据你的cpu线程数来配置,比如:

2核2线程:

1
2
worker_processes  2;
worker_cpu_affinity 01 10;

4核4线程:

1
2
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

8核8线程:

1
2
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

那么,如果我是4线程的cpu,但是我只想跑2个进程呢?

1
2
worker_processes  2;
worker_cpu_affinity 0101 1010;

以上的意思是,我开启了第一和第三个内核,第二个和第四个内核,两个进程分别在这两个组上轮询。

注意:worker_processes最多开启8个,8个以上性能提升就不会再提升了,而且稳定性变得更低,所以8个进程就够用了。

五、优化nginx进程最多可以打开文件数

1
worker_rlimit_nofile 65535;

Pjh0LF.png

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除的值,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n(优化后)的值保持一致。

六、优化nginx事件处理模型

Nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows使用的是icop,等等。

PjhcJ1.png

events指令是设定nginx的工作模式及连接数上限。use是个事件模块指定,用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效工作模式,不同的是epoll用在Linux平台,而kqueue用在BSD系统中。对于Linux 2.6内核推荐使用epoll工作模式

七、优化nginx单个进程允许的客户端最大连接数

worker_connections是单个进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,并发值就是worker进程数worker_processes乘以worker_connections的值。

Pjh2z6.png

那么如何设置呢,可以根据设置一个进程启动所占内存,top –u www

八、优化nginx开启高效文件传输模式

PjhWQK.png

设置参数:sendfile on;

开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘I/O重负载的,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

注意:如果图片显示不正常,把这个改成off

设置参数:tcp_nopush on;

此选项仅仅开启sendfile时才生效,激活这个tcp_nopush参数可以运行吧http response header和文件的开始放在一个文件里发布,减少网络报文段的数量,防止网络阻塞。

设置参数:tcp_nodelay on;

提高I/O性能,默认情况下数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能,但是,在每次只发送很少字节的业务场景,使用tcp_nodelay功能,等待时间会比较长。

九、优化nginx连接超时时间

PjhhLD.png

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


同时我们也希望:

1
2
php建议短链接,消耗资源少
Java建议长链接,消耗资源少

1
2
3
4
5
6
7
keepalive_timeout  60;			#客户端连接保持会话超时时间,超过这个时间,服务器断开这链接

client_header_timeout 15; #客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,nginx服务端将数据返回“Request time out (408)”错误。

client_body_timeout 15; #客户端请求主体数据的超时时间,如果超过这个时间,客户端还没有发送任何数据,nginx服务端将数据返回“Request time out (408)”错误。

send_timeout 15; #响应客户端的超时时间。这个超时时间仅限于两个链接活动之间的事件,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接

十、优化nginx文件大小上传限制

1
2
3
http{
… …
client_max_body_size 8m;

具体大小根据公司的业务调整,如果不清楚,设置为8m差不多了。

十一、优化nginx的fastcgi缓存相关参数

Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此Nginx+spawn-fcgi的组合也可以实现对PHP的解析,但是spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题,这里不过多讲述。

PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀。同时PHP-FPM在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐使用Nginx+PHP/PHP-FPM这个组合对PHP进行解析。

FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。

在这里,首先我们nginx收到一个动态页面的php请求,nginx通过转发给fastcgi(也就是php-fpm,中间通过9000端口)来处理,fastcgi处理完成之后,再给nginx,nginx再展示给客户端,那么,这里所配置的fastcgi的优化作用是什么呢?就是nginx把fastcgi的处理结果给缓存起来,下次客户端再有同样的请求的时候,就不需要再通过fastcgi来处理了,nginx直接把缓存起来的结果展示给客户端即可,省时又省力,又省资源消耗。

1、在http{}配置启用fastcgi缓存
1
2
3
4
5
6
7
8
9
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 /a01/fastcgi/ngx_fcgi_tmp;
fastcgi_cache_path /a01/fastcgi/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;

Pjh5ee.png

2、在server{}下配置一个location来引用fastcgi
1
2
3
4
5
6
7
8
9
10
11
12
location ~ \.php$ {
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://$host$request_uri;
}

注意:启用之后重启nginx就可以在/a01/fastcgi/下看到配置的fastcgi缓存的文件目录了,需要访问一下网页才能生成。

PjhIdH.png

参数注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1)fastcgi_connect_timeout 300;
#指定nginx连接到后端的fastcgi的超时时间

2)fastcgi_send_timeout 300;
#nginx允许fastcgi服务返回数据的超时时间,即在规定时间内fastcgi必须传完所有数据,否则nginx断开连接

3)fastcgi_read_timeout 300;
#nginx从fastcgi服务端读取响应信息的超时时间

4)fastcgi_buffer_size 64k;
#nginx fastcgi的缓冲区大小参数,设定用来读取fastcgi服务端收到的第一部分响应信息的缓冲区大小

5)fastcgi_buffers 4 64k;
#指定本地需要用多少盒多大的缓冲区来缓冲fastcgi的应答请求,如果一个php脚本所产生的页面大小为256kb,那么会为其分配4个64kb的缓存区来缓存。

6)fastcgi_busy_buffers_size 128k;
#用于设置系统很忙时可以使用fastcgi_buffers大小,官方推荐的大小为fastcgi_buffers*2

7)fastcgi_temp_file_write_size 128k;
#fastcgi临时文件的大小

8)fastcgi_cache_path /a01/fastcgi/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
#fastcgi缓存目录,可以设置目录哈希层级:levels,比如2:2会生成256*256个子目录,keys_zone是这个缓存空间的名字,512m是用多少内存,inactive表示默认失效时间,max_size表示最多用多少硬盘空间,前提是硬盘空间足够,需要注意的是fastcgi_cache缓存是先卸载fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区

9)fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
#用来指定应答代码的缓存时间,实例中的值是将200和302的应答缓存一个小时,301的应答缓存1天,关于应答代码,请自行百度百科查询即可,200表示请求成功,404错误页面,302临时重定向状态,301永久重定向状态

10)fastcgi_cache_valid any 1m;
#其他应答代码缓存1分钟

11)fastcgi_cache_min_uses 1;
#请求1次之后响应将被缓存

12)fastcgi_cache_use_stale error timeout invalid_header http_500;
#定义哪些情况下用过期缓存

注意:以上实例都是需要缓存的内容,那如果我不想缓存的内容呢,因为有些页面实时更新,如果缓存了,用户有时候访问到的不是最新的页面,这个不在这里说明,可以自行百度百科一下,或者去fastcgi官网看看官方文档即可。

1
FastCGI官网:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

十二、优化nginx的gzip压缩

1、Nginx gzip压缩功能介绍

Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送出用客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快了数据传输效率,提升了用户访问体验。

2、Nginx gzip 压缩的优点
1
2
1) 提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验提升了,网站口碑就好了。
2) 节约网站带宽成本,由于数据是压缩传输的,因此,此举节省了网站的带宽流量成本,不过压缩会稍微消耗一些CPU资源,这个一般可以忽略。此功能既能让用户体验增强,公司也少花钱。对于几乎所有的Web服务来说,这是一个非常重要的功能,Apache服务也有此功能。
3、压缩对象
1
2
3
4
5
1)纯文本内容压缩比很高,因此纯文本内容是最好压缩,例如:html、js、css、xml、shtml等格式的文件
2)被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩可能反而变大。
3)图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多数都是经历压缩的,如果再压缩很坑不会减小或减少很少,或者可能增加。而在压缩时还会消耗大量的CPU、内存资源
4)参数介绍及配置说明
此压缩功能很类似早起的Apache服务的mod_defalate压缩功能,Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装。
1
2
3
4
5
6
7
8
9
http{
… …
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/css text/xml application/javascript;
gzip_vary on;

参数注释:

1
2
3
4
5
6
7
1)gzip on;										#开启压缩功能
2)gzip_min_length 1k; 设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小于1K可能会越压越大
3)gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
4)gzip_http_version 1.1; #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,目前大部分浏览器已经支持GZIP解压,使用默认即可
5)gzip_comp_level 2; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源
6)gzip_types text/css text/xml application/javascript; #用来指定压缩的类型
7)gzip_vary on; #vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据

十三、优化nginx的expires缓存

expires作用:

在网站的开发和运营中,对于图片、视频、css、js等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户端浏览器本地缓存365天或3650天,而css、js、html等代码缓存10~30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存响应的内容,下次用户再打开类似页面,重复的元素就无需下载了,从而加快了用户访问速度,由于用户的访问请求和数据减少了,因此节省了服务器端大量的带宽。此功能和apache的expire相似。

expires优点:

1
2
3
1.Expires可以降低网站的带宽,节约成本。
2.加快用户访问网站的速度,提升了用户访问体验。
3.服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以解决人力成本。

expires缺点:

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验,解决办法有两个,1是缩短缓存时间,2是对缓存的对象改名

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

1
2
3
1)	广告图片
2) 网站流量统计工具
3) 更新频繁的文件(例如google的logo)

配置:(缓存的时候,我们要将需要缓存的扩展名列出来,该配置可以放在server标签,也可以放在http标签)

1、根据扩展名判断,添加expires缓存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    location ~* ^.+\.(js|css|ico)$ {
access_log off;
root /data/www/wordpress;
expires 365d;
break;
}


location ~* ^.+\.(jpg|jpeg|gif|png|bmp)$ {
access_log off;
root /data/www/wordpress;
expires 3650d;
break;
}
2、根据目录(URL中的路径目录)判断,添加expires缓存:
1
2
3
4
5
6
7
8
9
10
11
12
location ~* ^.+\.(images|javascript|js|css|flash|media|static)$ {
access_log off;
root /data/www/wordpress;
expires 3650d;
break;
}

location ~(robots.txt) {
root /data/www/wordpress;
expires 1d;
break;
}

十四、优化nginx的日志切割

Nginx目前没有类似Apache的通过cronlog或者rotatelog对日志分割处理的能力,但是,可以通过利用脚本开发、Nginx的信号控制功能或reload重新加载,来实现日志自动切割,轮询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim nginx_cutlog.sh

#!/bin/bash
date=$(date +%F -d -1day)
cd /a01/apps/nginx/log/
mv access.log access_$(date +%F -d -1day).log
mv error.log error_$(date +%F -d -1day).log
tar -zcvf ./$date.tar.gz *.log
if [ ! -d cut ] ; then
mkdir cut
fi
mv *.tar.gz cut/
rm -rf *.log
/a01/apps/nginx/sbin/nginx -s reload
find ./cut/ -mtime +30 -name "*.tar.gz" -exec rm -rf {} \;

这个日志很简单,就是把原来日志改名成带日期的日志,然后打包,打包完之后创建一个专用目录存放打包的日志文件,然后把原来的日志删除,重新加载nginx生成新的日志,自动删除30天之前的日志文件。

接下来就是每天晚上0:00自动执行该脚本就行了:

1
2
3
crontab -e

00 00 * * * /bin/sh /root/nginx_cutlog.sh >/dev/null 2>&1

十五、优化nginx日志记录

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

1
2
3
4
5
6
7
8
9
vim /etc/nginx/nginx.conf

server{
… …
location ~* ^.+\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|ico)$ {
root /data/www/wordpress;
access_log off;
break;
}

十六、优化nginx日志格式化

1
2
3
4
5
vim /etc/nginx/nginx.conf

http{
… …
log_format access '$remote_addr - $remote_user [$time_local] "$request" "$status $body_bytes_sent" "$http_referer" "$http_user_agent" $http_x_forwarded';

Pjh7FA.png

各字段含义:

1
2
3
4
5
6
7
8
1)$remote_addr$http_x_forwarded用于记录客户端的IP地址
2)$remote_user:记录客户端用户名称
3)$time_local:记录访问时间和时区
4)$request:记录请求的url与http协议
5)$status:记录请求状态
6)$body_bytes_sent:记录发送给客户端文件主题内容大小
7)$http_referer:记录从哪个页面链接访问过来的
8)http_user_agent:记录客户端浏览器的相关信息

重载nginx,动态查看日志,测试一下:

PjhbWt.png

从以上日志记录可以看出,分别访问两个页面,第一个是网站/目录,第二个是/test.php,客户端IP地址都是192.168.10.62,客户端用户名称没有,访问时间30/Nov/2017:10:23:58和30/Nov/2017:10:32:06,时区都是+0800,http协议为1.1,状态码分别位204和200,页面大小一个为0,一个为23533,没有记录哪个页面链接访问过来的,最后是客户端浏览器的相关信息

十七、优化nginx站点目录、文件、来源IP访问控制

注意注意注意:重要的事说三遍,以下代码注意事项:

1
1、以下的代码需要写在location ~ \.php$ {的上面,记住,上面,否则所写的配置不生效

PjhXy8.png

1
2
2、目录写相对路径,不能写绝对路径
3、不要忘记重载或重启nginx

(一)站点目录、文件访问控制

Web2.0时代,绝大多数网站都是以用户为中心,例如:BBS、blog、sns产品,这几个产品共同特点就是不但允许用户发布内容到服务器,还允许用户发图片甚至附件到服务器,由于为用户打开了上传的功能,因为给服务器带来了很大的安全风险。

下面将利用Nginx配置禁止访问上传资源目录下的PHP、shell、perl、Python程序文件,这样用户即使上传了木马文件也没法去执行,从而加强了网站的安全。

配置Nginx,限制禁止解析images、static、data、attachment、avatar目录下的指定程序。
1
2
3
4
5
6
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ {
deny all;
}
location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$ {
deny all;
}
也可以多个目录写一起:
1
2
3
location ~ ^/(data|attachment|avatar)/.*\.(php|php5|.sh|.pl|.py)$ {
deny all;
}
配置Nginx,限制禁止解析*.txt文件
1
2
3
location ~*\.(txt|doc|docx|ini)$ {
deny all;
}
来测试一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
service nginx reload

mkdir -p /a01/apps/nginx/html/images
mkdir -p /a01/apps/nginx/html/static
mkdir -p /a01/apps/nginx/html/data
mkdir -p /a01/apps/nginx/html/attachmemt
mkdir -p /a01/apps/nginx/html/avatar

cp /a01/apps/nginx/html/test.php /a01/apps/nginx/html/images/
cp /a01/apps/nginx/html/test.php /a01/apps/nginx/html/static
cp /a01/apps/nginx/html/test.php /a01/apps/nginx/html/data
cp /a01/apps/nginx/html/test.php /a01/apps/nginx/html/attachment
cp /a01/apps/nginx/html/test.php /a01/apps/nginx/html/avatar
先访问网站根目录下的test.php(成功!!!)

PjhjOS.png

访问images目录下的test.php(失败!!!)

Pjhxeg.png

访问static目录下的test.php(失败!!!)

Pj49Fs.png

访问data目录下的test.php(失败!!!)

Pj4PWq.png

访问attachment目录下的test.php(失败!!!)

Pj4FS0.png

访问avatar目录下的test.php(失败!!!)

Pj4AyT.png

访问网站根目录下的a.txt文件

Pj4EOU.png

(二)限制网站来源IP访问

比如:phpmyadmin 数据库的Web客户端,仅限内部开发人员使用,其他人禁止使用禁止某目录让外界访问,但允许某IP或某IP段访问该目录,且支持PHP解析

注意注意注意:重要的事说三遍,以下代码要写在location ~ .php$ {的下面,记住,下面,否则所写的配置不生效

1
2
3
4
location ~ ^/nong/ {
allow 192.168.10.0/24;
deny all;
}

Pj4ew4.png

十八、优化nginx使用IP访问的反馈和301跳转

有时候,我们发现访问网站的时候,使用IP也是可以的,为了防止恶意域名解析,我们可以把这一层给屏蔽掉,让其直接反馈给403,或者也可以做跳转

(一)跳转的做法:

在nginx.conf文件末尾添加:

1
2
3
4
5
server {
listen 80 default_server;
server_name _;
rewrite ^ http://www.nong.com$request_uri?;
}

Pj4lSx.png

如果使用IP地址来访问,自动跳转到www.nong.com这个域名网址

测试一下:

已经修改完了配置文件,但是还未重启nginx,我们先看看没有配置之前使用IP地址是不是能正常访问到网页,如下图,我使用IP地址来访问网页,还是显示的IP地址

Pj436K.png

接下来我重载一下nginx,然后再使用IP地址来访问网页试试结果,如下图,使用IP访问的时候,自动跳转为域名了

Pj4Y0e.png

(二)直接反馈403的做法:

1
2
3
4
5
server {
listen 80 default_server;
server_name _;
return 403;
}

Pj4Ukd.png

然后我们重载nginx,直接使用IP地址访问看看结果,如下图,直接报403错误

Pj4atA.png

(三)301跳转的做法:

比如,我们域名一般在解析的过程中baidu.com一般会跳转到www.baidu.com

注意:要在第一个server上边修改

1
2
3
4
5
6
server {
listen 80;
server_name nong.com www.nong.com;
if ($host = 'nong.com') {
rewrite ^/(.*)$http://www.nong.com/$1 permanent;
}

Pj4dfI.png

重载nginx,然后使用nong.com访问网站看看结果,如下图,自动跳转到www.nong.com

Pj4rX8.png

十八、优化nginx防盗链

1.什么是资源盗链

简单的说,就是某些不法的网站未经许可,通过在其自身网站程序里非法调用其他网站的资源码,然后在自己的网站上显示。达到补充自身网站的效果,这一举动不但浪费了调用网站的流量,还造成服务器的压力,甚至宕机。

2.网站资源被盗链带来的问题

若网站图片及相关资源被盗链,最直接的影响就是网络带宽占用加大了,带宽费用多了,网站流量也可能忽高忽低,nagios/zabbix等报警服务频繁报警。最严重的情况就是网站的资源被非法使用,导致网站带宽成本加大和服务器压力加大,有可能会导致数万元的损失,且网站的正常用户访问也会受到影响。

(一)直接给予404的错误提示
1
2
3
4
5
6
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asd|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.nong.com nong.com;
if ($invalid_referer) {
return 404;
}
}
(二)也可以设置一个独有的,图片比较小的,来做rewrite跳转
1
2
3
4
5
6
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asd|mp3|mmf|zip|rar)$ {
valid_referers none blocked *.nong.com nong.com;
if ($invalid_referer) {
rewrite ^/ http://www.nong.com/img/nolink.png;
}
}

十九、优化nginx错误页面

在网站的运行过程中,可能由于页面不存在或者系统过载等原因,导致网站无法正常响应用户的请求,此时Web服务默认会返回系统默认的错误码,或者很不友好的页面。影响用户体验

(一)本地页面优雅显示错误

Pj42kj.png

(二)重定向到一个地址
1
2
error_page 500 501 502 503 504 http://www.nong.com;
error_page 400 403 404 405 408 410 411 412 413 414 415 http://www.nong.com;

Pj4Rts.png

阿里门户网站天猫的Nginx优雅显示配置方案为:

1
2
error_page 500 501 502 503 504 http://err.tmall.com/error2.html;
error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;
博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%