Nginx配置文件优化

来自Linux78|wiki

隐藏Nginx版本号信息 vim /application/nginx/conf/nginx.conf http{

   server_tokens off;

} 更改源码隐藏Nginx软件名及版本号 第一步是一次修改3个Nginx源码文件 修改的第一个文件为nginx-1.6.3/src/core/nginx.h cd /home/oldboy/tools/nginx-1.6.3/src/core/ vim nginx.h

  1. define NGINX_VERSION "9.9.9"
  2. 修改为想要的版本号
  3. define NGINX_VER "ABCDOCKER/" NGINX_VERSION
  4. 将nginx修改想要修改的软件名称
  5. define NGINX_VAR "ABCDOCKER"
  6. 将nginx修改为想要修改的软件名称。
  7. define NGX_OLDPID_EXT ".oldbin"

第二步修改nginx-1.6.3/src/http/ngx_http_header_filter_module.c的第49行 vim src/http/ngx_http_header_filter_module.c static char ngx_http_server_string[] = "Server: ABCDOCKER" CRLF;

  1. 修改本行,此处的文件是我们Curl 出来显示的名称

第三步修改nginx-1.6.3/src/http/ngx_http_special_response.c,对外页面报错时,它会控制是否展示敏感信息。修改28~30行

vim src/http/ngx_http_special_response.c 21 static u_char ngx_http_error_full_tail[] =

22 "


"123(123)"

" CRLF

23 "</body>" CRLF 24 "</html>" CRLF 25 ; 26 27 28 static u_char ngx_http_error_tail[] =

29 "


123(123)

" CRLF

30 "</body>" CRLF 31 "</html>" CRLF 修改完成之后需要重新编译nginx 查看原来编译的参数

/application/nginx/sbin/nginx -V nginx version: nginx/1.6.3 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) TLS SNI support enabled configure arguments: --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module ./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module 提示:需要停止原来的nginx,从新进行编译。如果不想在覆盖原来的编译参数可以选择指定新的目录。 提示:最后还需要make makeinstall 才会生效 测试:需要开启nginx

更改Nginx服务的默认用户 grep "#user" /application/nginx/conf/nginx.conf.default

  1. user nobody;

为Nginx服务建立新用户 useradd nginx -s /sbin/nologin -M id nginx 配置Nginx服务,让其使用刚建立的nginx用户 更改ningx服务默认使用的用户方法有两种: 第一种为直接更改配置文件参数,将默认的#user nobody修改如下内容 user nginx nginx;

  1. 在http标签即可

如果注释或不设置上述参数,默认即是nobody用户,不推荐使用。最好采用一个普通用户 第二种为直接在编译nginx软件时指定编译的用户和组 ./configure --prefix=/application/nginx-1.6.3/ --user=www --group=www --with-http_ssl_module --with-http_stub_status_module 提示:前文在编译nginx服务时,就是这样带着参数,因此配置文件中加不加参数默认都是nginx用户了。 通过上述修改后Nginx进程,可以看到worker processes进程对应的用户都变成了nginx 绑定Nginx进程到不同CPU 默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。

worker_processes 1; worker_cpu_affinity 0001 0010 0100 1000; worker_cpu_affinity就是配置nginx进程CPU亲和力的参数,即把不同的进程分给不同的CPU处理。这里0001 0010 0100 1000是掩码,分别代表1、2、3、4核cpu核心,由于worker_processes进程数为4,因此上述配置会把每个进程分配一核CPU处理,默认情况下进程不会绑定任何CPU,参数位置为main段

worker_cpu_affinity参数的官方说明如下: syntax: worker_cpu_affinity cpumask…..#此行为cpu亲和力参数语法,cpumask为cpu掩码 default: —- #默认不配置 context: main #此行为worker_cpu_affinty参数可以放置的位置 worker_cpu_affinity的作用是绑定不同的worker进程到一组CPU上。通过设置bitmask控制允许使用的CPUS,默认worker进程不会绑定到任何CPUS。 参考:

worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; binds each worker process to a separate CPU, while worker_processes 2; worker_cpu_affinity 0101 1010; binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3. The second example is suitable for hyper-threading.The directive is only available on FreeBSD and Linux. From : http://nginx.org/en/docs/ngx_core_module.html Nginx事件处理模型优化 Nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows使用的是icop,等待。 要根据系统类型选择不同的事件处理模型,可供使用的选择的有“use [kqueue|rtsig|epoll|/dev/poll|select|pokk]”。 企业面试题Nginx epool和apache select有什么区别? http://www.tuicool.com/articles/AzmiY3

具体配置如下:

events {

  1. events指令是设定Nginx的工作模式及连接数上限

use epoll } use是个事件模块指定,用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作迷失,kqueue和epoll是高效工作模式,不同的是epoll用在Linux平台,而kqueue用在BSD系统中。对于Linux 2.6内核推荐使用epoll工作模式 根据Nginx的官方文档建议,也可以不指定事件处理模型,Nginx会自动选择最佳的事件处理模型服务。

Nginx单个进程允许的客户端最大连接数 调整Nginx单个进程允许客户端的最大连接数,这个控制连接数的参数为

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

events {

   worker_connections  20480;

} worker_connections 也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024.最大客户端连接数由worker_processes和worker_connections决定. 并发=worker_process * worker_connections 参考资料:http:nginx.org/en/docs/ngx_core_module.html

Nginx worker进程最大打开文件数 Nginx worker进程的最大打开文件数,这个控制连接数的参数为worker_rlimit_nofile。

worker_rlimit_nofile 65535 最大打开文件数,可设置为系统优化有的ulimit-HSn的结果。 worker_rlimit_nofile number的官方说明如下:

参数语法:worker_rlimit_nofile number; 默认配置:无 放置位置:主标签段 说明:此参数的作用是改变worker processes能打开的最大文件数。 参考资料:http://nginx.org/en/docs/ngx_core_module.html

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

syntax: sendfile on|off #参数语法 default: sendfile off #参数默认大小 context: http,server,location,if in location #可放置的标签段 参数作用:激活或者禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中,被称为“零拷贝”,sendfile()和read和write函数要高效很多,因为read和wrtie函数要把数据拷贝到应用层再进行操作。相关控制参数还有sendfile_max_chunk。 http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile

设置参数:tcp_nopush on; Syntax: tcp_nopush on | off; #参数语法 Default: tcp_nopush off; #参数默认大小 Context: http, server, location #可以放置标签段 参数作用:激活或禁用Linux上的TCP_CORK socker选项,此选项仅仅开启sendfile时才生效,激活这个tcp_nopush参数可以运行把http response header和文件的开始放在一个文件里发布,减少网络报文段的数量。 http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nodelay

设置参数:tcp_nodelay on; 用于激活tcp_nodelay功能,提高I/O性能

Syntax: tcp_nodelay on | off; Default: tcp_nodelay on; Context: http, server, location 参数作用:默认情况下数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能,但是,在每次只发送很少字节的业务场景,使用tcp_nodelay功能,等待时间会比较长。 参数生产条件:激活或禁用tcp_nodelay选项,当一个连接进入到keep-alive状态时生效 http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nopush

Nginx连接参数调整连接超时时间 什么是连接超时? 这里的服务员相当于Nginx服务建立的连接,当服务器建立的连接没有接收到处理请求时,可在指定的事件内就让它超时自动退出。还有当Nginx和fastcgi服务建立连接请求PHP时,如果因为一些原因(负载高、停止响应)fastcgi服务无法给Nginx返回数据,此时可以通过配置Nginx服务参数使其不会四等。例如:可设置如果Fastcgi 10秒内不能返回数据,那么Nginx就终端本次请求。

连接超时的作用 1)设置将无用的连接尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘) 2)当连接很多时,及时断掉那些已经建立好的但又长时间不做事的连接,以减少其占用的服务器资源,因为服务器维护连接也是消耗资源的。 3)有时黑客或而恶意用户攻击网站,就会不断和服务器建立多个连接,消耗连接数,但是什么也不操作。只是持续建立连接,这就会大量的消耗服务器的资源,此时就应该及时断掉这些恶意占用资源的连接。 4)LNMP环境中,如果用户请求了动态服务,则Nginx就会建立连接请求fastcgi服务以及MySQL服务,此时这个Nginx连接就要设定一个超时时间,在用户容忍的时间内返回数据,或者再多等一会后端服务返回数据,具体策略要看业务。 连接超时带来的问题以及不同程序连接设定知识 服务器建立新连接也是要消耗资源的,因此,超时设置的太短而并发很大,就会导致服务器瞬间无法响应用户的请求,导致体验下降。 企业生产有些PHP程序站点就会系统设置短连接,因为PHP程序建立连接消耗的资源和时间相对要少些。而对于java程序站点一般建议设置长连接,因为java程序建立消耗的资源和时间更多。

