Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。 以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务。
假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头, 也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。 为了解决这个问题,出现了Nagle算法。 它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。 通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。
keepalive_timeout 定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数。keepalive_requests 定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000.reset_timeout_connection on 设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接。client_body_timeout 客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10。send_timeout 这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。 如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。单位是秒,可以设置为3。浏览器在发送含有较大HTTP body的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。 这个限制body的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。 例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值, 就直接发送413(Request Entity Too Large)响应给客户端。 将该数值设置为0,则禁用限制,建议设置为10m。
client_header_buffer_size 设置客户端header的buffer大小,建议4k。large_client_header_buffers 对于比较大的header(超过client_header_buffer_size)将会使用该部分buffer,两个数值,第一个是个数,第二个是每个buffer的大小。 建议设置为4 8kopen_file_cache该参数会对以下信息进行缓存: 打开文件描述符的文件大小和修改时间信息; 存在的目录信息; 搜索文件的错误信息(文件不存在无权限读取等信息)。 格式:open_file_cache max=size inactive=time; max设定缓存文件的数量,inactive设定经过多长时间文件没被请求后删除缓存。 建议设置 open_file_cache max=102400 inactive=20s;
open_file_cache_valid 指多长时间检查一次缓存的有效信息。建议设置为30s。open_file_cache_min_usesopen_file_cache指令中的inactive参数时间内文件的最少使用次数, 如,将该参数设置为1,则表示,如果文件在inactive时间内一次都没被使用,它将被移除。 建议设置为2。
对于纯文本的内容,Nginx是可以使用gzip压缩的。使用压缩技术可以减少对带宽的消耗。 由ngx_http_gzip_module模块支持
配置如下: gzip on; //开启gzip功能 gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节 gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小 gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩 gzip_disable “MSIE 6.”; //IE6浏览器不启用压缩
测试: curl -I -H “Accept-Encoding: gzip, deflate” http://www.aminglinux.com/1.css
[root@tanyvlinux ~]# curl -I -H "Accept-Encoding: gzip, deflate" www.aaa.com #把目录里的index.html内容增加到1024B以上; HTTP/1.1 200 OK Server: nginx/1.16.1 Date: Fri, 25 Oct 2019 19:19:23 GMT Content-Type: text/html Last-Modified: Fri, 25 Oct 2019 19:18:00 GMT Connection: keep-alive ETag: W/"5db34a68-2ffc" Content-Encoding: gzip #显示压缩传输;对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器, 在缓存未失效前,客户端不再向服务期请求相同的资源,从而节省带宽和资源消耗。
配置示例如下:
location ~* ^.+\.(gif|jpg|png|css|js)$ { expires 1d; //1d表示1天,也可以用24h表示一天。 }Nginx绝大多数情况下都是作为代理或者负载均衡的角色。 因为前面章节已经介绍过以下参数的含义,在这里只提供对应的配置参数:
http { proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g; ...; server { proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 2 4k; proxy_busy_buffers_size 4k; proxy_temp_path /tmp/nginx_proxy_tmp 1 2; proxy_max_temp_file_size 20M; proxy_temp_file_write_size 8k; location / { proxy_cache my_zone; ...; } } }安装、升级 yum安装or源码安装、编译参数、安装路径等,还要注意,什么时候升级,升级哪些模块等,都要提前对接好;
服务管理 启动脚本、重启、重载、启动用户(yum安装跟编译安装worker进程启动用户不一样,分别是nginx和nobody)
服务脚本(放在/etc/init.d/nginx使用) #!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library . /etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload() { echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart() { stop start } configtest() { $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL配置规范 Log格式、路径、命名规则和切割策略 Pid路径 虚拟主机(默认虚拟主机、虚拟主机独立) ——虚拟主机配置在目录vhost里,在主配置文件nginx.conf做include; 静态文件日志和过期缓存时间 防盗链 更改配置(使用自动化工具更改配置文件)
安全规范 后台地址加用户认证 可写目录禁止解析php 禁止访问.bak文件 (备份的有网站的程序文件,如果被访问就会被下载了)