博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
企业级Nginx Web服务优化
阅读量:2723 次
发布时间:2019-05-13

本文共 9976 字,大约阅读时间需要 33 分钟。

目录

Nginx的基本安全优化

Nginx服务性能优化
Nginx日志相关的优化
Nginx图片及目录防盗链解决方案
CDN介绍

Nginx的基本安全优化

一.调整参数隐藏Nginx软件版本信息或软件名

我们可以使用一些方法,来看到某个网站所使用的Web服务器软件和版本号,比如linux的curl命令。这可能会给不法分子提供攻击网站的机会,所有隐藏服务器的类型和版本号就显得非常重要了,下面我们介绍两种方式来实现隐藏

(1)调整参数隐藏Nginx软件版本号信息

配置文件中的server_tokens参数

######更改参数之前,使用curl查看本机搭建的服务器的信息[root@www yum.repos.d]# curl -I 192.168.10.10HTTP/1.1 200 OKServer: nginx/1.16.1      ###可以看到使用的软件是Nginx,版本为1.16.1Date: Sun, 17 Nov 2019 03:13:11 GMTContent-Type: text/htmlContent-Length: 14Last-Modified: Sun, 17 Nov 2019 03:12:02 GMTConnection: keep-aliveETag: "5dd0ba82-e"Accept-Ranges: bytes###相关参数涉及到的参数为server_tokens,该参数在配置文件中不存在,但是默认他的状态是on的,我们要手动给他改成off,就不会显示出版本信息了,server_tokens参数可以放在http模块中,可以放在Server模块中,也可以放在location模块中###这里我们把它放在http模块中http{
... server_tokens off; ###在原配置文件中添加这一句,其他配置这里就不给出了 ... }###设置之后,重启Nginx服务[root@www yum.repos.d]# kill -HUP 22814 #使用信号平滑重启###再次查看[root@www yum.repos.d]# curl -I 192.168.10.10HTTP/1.1 200 OKServer: nginx ###已经隐去了版本号信息Date: Sun, 17 Nov 2019 03:29:19 GMTContent-Type: text/htmlContent-Length: 14Last-Modified: Sun, 17 Nov 2019 03:12:02 GMTConnection: keep-aliveETag: "5dd0ba82-e"Accept-Ranges: bytes

(2)更改源码隐藏Nginx软件名和版本号

要隐藏Nginx下的软件名就必须对nginx的源码进行操作
我们需要依次修改三个源码文件

[root@localhost /]# curl  -I 192.168.10.10HTTP/1.1 200 OKServer: nginx/1.17.5Date: Mon, 18 Nov 2019 05:38:33 GMTContent-Type: text/htmlContent-Length: 612Last-Modified: Mon, 18 Nov 2019 05:31:23 GMTConnection: keep-aliveETag: "5dd22cab-264"Accept-Ranges: bytes第一个文件 nginx-1.17.5/src/core/nginx.h 修改前#ifndef _NGINX_H_INCLUDED_#define _NGINX_H_INCLUDED_#define nginx_version      1017005  #define NGINX_VERSION      "1.17.5"     ###这一行和版本号有关#define NGINX_VER          "nginx/" NGINX_VERSION    ###这一行修改nginx为fuxiangyu#ifdef NGX_BUILD#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"#else#define NGINX_VER_BUILD    NGINX_VER#endif#define NGINX_VAR          "NGINX"        ###这一行将NGINX修改为fuxiangyu#define NGX_OLDPID_EXT     ".oldbin"修改后#ifndef _NGINX_H_INCLUDED_#define _NGINX_H_INCLUDED_#define nginx_version      1017005#define NGINX_VERSION      "1.17.5"#define NGINX_VER          "fuxiangyu/" NGINX_VERSION#ifdef NGX_BUILD#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"#else#define NGINX_VER_BUILD    NGINX_VER#endif#define NGINX_VAR          "fuxiangyu"#define NGX_OLDPID_EXT     ".oldbin"第二个文件 nginx-1.17.5/src/httpngx_http_header_filter_module.c 的第49行修改前```pythonstatic u_char ngx_http_server_string[] = "Server: nginx" CRLF; ###修改引号中的nginx修改后static u_char ngx_http_server_string[] = "Server: fuxiangyu" CRLF;第三个文件 nginx-1.17.5/src/修改前#需要修改的位置在20行到30行之间"

" NGINX_VER "
" CRLF ###修改这一行"" CRLF"" CRLF;static u_char ngx_http_error_build_tail[] ="

" NGINX_VER_BUILD "
" CRLF ###修改这一行修改后"

