
— 特色专栏 —
MySQL / PostgreSQL / MongoDB
ElasticSearch / Hadoop / Redis
Kubernetes / Docker / DevOps
Nginx / Git / Tools / OpenStack
大家好,我是民工哥!
这套 30 分钟搞定生产级 Nginx 服务优化与防盗链配置方案,让面试官当场拍板给我 Offer!

废话不多说,直接上干货,开干!
Nginx 优化与防盗链是提高网站性能和安全性的重要措施。
隐藏Nginx版本号,避免安全漏洞泄漏:修改配置文件法;修改源码法
server_tokens off; ##添加,关闭版本号
nginx.h ##修改源码




#重新编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make -j 2 && make install




headers-more-nginx-module-0.34.tar.gz
插件包,解压到一个目录,
#编译安装
nginx,./configure --add-module='模块路径' && make -j 2 && make install
修改nginx.conf 文件,在http配置块加more_clear_ headers '响应头字段';可去除响应头任何字段
Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制,Nginx默认使用nobody用户账号与组账号。
修改的方法:编译安装时指定用户与组;修改配置文件指定用户与组。
user 用户名 组名;


当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度,一般针对静态网页设置,对动态网页不设置缓存时间。
设置方法:修改配置文件,在http段、或者server段、或者location段加入对特定内容的过期参数 expires 缓存时间;。

随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件,太大的日志文件对监控是一个大灾难,定期进行日志文件的切割。
Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割,通过Linux的计划任务周期性地进行日志切割。shell脚本 + crontab。


在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime
ctime(status time):
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。
atime(accesstime):
当使用这个文件的时候就会更新这个时间。
mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别。
为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。
超时参数:
Keepalive_timeout 服务端超时时间 客户端超时时间; ##设置连接保持超时时间
Client_header_timeout ##指定等待客户端发送请求头的超时时间
Client_body_timeout ##设置请求体读超时时间


keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定一个长连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。
client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。
修改配置文件的worker_processes参数:一般设为CPU的个数或者核数;在高并发情况下可设置为CPU个数或者核数的2倍。
增加进程数,可减少了系统的开销,提升了服务速。
默认情况,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU。

cat /proc/cpuinfo | grep -c "physical id" #查看cpu核数
ps aux | grep nginx #查看nginx主进程中包含几个子进程
worker_processes 与服务器CPU数量相同或auto #修改为cpu的总核数,一般情况不超过8个
worker_cpu_affinity ##工作进程静态绑核
#将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装。
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。
gzip on; #开启gzip压缩功能



#实现网页图片的大小压缩
http_image_filter_module是Nginx提供的集成图片处理模块,可以用于实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息。
yum install -y gd-devel #yum在线源安装gd-devel,http_image_filter_module模块需要依赖gd-devel的支持,重新编译安装启动。
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_module
make -j 2 && make install
image_filter resize 200 200; #按等比例缩小图像的宽或高至指定大小。如果只想设置一个维度,另一维可以指定为:“-”
#注:Nginx的Gzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能。
1)图片/视频类型资源 原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。
2)大文件资源 原因:会消耗大量的cpu资源,且不一定有明显的效果。

增加文件描述符限制:增加系统允许的最大文件描述符数。
调整内核参数:修改内核参数以提高网络性能,如增加系统文件描述符的限制、TCP连接队列的大小,以及优化TCP的可用端口范围等。
使用异步I/O:在支持的系统上启用异步I/O,以提高文件读写性能。
使用SSD:使用固态硬盘(SSD)代替传统的机械硬盘(HDD),以提高I/O性能。
增加内存:增加服务器内存,以减少交换空间的使用,并提高缓存命中率。
负载均衡:使用负载均衡器将流量分配到多个Nginx实例,以提高整体处理能力。
启用Nginx状态模块,监控Nginx的运行状态,以及时发现和解决性能瓶颈。
使用日志分析工具,如GoAccess或AWStats,分析访问日志,找出性能瓶颈和优化点。
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失 Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
防盗链可以防止其他网站直接链接到你的资源(如图片、视频等),从而节省带宽和提高网站的安全性。Nginx防盗链主要通过ngx_http_referer_module模块实现。
Referer头的功能和用途
HTTP Referer 是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器请求是从哪个页面链接过来的。服务器可以借此获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。
防盗链配置
在Nginx配置文件中,使用valid_referers指令定义合法的Referer。
使用if指令检查$invalid_referer变量,如果请求的Referer无效,则返回指定的错误码(如403或502)。
rewrite if ( $invalid_referer) {rewrite... }

~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.kgc.com/game.jpg
我们使用 http://www.kgc.com 访问显示的图片,可以理解成 http://www.kgc.com/game.jpg 这个请求是从 http://www.kgc.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源;
*.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。
盗链网站主机(20.0.0.160)




Web源主机(20.0.0.150)




nginx常用模块
http_stub_status_module #访问状态统计模块
http_gzip_module #网页压缩模块
http_rewrite_module #URL地址重写模块
http_ssl_module #https安全加密模块
http_auth_basic_module #网页用户认证模块
http_fastcgi_module #fastcgi转发模块
http_image_filter_module #图片处理模块
http_mp4/flv_module #mp4/flv视频格式模块
http_limit_req_module #限制请求数模块
http_limit_conn_module #限制连接数模块
http_proxy_module #代理转发模块
http_upstream_*_module #负载均衡模块
stream #四层代理转发模块
部分内容来源:cnblogs.com/zsy828/p/18223841
👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!