前言
环境: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.0
, curl -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上,这样就存在硬件资源的使用不均衡,这种情况可以将nginx
的work
进程绑定到不同的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;
}
}
}