" NGINX_VER "(http://192.168.10.10)
" CRLF ###定义对外展示的内容"" CRLF"" CRLF;static u_char ngx_http_error_build_tail[] ="

fuxiangyu
" CRLF ###此行将对外展示的Nginx名字更改为fuxiangyu三个文件都修改完成后,再对nginx进行重新编译,安装下面来看下效果[root@localhost /]# curl -I 192.168.10.10HTTP/1.1 200 OKServer: fuxiangyu/1.17.5 ###这里已经变成了fuxiangyu而不是nginx了Date: Mon, 18 Nov 2019 06:01:29 GMTContent-Type: text/htmlContent-Length: 612Last-Modified: Mon, 18 Nov 2019 05:31:23 GMTConnection: keep-aliveETag: "5dd22cab-264"Accept-Ranges: bytes

根据参数优化Nginx的服务器性能

一.优化Nginx服务的worker进程个数

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

更改原则:

搭建服务器时,work进程数最开始的设置可以等于CPU的核数,且worker进程数要多一些,这样起始提供服务的时候就不会出现因为访问量快速增加而临时启动新进程提供服务的问题,高流量高并发的场合,也可以考虑将进程数提高至CPU核数*2,具体情况要根据实际的业务来选择,因为这个参数除了要和CPU核数匹配之外,也和硬盘存储的数据数据及系统的负载有关,设置为CPU的核数是一个不错的起始配置

相关的配置参数

work_processes 
###该参数一般放置在nginx的全局变量块中放置位置:放在nginx的全局变量中

默认在配置文件中是auto,一般是一个CPU核数对应一个work-process进程

在这里插入图片描述
查看CPU核数的方法

第一种方法:[root@www nginx-1.16.1]# grep processor /proc/cpuinfo|wc -l2第二种方法:执行top之后,再按1可以看到CPU核数的信息

二.绑定不同的Nginx进程到不同的CPU上

默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一个核上,导致Nginx进程使用硬件资源不均,本小节将介绍如何分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的
相关的配置参数

work_processes 
worker_cpu_affinity
参数放置位置为nginx全局变量块处

配置如下

#四核CPU的配置worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;第一个进程绑定到编号为0的CPU核上,第二个进程绑定到编号为1的CPU核上第三个进程绑定到编号为2的CPU核上,第四个进程绑定到编号为3的CPU核上worker_processes 2;worker_cpu_affinity 0101 1010;第一个进程绑定到编号为0和2的cpu核上,第二个进程绑定到编号为1和3的cpu核上

经压力测试,可以得到这样绑定之后,CPU的使用率相对平均

三.Nginx事件处理模型优化

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

nginx事件处理模型的配置在event块中

event {
... use [kqueue|epoll|/dev/pollicop] ... } 参数放置位置:event块中

四.调整Nginx单个进程允许的客户端最大连接数

worker_connections的值要根据具体服务器性能和程序的内存使用量来指定(一个进程启动使用的内存根据程序确定)
该选项参数在event中进行配置

event {
... worker_connections 20480; ... } 参数放置位置:event块中

五.配置Nginx worker进程最大打开文件数

worker_rlimit_nofile 65535;参数放置位置:全局变量块中

六.开启高效文件传输模式

sendfile参数用于开启文件的高效传输模式,同时将tcp_nopush和tcp_nodelay 两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率

sendfile on|off参数放置位置:http块,server块,location块

参数作用:激活或禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核中的,被称为“零拷贝”,sendfile()比read和write函数要高效很多,因为read和write函数要把数据拷贝到应用层再进行操作

七.优化Nginx连接参数,调整连接超时时间

1.什么是连接超时
简单讲。一组连接在一段时间内没有发生实质性的数据交换,那么就可以认为这个连接的存在意义不大,占用了系统的资源,超过了时间阈值要主动断开这个连接
超时连接就是一种自我管理,自我保护的机制
2.连接超时的作用
·将无用的连接设置为尽快超时,可以保护服务器的系统资源(CPU,内存,磁盘)
·当连接很多时,及时断掉那些已经建立好的但又长时间不做事的连接,以减少其占用的服务器资源,因为服务器维护连接也是要消耗资源的
·预防DOS攻击,黑客发起很多无用的连接,试图击溃服务器
·LNMP环境中,如果用户请求了动态服务,则Nginx就会建立连接,请求FastCGI服务以及后端MySQL服务,此时这个Nginx连接就要设定一个超时时间,在用户容忍的时间内返回数据,或者再多等一会后端服务器返回数据,具体的策略要根据具体业务进行具体分析。当然FASTCGI服务及MYSQL服务也有对应连接的超时控制

3.超时参数的设置

(1)keepalive_timeout 60;

keepalive_timeout 
##单位为秒参数放置位置:http块,server块,location块

用于设置客户端连接保持会话的超时时间为60秒,超过这个时间,服务器会关闭连接

参数作用:keep-alive可以使客户端到服务器端已建立的连接一直工作不退出,当服务器有持续请求时,keep-alive会使用已经建立的连接提供服务,从而避免服务器重新建立处理请求
此参数设置一个keep-alive(客户端连接在服务器端保持多久后退出),其单位是秒

(2)tcp_nodelay on;

tcp_nodelay on|off ##单位为秒参数放置位置:http块,server块,location块

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

(3)send_timeout 25;

send_timeout 
##单位为秒参数放置位置:http块,server块,location块

参数作用:用于指定响应客户端的超时时间,这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接,

八.配置Ngxin expires缓存实现性能优化

1.功能介绍
简单讲,Nginx expries的功能就是为用户访问的网站设定一个过期的时间,当用户第一次访问这些内容时,会把这些内存存储在用户浏览器本地,这样用户第二次以及以后继续访问该网站时,浏览器会检查已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或者被清除为止

更深入的理解:expires的功能就是允许通过Nginx配置文件控制HTTP的“Expries”和“Cache-Control”响应头部内容,告诉客户端浏览器能否缓存和缓存多久,这些HTTP响应头部想客户端表明了内容的有效性和持久性。如果客户端本地有内容缓存,则内容就可以从缓存而不是从服务器上读取,然后客户端会坚持缓存中的副本,看其是否过期和失效,以决定是否重新从服务器获取内容更新

2.作用介绍

在网站的开发和运营中,视频,图片,CSS,JS等网站元素的更改机会比较少,特别是图片,这时可以讲图片设置在客户浏览器本地缓存365天,而讲CSS,JS,html等代码缓存10~30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存相应的内容,下次用户再打开类似的页面时,重复的元素就无需下载了,从而加快用户访问速度。用户的访问请求和数据减少了,也可节省大量的服务器端带宽。此功能同Apache的expires功能类似
3.优点
·expries可以降低网站的带宽,节约成本
·加快用户访问网站的速度,提升用户访问体验
·服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低

4.缺点

当网站被缓存的页面或数据被更新了,此时用户看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?
第一,对于经常需要变动的图片等文件,可以缩短对象缓存时间,例如:谷歌和百度的首页图片,经常根据日期的不同而换成一些节日的图片,所以这里可以将这个图片设置为缓存期为一天
第二,当网站改版或更新时,可以在服务器将缓存的对象改名(网站代码程序)
·对于网站的图片,附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是是一个新的图片名
·网站改版升级会修改JS,CSS等元素,若改版时对这些元素改了名,会使得前端的CDN及用户端需要重新缓存内容

5.参数配置

expires 
###可以指定时间 天,月等参数放置位置:location块,通常匹配指定类型的文件实例location ~ .*\.(js|css)?${
exprires 30d;}###匹配后缀名为js或者css的文件,在客户端缓存30天

