Nginx优化
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 #整个请求的总时间
其他变量:
- $host #存放请求报文中的主机部分 例:https://list.jd.com/list.html?cat=4938,11760,14408(值为标红部分)
- $request_uri #存放请求的URI地址,并且带有请求指令 例:https://list.jd.com/list.html?cat=4938,11760,14408(值为标红部分)
- $scheme #存放客户端请求使用的协议,如http,https 例:https://list.jd.com/list.html?cat=4938,11760,14408(值为标红部分)
- $document_uri #存放请求报文中的当前URI,并且不包括请求指令 例:https://list.jd.com/list.html?cat=4938,11760,14408(值为标红部分)
- $server_addr #存放服务器地址
- $remote_addr #存放客户端地址
- $server_name #存放了客户端请求到达的服务器的名称
- $request_filename #存放当前请求的资源文件的路径名
- $args #存放URL中的请求指令 例:https://list.jd.com/list.html?cat=4938,11760,14408(值为标红部分)
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那活儿(上海新炬王翦团队)