Nginx连接超时的参数设置 设置参数:keeplived_timeout 60; 用于设置客户端连接保持会话的超时时间为60秒。超过这个时间,服务器会关闭该连接,此数值为参考值。

keepalive_timeout timeout [header_timeout]; #参数语法 Default: keepalive_timeout 75s; #参数默认大小 Context: http, server, location #可以放置的标签段 参数作用:keep-alive可以使客户端到服务端已经建立的连接一直工作不退出,当服务器有持续请求时,keep-alive会使用正在建立的连接提供服务,从而避免服务器重新建立新连接处理请求。

设置参数:client_header_timeout 15; 用于设置读取客户端请求头数据的超时时间,此处的数值15单位是秒。 Syntax: client_header_timeout time; Default: client_header_timeout 60s; Context: http, server 参数作用:设置读取客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,服务端将数据返回“Request time out (408)”错误。 设置参数:client_body_timeout 15; 用于设置读取客户端请求主体的超时时间,默认值是60 Syntax: client_body_timeout time; Default: client_body_timeout 60s; Context: http, server, location 参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60. http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout 设置参数:send_timeout 25; 用户指定响应客户端的超时时间。这个超时时间仅限于两个链接活动之间的事件,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接,默认值为60s,可以改为参考值25s Syntax: send_timeout time; Default: send_timeout 60s; Context: http, server, location 参数作用:设置服务器端传送http响应信息到客户端的超时时间,这个超时时间仅仅为两次成功握手后的一个超时,非请求整个响应数据的超时时间,如在这个超时时间内,客户端没有收到任何数据,连接将被关闭。 http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout 一般放在http标签即可

http { sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; server_names_hash_bucket_size 128; server_names_hash_max_size 512; keepalive_timeout 65; client_header_timeout 15s; client_body_timeout 15s; send_timeout 60s; } 配置参数介绍如下:

keeplived_timeout 60;

      1. 设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。

tcp_nodelay on;

        1. 打开tcp_nodelay,在包含了keepalive参数才有效

client_header_timeout 15;

        1. 设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

client_body_timeout 15;

        1. 设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

send_timeout 15;

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

优化服务器域名的bash表大小 哈希表和监听端口关联,每个端口都是最多关联到三张表:确切名字的哈希表,以星号起始的通配符名字的哈希表和以星号结束的统配符名字的哈希表。哈希表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中率失败来找到名字。Nginx首先会搜索确切名字的哈希表,如果没有找到,则搜索以星号起始的通配符名称的哈希表,如果还是没有找到,继续搜索以星号结束的通配符名字的哈希表。 注意.nginx.org存储在通配符名字的哈希表中,而不在明确名字的哈希表中,由于正则表达式是一个个串行测试的,因此该方式也是最慢的,并且不可扩展。

   server {
       listen       80;
       server_name  nginx.org  www.nginx.org *.nginx.org
       location / {
           root   html/www;
           index  index.php index.html index.htm;
       }

server_names_hash_bucket_size size的值,具体信息如下 server_names_hash_bucket_size size 512; 默认是512KB 一般要看系统给出确切的值。这里一般是cpu L1的4-5倍

官方说明:

Syntax: server_names_hash_bucket_size size; Default: server_names_hash_bucket_size 32|64|128; Context: http 参数作用:设置存放域名(server names)的最大哈希表大小。

上传文件大小限制 设置上传文件大小需要在nginx的主配置文件加入如下参数

client_max_body_size 8m; 具体大小根据公司的业务调整,如果不清楚设置为8m即可

Syntax: client_max_body_size size; Default: client_max_body_size 1m; #默认值是1m Context: http, server, location 参数作用:设置最大的允许客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小,此参数对服务端的安全有一定的作用。 http://nginx.org/en/docs/http/ngx_http_core_module.html