九.配置Nginx gzip压缩实现性能优化

1.功能介绍
Nginx gzip压缩模块提供了压缩文件的内容,用户请求的内容再发送到用户客户端之前,Nginx服务器会根据一些具体的策略实施压缩。以节约网站出口带宽,同时加快数据传输效率,来提高用户访问体验
2.优点
·提升用户网站体验:发送给用户内容小了,用户访问单位大小的页面就加快了
·节约网站带宽成本:数据是压缩传输的,因此节省了网站的带宽流量成本
3.需要压缩和不需要压缩的对象
·纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如html,js,css,xml,shtml等格式的文件
·图片,视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或效果不明显,这样压缩的性价比就不高了
4.具体配置:这里不再给出了,有兴趣的同学自行搜索

日志相关的优化

当用户请求一个软件时,绝大多数软件都会记录用户的访问情况,Nginx服务也不例外。Nginx软件目前还没有类似Apache的对日志进行分割的功能,但是我们可以使用脚本,Nginx的信号控制功能或reload重新加载来实现日志的自动切割

一.配置日志切割的脚本

1.实现脚本

log_split#!/bin/bashcd /application/nginx/logs    #进入nginx存放日志的目录下/bin/mv www_access.log www_access_$(date +%F -d -1day).log                              #配置前一天的日子/application/nginx/sbin/nginx -s reload ##重新记载nginx使得触发重新生访问日志

2.将脚本加入到定时任务配置里,让脚本在每天零时执行,就可以实现分割功能

[root@localhost /]# crontab -e00 00 * * * /bin/bash /log_split  ###添加这行内容

二.不记录不需要访问的日志

