企业级Nginx Web服务优化

nginx基本安全优化

隐藏版本号

  • 修改nginx.conf的http标签
http {
.......
server_tokens off ;
.......
}
  • 重启nginx
nginx -s reload
  • 检查
[root@nginx1 conf]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx    #版本号已消失
Date: Mon, 24 Jun 2019 06:09:30 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 06 May 2019 07:58:22 GMT
Connection: keep-alive
ETag: "5ccfe91e-264"
Accept-Ranges: bytes

修改软件名

在这里插入图片描述
这里需要修改nginx的3个源码文件

  • 修改nginx-1.6.3/src/core/nginx.h
    在这里插入图片描述
#define NGINX_VER          "nginx/" NGINX_VERSION 将这里的nginx修改为想要的软件名字

#define NGINX_VAR          "NGINX"       #将这里的NGINX修改为想要 的软件名字
#define NGX_OLDPID_EXT     ".oldbin"
  • 修改结果如下
#define NGINX_VER          "test/" NGINX_VERSION   已修改为自己想要的结果

#define NGINX_VAR          "test"  已修改为自己想要的结果
#define NGX_OLDPID_EXT     ".oldbin"
  • 修改nginx-1.6.3/src/http/ngx_http_header_filter_module.c 的49行
    在这里插入图片描述
static char ngx_http_server_string[] = "Server: nginx" CRLF;#将nginx修改为想要的名字
  • 修改后的结果
static char ngx_http_server_string[] = "Server: test" CRLF;#已修改为自己想要的结果
  • 修改nginx-1.6.3/src/http/ngx_http_special_response.c
    在这里插入图片描述
static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF 
"</body>" CRLF
 "</html>" CRLF
  • 修改后的结果
static u_char ngx_http_error_tail[] =
"<hr><center>test</center>" CRLF
"</body>" CRLF
"</html>" CRLF
  • 重新编译nginx
./configure  --prefix=/application/nginx --user=nginx --group=nginx
make&&make install

在这里插入图片描述
在这里插入图片描述

更改nginx默认用户

在编译的时候可以利用–user和–group来指定用户

 ./configure --user=nginx --group=nginx --prefix=/application/nginx
  • 已经编译后修改默认用户
useradd nginx_test -s /sbin/nologin -M 
  • 编辑nginx.conf
    在这里插入图片描述
  • 重启nginx服务
    在这里插入图片描述发现默认用户已经改变
    在这里插入图片描述

优化nginx服务性能

优化nginx服务的worker进程数

在高并发、高访问量的web服务场景中,需要启动好更多的nginx进程,以保证快速响应处理大量并发用户的请求。
好比饭店开业需要招聘服务员,如果招聘的人数很少,但是客流量很大,就会出现接待顾客不及时的情况,导致顾客吃饭体验差。如果招聘人数过多,客流量缺很少,就会出现服务员很闲,没事干的情况,这样也会导致饭店的成本升高。因此在开业前期需要对客流量进行预估,然后根据估值调整到最佳的人数。
nginx的worker进程也是如此,在上线前期做出合理的预测可以使用户有一个好的体验。

  • 优化nginx进程设置
worker_processes 1  #<< 指定了nginx要开启的进程数,结尾的数字就是要开启进程的个数

nginx的worker_processes优化与cpu的核数相关

  • 查看cpu的核数
grep -c /proc/cpuinfo | wc -l

在这里插入图片描述
表示为1颗cpu一核

  • 查看cpu总颗数
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l

在这里插入图片描述
对physical id去重,表示一颗cpu
将worker_processes数修改为与cpu的核数一致

  • 重启查看
    在这里插入图片描述

worker_processes为定义worker进程的数量,建议设置为cpu的核数或核数*2的进程数,具体情况要根据实际的业务来选择,因为这个参数,除了要和cpu核数匹配外,和硬盘存储的数据以及系统的负载也会有关,设置为cpu的个数或是核数是一个好的起始配置

优化绑定不同的nginx进程到不同的cpu上

