Nginx优化

AI 摘要 / TL;DR

Nginx优化 来源: https://www.ucloud.cn/yun/129618.html 作者: IT那活儿 发布日期: 发布于2023 01 11 13:20 Nginx优化 点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!! nginx常作为反向代理或负载均衡服务,前端业务数据缓

来源: https://www.ucloud.cn/yun/129618.html 作者: IT那活儿 发布日期: 发布于2023-01-11 13:20

Nginx优化

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!

nginx常作为反向代理或负载均衡服务,前端业务数据缓存服务,提高静态资源的高并发并利用反向代理加速。在此前提下,一般来说nginx的优化一般有本文中阐述的几项。

系统参数优化

1. ulimit优化

ulimit约束了系统最大打开的文件数量,可通过以下方式修改:

系统打开文件限制参数nofile以及系统打开进程数的限制参数nproc,建议两者都设置为65535。(使用ulimit -a验证)

echo "* soft nofile 65535" >> /etc/security/limits.confecho "* hard nofile 65535" >> /etc/security/limits.confecho "* soft nproc 65535" >> /etc/security/limits.confecho "* hard nproc 65535" >> /etc/security/limits.conf

2. 内核参数优化

将以下内核参数加入/etc/sysctl.conf文件中,执行sysctl -p使之生效。

nginx配置优化

1. 配置文件结构

1)全局配置 2)事件驱动模型配置 events {     ...........     ........... } 3)http服务相关配置 http {     http服务全局配置     server { //虚拟主机     location { //匹配客户端访问请求,根据不同的请求做不同的响应         }     } }

2. 全局配置

1)启动工作进程的数量,worker_processes  1;

(CPU密集型:如SSl及压缩应用,worker数量建议与CPU数量一致)

(IO密集型:如响应大量给客户,worker进程个数为CPU数量的两倍)

2)指定错误日志存放位置及日志级别 error_log  logs/error.log warn;

3)指定pid文件记录nginx的主进程号 pid  logs/nginx.pid;

4)指定此进程打开的最大文件描述符的值 worker_rlimit_nofile 65535;

5)每个工作进程的核心文件的最大大小 worker_rlimit_core

6)将worker与CPU绑定,worker_proceses  4;

worker_cpu_affinity 0001 0010 0100 1000。

(该示例表示分别给每个worker进程绑定一个CPU)

3. 事件驱动模型配置

1)指定epoll事件模型 use epoll;

2)每个工作进程能接受最大的客户端的连接数,提高并发连接 worker_connections 10240。

4. http服务相关配置

1)include   mime.types; #文件扩展名与文件类型映射表;

2)default_type  application/octet-stream; #默认文件类型,默认为text/plain;

3)定义访问日志格式。

log_format  main $remote_addr $remote_user [$time_local] "$request"                 $status $body_bytes_sent "$http_referer"                  "$http_user_agent" "$http_x_forwarded_for" "$http_cookie" "$request_time" "$upstream_response_time" "$upstream_addr" "$upstream_status";
  • $remote_addr #客户端IP地址
  • $remote_user #客户端用户
  • $time_local #访问时间
  • $request #访问请求(请求方法   文件名称    HTTP协议版本)
  • $status #状态码
  • $body_bytes_sent #响应数据大小
  • $http_referer #超链接地址
  • $http_user_agent #浏览器类型
  • $http_x_forwarded_for #客户真实IP
  • $http_cookie #获取cookie信息
  • $upstream_addr #后台upstream的地址,即真正提供服务的主机地址
  • $upstream_response_time   #请求过程中,upstream响应时间
  • $request_time   #整个请求的总时间

其他变量:

4)访问日志的存放位置

access_log  logs/access.log  main;

5)客户端上传文件大小限制

client_max_body_size 100m;

6)指定来自客户端请求头的headerbuffer大小

client_header_buffer_size 32K;

#大多数请求1K的缓冲区即可,如果cookie较大可增加缓冲区大小。

7)指定客户端请求中较大的消息头的缓存最大数量和大小

large_client_header_ buffers 4 32K;

4为个数,32K为大小,最大缓存为量为4个32K。

8)开启sendfile机制

sendfile on;

#该机制由内核直接将内容复制到nginx进程对应的内容,节省文件拷贝的时间。