在实际工作中,对于负载均衡器健康节点检查或某些特定文件(比如图片,JS,CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面来计算的,而且日志写入太频繁会消耗大量磁盘I/O,降低服务器的性能

location ~ .*\.(js|jpg|css)$ {
access_log off;}

Nginx图片及目录防盗链解决方案

1.什么是资源盗链

简单地说,就是某些不法网站未经许可,通过在其自身网站程序里非法带哦用其他网站的资源,然后再自己的网站上显示这些调用资源,达到填充自身网站的效果,这一举动不仅浪费了调用资源网站的网络流量,还造成其他网站的带宽及服务压力吃紧
2.实现防盗链解决方案的基本原理
(1)根据HTTP referer实现防盗
在HTTP协议中,有一个表头字段交referer,使用URL格式来表示是哪里的链接用来当前网页的资源。通过referer可以检测访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站,马上进行阻止或返回指定页面
HTTP referer是header的一部分,当浏览器向Web服务器发送请求时,一般会带上referer,告诉服务器我从哪个页面链接过来的,服务器借此获得一些信息用于处理。Apache,nginx,Lightttpd三者都支持根据HTTP referer实现防盗链

在这里插入图片描述

(2)根据cookie防盗链
对于一些特殊的业务数据,例如有的流媒体应用他们不向服务器提供referer header,要是采用对referer进行检测的方法是起不到很好的作用的。尤其是对于Flash,Windows Media视频这种占用流量较大的业务数据,防盗链是比较困难的,此时可以使用Cookie技术,来解决流媒体的问题

使用CDN做网站加速

一.什么是CDN

CDN的全称是Content Delivery Network,中文意思是内容分发网络。简单地将,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的Cache服务器内,通过智能DNS负载均衡技术,判断用户的来源,让用户就近使用与用户相同线路的带宽访问Cache服务器,取得所需的内容。一般由运营商提供CDN服务

CDN是一套全国或全球的分布式缓存集群,本质是通过智能DNS判断用户的来源地域及上网线路,为用户选择一个最近的Cache节点,以及和用户上网线路相同的服务节点,因为近并且和用户处于同一线路,所以会加快访问速度,提升用户的体验

二.CDN的特点

CDN就是一个具备根据用户区域和线路智能调度的分布式内存缓存集群,其具备以下特点
·通过服务器内存缓存网站数据,提高了企业站点(尤其含有大量图片,视频的站点)的访问的速度,并提高了企业站点的稳定性
·用户根据智能DNS技术自动选择最适合的Cache服务器,降低了不同运营商之间互联瓶颈造成的影响,保证不同网络中的用户都能得到良好的访问质量
·加快了访问速度,减少了原站点的带宽
·用户访问时从服务器的内存中读取数据,分担了网络流量,同时减轻了原站点负载压力
·使用CDN可以分担源站的网络流量,同时可以减轻原站点的负载压力,并降低黑客入侵及各种DDOS攻击对网站的影响,保证网站有较好的服务质量

[root@localhost /]# curl -I www.4399.comHTTP/1.1 200 OKDate: Mon, 18 Nov 2019 07:30:11 GMTContent-Type: text/htmlContent-Length: 172976Connection: keep-aliveExpires: Mon, 18 Nov 2019 07:33:39 GMTServer: nginxLast-Modified: Mon, 18 Nov 2019 01:14:14 GMTETag: "5dd1f066-2a3b0"Cache-Control: max-age=1800Accept-Ranges: bytesAge: 1592X-Via: 1.1 PShbsjzsxie214:4 (Cdn Cache Server V2.0), 1.1 bd37:3 (Cdn Cache Server V2.0), 1.1 PSsdzbwtxt63:12 (Cdn Cache Server V2.0)###Cdn Cache Server V2.0 就说明这个站点使用了CDN加速

转载地址:http://uwttd.baihongyu.com/

你可能感兴趣的文章
odoo10参考系列--视图二(表单视图)
查看>>
odoo10参考系列--Odoo中的安全机制
查看>>
odoo10参考系列--网络控制器(Web Controllers)
查看>>
odoo10参考系列--QWeb
查看>>
odoo10参考系列--ORM API 一(记录集、环境、通用方法和创建模型)
查看>>
odoo10参考系列--ORM API 三(字段、继承与扩展、域和更新到新API)
查看>>
SqlBulkCopy批量数据导入(EF实现)
查看>>
Odoo10参考系列--工作流
查看>>
简单的Android Camera2与BoofCV
查看>>
并发与并行
查看>>
ASP.NET Core——身份验证UI安装
查看>>
在ASP.NET Core 2.0中创建Web API
查看>>
简单的ASP.NET CORE 2.2 app + Vue JS
查看>>
倔强的程序员
查看>>
使用.NET Core 2.1,RabbitMQ,SignalR,EF Core 2.1和Angular 6开发微服务
查看>>
在启动时从配置文件中读取对象
查看>>
微软 2018 开源大事记
查看>>
基于深度神经网络的动作检测:问题与解决方案
查看>>
用于最优控制的简单软件
查看>>
TypeScript 3.4 发布
查看>>