🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一、隐藏nginx header内版本号信息 由于一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息),在一定程度确保web服务器的安全 1、利用curl查看隐藏前header内的web版本信息 [root@node1 ~]# curl -I http://10.100.100.111 HTTP/1.1 200 OK # Server: nginx/1.10.2 Date: Wed, 06 Dec 2017 20:56:43 GMT Content-Type: text/html Content-Length: 3698 Last-Modified: Mon, 31 Oct 2016 12:37:31 GMT Connection: keep-alive ETag: "58173b0b-e72" Accept-Ranges: bytes 2、隐藏版本号 http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; (添加这个即可) 3、测试 [root@node1 ~]# service nginx reload Reloading nginx: [ OK ] [root@node1 ~]# curl -I http://10.100.100.111 HTTP/1.1 200 OK Server: nginx 二、更改掉nginx的默认用户及用户组nobody 1、nginx服务启动,使用默认用户nobody [root@node1 ~]# grep "user" /etc/nginx/nginx.conf.default #user nobody; (默认为nobody) #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '"$http_user_agent" "$http_x_forwarded_for"'; 2、更改配置文件/etc/nginx/nginx.conf #user nobody更改为user nginx 或者在编译的时候指定 --user=nginx --group=nginx 3、查看 [root@node1 ~]# ps -ef|grep nginx root 1442 1 0 04:56 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 1478 1442 0 05:02 ? 00:00:00 nginx: worker process root 1485 1335 0 05:08 pts/0 00:00:00 grep nginx 三、配置nginx worker进程个数 worker_processes 定义了nginx对外提供web服务时的worker进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它) 新版本的nginx,worker_processes 都为auto咯 如果要设置,一般设置为服务器cpu核心数-1,假如8核CPU,那么设置 worker_processes 6 查看物理cpu的方法 [root@node1 ~]# grep "physical id" /proc/cpuinfo physical id : 0 2、worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。 work_rlimit_nofile 65535; 文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。 * soft nofile 65535 * hard nofile 65535 用户重新登录生效(ulimit -n) 3、worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。 4、multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。 四、根据CPU核数进行nginx进程优化 默认情况nginx的多个进程可能跑到一颗CPU上,我们要将不同的进程分配到不同的cpu上 假如四核的CPU worker_cpu_affinity 0001 0010 0100 1000 假如八核CPU worker_cpu_affinity 000000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 五、HTTP上下文配置优化 (1)、sendfile 指向 sendfile()函数。sendfile() 在磁盘和 TCP 端口(或者任意两个文件描述符)之间复制数据。不要在意这些细节,说了这么多,只是想说,开着就好。 (2)、tcp_nopush 配置 nginx 在一个包中发送全部的头文件,而不是一个一个发送。 (3)、tcp_nodelay 配置 nginx 不要缓存数据,应该快速的发送小数据——这仅仅应该用于频繁发送小的碎片信息而无需立刻获取响应的、需要实时传递数据的应用中。 (4)、keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。(可以改的低点,比如15) 六、连接超时时间 主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的 1) keepalived_timeout客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接 keepalive_timeout 60; 2)客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小 client_header_buffer_size 4k; 3)open_file_cache max=102400 inactive=20s; 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件 数一致,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; 这个是指多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 1; open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文 件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。 4)client_header_timeout设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误 client_body_timeout设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示 5)send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接 6)client_max_body_size上传文件大小限制 7)open_file_cache max=102400 inactive=20s; 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件 数一致,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; 这个是指多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 1; open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文 件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。