默认情况下nginx的多个进程有可能跑在某一个或某一刻cpu上,导致nginx进程使用硬件的资源不均,优化的目的是尽可能地分配不同的nginx进程给不同的cpu处理,达到充分利用硬件的多cpu多核资源的目的。
这里以四核cpu为例,参数配置如下:

  • 四核cpu开启四个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;  #<< worker_cpu_affinity就是配置nginx进程cpu亲和力的参数,即把不同的进程分给cpu不同的内核处理。这里的0001 0010 0100 1000是掩码,分别代表1、2、3、4核,由于worker_processes进程数为4,因此,上述配置会把每个进程分配给cpu的某一核处理,默认情况下不会绑定任何cpu。
  • 四核cpu开启两个进程
worker_processes 4;
worker_cpu_affinity 0101 1010;
  • 八核cpu开启8个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。配置完毕后,重启nginx .

nginx事件处理模型优化

nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,在linux下,nginx使用epoll的I/O多路复用模型,在freebed中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows使用的是icop,等等。
要根据系统类型选择不同的事件处理模型,可供使用的选择有"use [kqueue|rtsig|epoll|/dev/poll|select|poll]"。

  • 以epoll为例
events 
{
use epoll;
 #<< use是事件模块指令,用来指定nginx的工作模式。nginx支持的工作模式有select、epoll、poll、
 kqueue、rtsig和/dev/poll。其中select和poll是标准的工作模式,kqueue和epoll是高效的工作模式,
 不同的是epoll用在linux平台上,而kqueue用在BSD系统中。对于Linux系统Linux2.6+的内核,推荐
 选择使用epoll工作模式,这是高性能高并发的设置。
}

调整nginx单个进程客户端最大连接数

worker_connections的值要根据具体服务器的性能和程序的内存使用量来指定(一个程序启动时使用的内存)

events {
worker_connections 20480;
#<< worker_connections,用于定义nginx每个进程的最大连接数,默认是1024。最大客户端连接数
是由worker_connections和worker_process共同决定的,即max_client=worker_processes*worker_c
onnections。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令
"ulimit -HSn 65535"或配置相应文件后worker_conncetios才能生效
}

开启高效文件传输模式

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

http {
sendfile on;
}
  • 设置tcp_nopush
http{
tcp_nopush on;
}

tcp_nopush需要sendfile开启才能使用,tcp_nodelay也是

优化nginx连接超时时间

  • 连接超时的作用
  1. 设置将无用的连接尽快超时,可以保护服务器的系统资源
  2. 当连接很多时,及时断掉那些已经建立好的但又长时间不做事的连接,以减少占用服务器资源,因为服务器维护连接也是消耗资源的
  3. 有时黑客或恶意用户攻击网站,就会不断地和服务器建立多个连接,消耗连接数,但是什么也不干,只是持续建立连接,这样就会大量消耗服务器的资源,此时就应该及时断掉这些恶意占用资源的连接。
  4. lnmp环境中,如果用户请求了动态服务,则nginx就会建立连接请求fastcgi服务以及MySQL服务,此时nginx连接就要设置超时时间,在用户容忍的时间内返回数据,或者再多等一会后端服务返回数据,具体时间要根据具体业务分析
  • 超时连接设置
http {
keepalive_timeout 60;
}

keepalive可以是客户端到服务器端已经建立的连接一直工作不退出,当服务器有持续请求时,keepalive会使用正在建立的连接提供服务,从而避免服务器重新建立新连接处理请求

  • 设置客户端连接超时(client_header_timeout)

用于设置读取客户端请求头数据的超时时间,此处的数值15s。

http {
client_header_timeout 15;
}

设置读取客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,服务器将返回"Request time out (408)"错误。

  • 设置读取客户端请求主体超时时间(client_body_timeout)

用于设置读取客户端请求主体的超时时间,默认是60s。

http {
client_body_timeout 15;
}

设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,nginx将返回"Request time out(408)"错误。

  • 设置响应超时时间(send_timeout)

用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接,默认60s。

http {
send_time 25;
}

设置服务器端传送http响应信息到客户端的超时时间,这个超时时间仅仅为两次握手后的一个超时,非请求整个响应数据的超时时间,如果在这个时间内,客户端没有接收任何数据,连接将被关闭。

限制用户上传文件大小

http {
client_max_body_size 8m ;
}

设置最大的允许客户端请求主体大小,在请求头域有"Content-Lenth",如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小。

fastcgi相关参数调优