9)#tcp_nopush  on;

#仅在使用sendfile时开启,响应头和正文的开始部分一同发送。

10)#tcp_nodelay  on;

#只在长连接中启用,用于减缓网络堵塞,但及建议不要与tcp_nopush同时使用。

11)每条长连接的超时时间

keepalive_timeout  65;

12)限制长连接所能发送的最大请求数

keepalive_requests 100;

13)限制请求体的大小

client_max_body_size 100m;

#若超过所设定的大小,返回413错误。

14)gzip压缩模块

  • gzip  on; #开启压缩模块
  • gzip_min_length 4K; #允许压缩的页面最小字节数,默认值为0(建议设置大于1K,小于1K可能越压越大)
  • gzip_buffers 4 16K; #用于处理请求压缩的缓冲区数量和大小,申请4个16K的内存作为数据流缓冲
  • gzip_http_version 1.1; #用于设置识别http协议版本,默认为1.1
  • gzip_comp_level 2; #用来指定压缩比,1压缩比最小处理速度最快,9压缩比最大,传输速度快,处理慢,同时较耗费CPU资源

15)对请求进行限速

limit_req_zone zone=one:10m rate=5r/s; #表示一个内存区域大小为10m,并且设定了名称为one,且请求的速率是1秒5个请求。

16)定义缓存空间

proxy_cache_path /nginx/cache/first  levels-2:1:2 keys_zone=first:20m max_size=1G;

levels-2:1:2 #定义缓存目录子目录的级别,以及每个子目录的名称字符个数;最多只能有三级子目录;

3级子目录,第1级目录字符个数为1,第2级目录字符个数为2,第3级目录字符个数为2,字符个数最多只能有2个;

/nginx/cache/first #在磁盘产生的目录存储缓存数据;

max_size=1G #指定/nginx/cache/first中的1G空间用于存储缓存数据。

5. server虚拟主机

1)监听端口 listen   80;

2)设置虚拟主机名称 server_name  localhost。

6. location块

1)自动索引模块HttpAutoindex

autoindex on; #当网页目录中没有index.html文件,该目录以下载网站的方式展现;

2)限制模块HttpLimit zone

该模块可以针对条件,进行会话的并发连接数控制。(例如:限制每个IP的并发连接数。)

http { limit_zone   one $binary_remote_addr  10m; server { location /download/ {      limit_conn   one 1; }

限制的区域名是one,容量是10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。

$remote_addr 的长度为 7 至 15 bytes,会话信息的长度为 32 或 64 bytes;

而 $binary_remote_addr 的长度为 4 bytes,会话信息的长度为 32 bytes。

当区的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用 32 bytes)。

3)HttpLimitReqest模块

该模块可限制给定会话的请求数。

http { limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;    server {        location /search/ {            limit_req   zone=one burst=5; #允许用户平均每秒不超过1个请求,突发不超过5个查询        }    }}

4)StubStatus模块

该模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在编译的时候手动添加编译参数--with-http_stub_status_module。

location /status {        stub_status on; #开启该模块        access_log off;        allow ***.***.230.1; #允许访问的ip地址        deny all; #拒绝所有ip地址访问}

5)proxy模块

  • proxy_pass http://itower;
  • proxy_redirect default; #默认配置为default,建议默认即可;如果设置off,则将禁止所有的proxy_redirect指令;
  • proxy_buffering off;
  • proxy_connect_timeout 600; #向后端服务器等待建立连接的超时时间; 单位s;
  • proxy_set_header Host $host:$server_port;
  • proxy_send_timeout 600; #向后端服务器发送write请求时等待的超时时间; 单位s;
  • proxy_read_timeout 600; #向后端服务器发送read请求时等待的超时时间; 单位s;
  • proxy_buffer_size 8k; #用于配置接收一次后端服务器的响应数据的proxy buffer的个数和每个buffer的大小;
  • proxy_cache first; #开启缓存,结合http块中的proxy_cache_path使用;
  • proxy_cache_vaild 200 1m; #表示为状态码为200的数据缓存1分钟,结合http块中的proxy_cache_path使用。

本文作者:刘娜

本文来源:IT那活儿(上海新炬王翦团队)