nginx企业级优化实战

前言

环境:centos7.9 nginx version: nginx/1.18.0
nginx官方文档:http://nginx.org/en/docs

调整参数隐藏nginx软件版本号

执行:curl -I 192.168.43.120:82 会显示如下信息:

HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sun, 25 Apr 2021 15:22:26 GMT
Content-Type: text/html
Content-Length: 606
Last-Modified: Sun, 18 Apr 2021 15:24:50 GMT
Connection: keep-alive
ETag: "607c4f42-25e"
Accept-Ranges: bytes

这就暴露了web版本号和软件名称是 nginx/1.18.0curl -I https://www.baidu.com/ 得到 Server: bfe/1.0.8.18,由此可见百度隐藏了软件名称,门户网站尚且如此,我们也要隐藏web版本号和软件名称。
隐藏nginx版本号:在配置文件中加 server_tokens off;默认是on状态,server_tokens参数可以在http、server、location中。

更改源码隐藏nginx软件名称及版本号

默认是不允许修改nginx名称的,这时因为商业及品牌展示等原因,但我们可以通过修改源码来实现修改软件名称,这里不说了。

更改nginx服务的默认用户

useradd -M -s /bin/false nginx				#-s是指定shell为不登录shell,-M表示不创建家目录
./configure --user=nginx --group=nginx      #安装时指定用户和用户组
vim nginx.conf								#打开配置文件进行编辑
user nginx									#指定用户(worker 进程的用户指定为nginx,但master进程还是root身份运行的)

优化nginx服务的worker进程个数

vim nginx.conf								#打开配置文件进行编辑
worker_processes  8;						#默认值是1个进程

在高并发高访问量的web服务场景中,必须开启多个worker进程来保证有足够多的进程来处理客户的请求,这就好比饭店,需要有多个服务员;而开启多少个worker进程这要根据网页的业务访问量来决定,官方建议初始的worker进程数量配置等于CPU的核数,当然在高并发的网站,worker进程数量等于CPU核数*2也是可以考虑的,这个worker进程数量具体的值不仅跟网站访问量、cpu核数相关,还和硬盘存储的数据和系统的负载等相关。

配置word进程最大打开的文件数

worker_rlimit_nofile  number;				#worker_processes能打开的最大文件数

放置位置就在main标签块中,即放worker_processes 后即可,这个参数能改变worker_processes能打开的最大文件数。

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

我们知道,可能存在多个nginx进程跑在同在一个cpu上,这样就存在硬件资源的使用不均衡,这种情况可以将nginxwork进程绑定到不同的CPU上来解决,我们先了解一下CPU的概念,1个CPU上可以存在多个核心,比如2核心,那么总的CPU核心就是2,同理,2个CPU,每个CPU都有2核心的话,总的CPU核心就有4个核心。查看Linux系统的CPU信息在/proc/cpuinfo文件中。

grep -c processor /proc/cpuinfo 					# 查看有多少个CPU核数
lscpu | grep 'CPU(s)'|head -1 |awk '{print $2}' 	#这样也可以查看总的CPU核数

worker_cpu_affinity 参数语法格式:

worker_cpu_affinity	cpumask;	#worker_cpu_affinity参数必须放在main块中,即放worker_processes 后,cpumask为cpu的掩码

下面看一下配置示例:

worker_processes 2; 			# 2进程2核CPU的配置,01表示启用第一个CPU内核,10表示启用第二个CPU内核,下面以此类推
worker_cpu_affinity 01 10;

worker_processes 4; 			# 4个进程4核CPU的配置
worker_cpu_affinity 0001 0010 0100 1000;

worker_processes 8; 			# 8个进程8核CPU的配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;

worker_processes     4;			#4个进程,2核CPU的配置
worker_cpu_affinity 01 10 01 10;

worker_processes     2;			#4核CPU,开启2个进程
worker_cpu_affinity 0101 1010;	#0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核

说明:2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了,配置完毕后,平缓重启nginx

nginx的事件处理模块优化

events 块中可以设定nginx的事件处理模型,而nginx的事件处理模型有select、poll、kqueue、epoll、rtsig、dev/poll,其中select、poll都是标准的工作模式,kqueue、epoll是高效的事件处理模型,不同的是epoll用在Linux系统中,kqueue用在BSD系统中,对于Linux系统和Linux2.6+的内核,推荐选择epoll工作模式,这是高并发的设置。

events {
	use epoll;				#使用epoll时间处理模型
    worker_connections  1024;
}

根据官方建议,也可以不指定事件处理模型,默认情况下,nginx会自己选择最合适最佳的事件处理模型服务。

单个进程运行的客户端最大连接数

events {
    worker_connections  1024;	#worker进程最大连接数
}

worker_connections 参数就是设置单个进程的客户端最大连接数,默认值为1024,那么总的客户端最大连接数就等于work进程数*worker_connections
worker_connections连接数包含了代理服务器的连接数、客户端的连接数。

 ngixn总并发连接=worker_processe    乘以   worker_connections

开启高效文件传输模式

