资讯专栏INFORMATION COLUMN

Nginx优化

IT那活儿 / 2029人阅读
Nginx优化
点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!



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





系统参数优化


1. ulimit优化
ulimit约束了系统最大打开的文件数量,可通过以下方式修改:
系统打开文件限制参数nofile以及系统打开进程数的限制参数nproc,建议两者都设置为65535。(使用ulimit -a验证)
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* 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那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129618.html

相关文章

  • 11 个 Nginx 参数性能优化工作

    摘要:配置如下指令是设定的工作模式及连接数上限。指令用来指定的工作模式。该参数默认是,建议开启。配置进程的最大打开文件数调整配置进程的最大打开文件数,这个控制连接数的参数为。但副作用是资源更新可能无法及时。 工作上,需要配置 Nginx,要投入生产使用,做了一点优化工作,加上以前也经常折腾 Nginx,故记下一些优化工作。 优化 Nginx 进程数量 配置参数如下: worker_proce...

    zebrayoung 评论0 收藏0
  • 高并发场景中nginx优化方案

    摘要:本文主要从以下几点讲解如何优化,以增强高并场景中的吞吐量。系统可通过命令查看核数,假如为,则指单个进程能并发处理的最大连接数,包含了所有的链接不仅仅来源于客户端,默认值是,在一些瞬间并发量较高的场景中,这个值是远远不够用的。 本文主要从以下几点讲解如何优化Nginx,以增强高并场景中Nginx的吞吐量。 调整worker_processes和worker_connections参数 ...

    EsgynChina 评论0 收藏0
  • 前端性能优化与上线

    摘要:看下状态可以看到我已经有一些镜像了我已经删除了拉镜像正常即可,中间那段是中国镜像源,我们成功下来了的镜像。攻破像我这样屌丝的服务器一般都买的,大的资源文件不住,一个动辄的文件这很蛋疼,不上很难受。 4000字长文,多图预警!!!流量慎入!! 性能优化 - 屌丝前端性能优化、上线一条龙 大家好我又来了,本章给大家带来的内容是:上线和上线后的性能优化 项目地址 实战预览地址 实战项目地址...

    wupengyu 评论0 收藏0
  • nginx网站性能优化篇(4)】理解nginx的高并发原理及其配置调优

    摘要:使用了多路复用技术的,就成了并发事件驱动的服务器。进程主要负责收集分发请求。同时进程也负责监控的状态,保证高可靠性进程一般设置为跟核心数一致。所以才使得支持更高的并发。配置调优调整指要生成的数量最佳实践是每个运行个工作进程。 Nginx 是如何实现高并发的? Nginx 采用的是多进程(单线程) & 多路IO复用模型。使用了 I/O 多路复用技术的 Nginx,就成了并发事件驱动的服务...

    CODING 评论0 收藏0
  • Oracle APEX 系列文章5:在阿里云上打造属于你自己的APEX完整开发环境 (进一步优化)

    摘要:优化删除自带的不必要的文件是有必要的,最大限度保证系统安全。所以我们要对进行必要的修改,让等待数据库启动完毕再启动。 showImg(https://segmentfault.com/img/remote/1460000014711637?w=1010&h=276); 本文是钢哥的Oracle APEX系列文章中的第五篇,完整 Oracle APEX 系列文章如下: Oracle A...

    NervosNetwork 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<