nginx fastcgi相关参数说明
fastcgi_connect_timeout表示nginx服务器和后端fastcgi服务器连接的超时时间,默认为60s,这个参数通常不要超过75s,因为建立的连接越多消耗的资源就越多。
fastcgi_send_timeout设置nginx允许fastcgi服务端返回数据的超时时间,即在规定时间之内后端服务器必须传完所有的数据,否则nginx将断开连接,默认值为60s。
fastcgi_read_timeout设置nginx从fastcgi服务端读取响应信息的超时时间。表示连接建立成功后,nginx等待后端服务器响应的时间,是nginx已经进入后端的排队之中等候处理的时间。
fastcgi_buffer_size这是nginx fastcgi的缓冲区大小参数,设定用来读取从fastcgi服务端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部,默认情况这个参数的大小是由fastcgi_buffer指定的一个缓冲区大小。
fastcgi_buffers设定用来读取从fastcgi服务端收到的响应信息的缓冲区大小以及缓冲区数量。默认值fastcgi_buffers 8 4k|8k;指定本地需要用多少和多大的缓冲区来缓冲fastcgi的应答请求。如果一个php脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好的办法,因为内存中的数据处理速度快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为"16 16KB"、“4 64KB”。
fastcgi_busy_buffers_size用于设置系统很忙时可以使用的fastcgi_buffers大小,官方推荐的大小为fastcgi_buffers *2。默认值fastcgi_busy_buffers_size 8K|16K;
fastcgi_temp_file_write_sizefastcgi临时文件的大小,可设置128-256K
fastcgi_cache cache-name表示开启fastcgi缓存并为其命名。开启缓存非常有用,可以有效降低CPU的负载,并防止502错误的发生,但是开启也会引起其他问题,要根据具体情况选择。
fastcgi_cache_min_uses示例:fastcgi_cache_min_uses 1;设置请求几次之后响应将被缓存。
fastcgi_cache_use_stale示例:fastcgi_cache_use_stale error timeout invalid_header http_500,定义哪些情况下使用过期缓存
fastcgi_cache_valid示例:fastcgi_cache_valid 200 301 1h;用来指定应答代码的缓存时间,示例中的值表示将200和302应答缓存一个小时;示例:fastcgi_cache_valid 301 1d,表示将301应答缓存1天;示例:fastcgi_cahce_valid any 1m,表示将其他应答缓存1分钟。
  • 配置示例
http
{
 fastcgi_connect_timeout 240;
 fastcgi_send_timeout 240;
 fastcgi_read_timeout 240;
 fastcgi_buffer_size 64k;
 fastcgi_buffers 4 64k;
 fastcgi_busy_buffers_size 128k;
 fastcgi_temp_file_write_size 128k;
 #fastcgi_temp_path /tmp/ngx_fcgi_tmp;
 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2;
 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
}

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_use_stale error timeout invalid_header http_500;
 fastcgi_cache_key http://$host$request uri;
}

nginx gzip压缩优化

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

  • 需要与不需要压缩的对象

  1. 纯文本内容压缩比很高,因此,纯文本的内容最好压缩,例如:html、js、css、xml、shtml等格式的文件。
  2. 被压缩的纯文本文件必须大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能变大。
  3. 图片、视频(流媒体)等文件尽量不压缩,因为这些文件大多多时经过压缩的,如果再压缩很可能不会减小,或者有可能增大,而在压缩的时候还会消耗大量的CPU、内存资源。
  • 参数介绍及配置说明

nginx 的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装。
对应的压缩参数说明如下:

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

不同的nginx版本中,gzip_types的配置可能会有不同,上述配置示例适合nginx-1.6.3。对应的文件类型需要查看安装目录下的mine.types文件

图片防盗链

常见防盗链解决方案的基本原理

  • 根据http referer

在HTTP协议中,有一个表头叫referer,使用URL格式来表示是哪里的链接用了当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示他的网页地址,一旦检测出来源不是本站,马上进行阻止或返回指定页面。
HTTP Referer是header头的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。Apache、NGINX、lightHTTP三者都支持根据http referer实现防盗链referer是目前网站图片、附件、html等最常用的防盗链手段。

  • 修改配置文件
server {
  location ~*^.+\.(jpg|png|swf|rar)${
  valid_referers none blocked *.test.com test.com;
  if ($invalid_referer) {
  rewdrite ^/http://www.error.com/images/error.jgpg;
  }
  root html/www;
  }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值