sendfile  on;		#默认是off,on表示开启高效文件传输模式,可以放置的位置:http、server、location、if in location
tcp_nopush on;		#配置一次发送数据的包大小,即它不是按时间累计0.2 秒后发送包,而是当包累计到一定大小后就发送,在 nginx 中,tcp_nopush 必须和 sendfile 搭配使用。

开启gzip压缩

#开启gzip压缩可以使请求传输数据的大小减少一半甚至更多
gzip on;						#开启gzip压缩,官方默认是off
gzip_http_version 1.0;			#设置压缩响应所需的请求的最低 HTTP 版本,官方默认就是1.0
gzip_disable 'MSIE [1-6]'		#禁用压缩,这里表示禁用MSIE6版本一下的压缩,因为MSIE6版本压缩会乱码
gzip_comp_level 1;				#压缩级别,默认是1,可取值1-9
gzip_min_length 20;				#设置将被压缩的响应的最小长度,长度仅由“Content-Length”响应头字段确定

#根据请求和响应启用或禁用代理请求的响应 gzip 压缩。请求被代理的事实是由“Via”请求头字段的存在决定的。该指令接受多个参数:
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

gzip_types text/html text/plain application/javascript ;	#表示要对那种类型的资源进行压缩,可以设置多个参数,默认是text/html
更多参数释意查看官网:http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip

配置Nginx worker进程最大打开文件数(性能优化)

官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile
Syntax:worker_rlimit_core size;
Default:—
Context:main
实践配置:

worker_rlimit_nofile 65535#最大打开文件数,可设置为系统优化后的ulimit -HSn的结果

Keepalive_timeout 超时时间

keepalive_timeout :超时时间,是指客户端到服务端的连接持续有效时间,若在这个时间内接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。若keepalive_timeout设置为 0,就禁止了 keepalive 连接。

设置expire过期时间

expires用于告知浏览器其获取到的页面信息过期时间是多少,换句话说告知浏览器其获取的信息在多长时间内是有效的,expires可以设置于http, server, location, if in location段中。expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求。

expires 1h;		#表示缓存1小时
expires 3d; 	#表示缓存3天
expires 3h; 	#表示缓存3小时
expires max; 	#表示缓存10年
expires -1; 	#表示永远过期
#示例:
location ~.*\.(js|css|html|png|jpg)$ {
    expires 3d;
}
#某些需求可以需要禁用缓存,如下设置:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
 #禁止浏览器缓存,让浏览器每次都从服务器请求
  add_header Cache-Control no-store;
}

调整上传文件的大小(http Request body size)限制

在 Nginx 的主配置文件里加入如下参数:

client_max_body_size 8m;

参数作用:设置最大的允许的客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到 413 错误,意思是请求的条目过大,有可能浏览器不能正确显示。设置为0 表示禁止检查客户端请求主体大小。此参数对提高服务器端的安全性有一定的作用。
具体大小根据公司的业务做调整,如果不清楚就先设置为 8m 吧,有关客户端请求主体的解释在 HTTP 原理一节已经解释过了,一般情况下,HTTP 的 post 方法在提交数据时才会携带请求主体信息。

client_max_body_size 参数的官方说明如下:
syntax: client_max_body_size size;#<==参数语法
default: client_max_body_size 1m;#<==默认值是 1m
context: http, server, location

企业常用优化

[root@localhost nginx]# egrep -v  "#|$^" /etc/nginx/nginx.conf
user nginx;
worker_processes 16;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 10240;
    use epoll;
}
http {
    sendfile            on;
    keepalive_timeout   65;
    keepalive_requests 9000000;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    client_max_body_size 5000m;
    client_body_buffer_size 128k;
    client_header_buffer_size 4k;
    proxy_connect_timeout 60;
    proxy_send_timeout 1200;
    proxy_read_timeout 1200;
    proxy_buffer_size 6k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_temp_path temp_dir;
    proxy_max_temp_file_size 0;
    add_header Cache-Control no-cache;
    add_header Cache-Control private;
    
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        server_name  localhost;
        fastcgi_buffer_size 32k;
        fastcgi_buffers 8 128k;
        proxy_max_temp_file_size 0;
        proxy_buffer_size 8k;
        proxy_buffers 8 32k;
        fastcgi_connect_timeout 3000;
        fastcgi_send_timeout 3000;
        fastcgi_read_timeout 3000; 
        location / {
		root html;
               index index.html index.htm;
	}
        location /staticDownload {
        	root /xxx/dox/;
       		if ($request_filename ~* ^.*?\.)(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
          		add_header Content_Disposition: 'attachment;';
		}
        autoindex_exact_size off;
        autoindex_localtime on;
        }
		
		# 禁止缓存htlm文件,为了每次打开单点登录username可以让网关拦截
        location /xx-web{
          root /xx/xx-web;
          index index.html index.htm;
          if ($request_file ~* .*\.(?:htm|html)$)
           {
             add_header Cache-Control "private,no-store,no-cache,must-revalidate,proxy-revalidate";
           }
          if ($request_filename ~* .*\.(?:js|css)$)
            {
              expires 7d;
            }
          if ($request_filename ~* .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$)
            {
              expires 7d;
           }
	}
        include /etc/nginx/default.d/*.conf;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
          root html;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值