写点什么

Nginx 多方面调优策略

作者:乌龟哥哥
  • 2022-10-23
    上海
  • 本文字数:4824 字

    阅读完需:约 16 分钟

Nginx多方面调优策略
shellNginx`作为`web server`热门项目,有着高性能、简单配置以及跨平台,越来越多的企业选择使用它,我们这篇博客来说一下如何优化`Nginx
复制代码

最精简编译安装 Nginx

我们经常安装软件就会发现,有些东西我们并不需要,我们最小安装,等以后需要了再安装扩展就可以,Nginx也是一样的道理


./configure \"--prefix=/App/nginx" \"--with-http_stub_status_module" \"--without-http_auth_basic_module" \"--without-http_autoindex_module" \"--without-http_browser_module" \"--without-http_empty_gif_module" \"--without-http_geo_module" \"--without-http_limit_conn_module" \"--without-http_limit_req_module" \"--without-http_map_module" \"--without-http_memcached_module" \"--without-http_proxy_module" \"--without-http_referer_module" \"--without-http_scgi_module" \"--without-http_split_clients_module" \"--without-http_upstream_ip_hash_module" \"--without-http_upstream_keepalive_module" \"--without-http_upstream_least_conn_module" \"--without-http_userid_module" \"--without-http_uwsgi_module" \"--without-mail_imap_module" \"--without-mail_pop3_module" \"--without-mail_smtp_module" \"--without-poll_module" \"--without-select_module" \"--with-cc-opt='-O2'"
复制代码


大家可以根据业务需要安装模块,关于最后的"--with-cc-opt='-O2'",这个属于GCC的优化,可选的,GCC 提供了多种级别的优化,因为我们打包也有 releasedev包嘛,release包肯定都是最优的。

Nginx 配置文件调优

应用服务器的性能优化主要在合理使用CPU内存磁盘IO网络IO四个方面,现在我们从Nginx配置文件 nginx.conf 入手进行优化:

Nginx 进程数

在不清楚系统其他信息的情况下,这个可以设置为你的 CPU 的核心数、或者是核心数*2,如果ecs不是你买的,你可以执行cat /proc/cpuinfo | grep processor | wc -l来查看核心数


worker_processes 4;
复制代码

Nginx 运行 CPU 亲和力

目前的服务器一般为多核CPU,当并发很大时,服务器各个CPU的使用率可能出现严重不均衡的局面,这时候可以考虑使用CPU绑定,以达到CPU使用率相对均匀的状态,充分发挥多核CPU的优势。


比如 4 核配置:


worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000
复制代码


比如 8 核配置:


worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
复制代码


worker_processes最多开启 8 个,8 个以上性能提升不会再提升了,而且稳定性变得更低,所以 8 个进程够用了。

打开文件数限制

执行 ulimit -n 查看最多打开文件数,与这个一致即可,一般都是 65535


worker_rlimit_nofile 65535;
复制代码

event 配置

events {  use epoll;  worker_connections 65535;  multi_accept on;}
复制代码


  • use


定义了Nginx设置用于复用客户端线程的轮询方法(也可称多路复用网络 IO 模型)。这自然是选择效率更高的优先,Linux 2.6+内核推荐使用epollFreeBSD推荐使用kqueue,安装时Nginx会自动选择。


  • worker_connections


连接数,该参数值不能超过 worker_rlimit_nofile 值,所以建议设置成和 worker_rlimit_nofile 值相等。一般来说是 65535


  • accept_mutex


如果 accept_mutex 指令值为 on 启用,那么将轮流唤醒一个工作进程接收处理新的连接,其余工作进程继续保持睡眠;如果值为 off 关闭,那么将唤醒所有工作进程,由系统通过use指令指定的网络 IO 模型调度决定由哪个工作进程处理,未接收到连接请求的工作进程继续保持睡眠,这就是所谓的“惊群问题”。Web服务器Apache的进程数很多,成百上千也是时有的事,“惊群问题”也尤为明显。Nginx为了稳定,参数值保守的设置为 on 开启状态。可以将其设置成Off 提高性能和吞吐量,但这样也会带来上下文切换增多或者负载升高等等其它资源更多消耗的后果。

隐藏 Nginx 版本

server_tokens off;
复制代码


关闭显示响应头的版本号,防止针对性攻击

Gzip 压缩

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。


Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache 使用的是mod_deflate


一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash 什么的不压缩,这玩意上传就应该处理好,同时也要注意,我们使用gzip的功能是需要消耗CPU的!


gzip on;gzip_min_length 2k;gzip_buffers   4 32k;gzip_comp_level 6;gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
复制代码


  • gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。

  • gzip_buffers:压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果。

  • gzip_comp_level:压缩比例,用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快,9 压缩比最大,传输速度快,但是处理慢,也比较消耗 CPU 资源,一般采用折中。

  • gzip_types:用来指定压缩的类型,Nginx 配置目录 conf 下的 mime.types 文件存放了 Nginx 支持的文件类型,推荐配置:gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript

浏览器缓存

设置 HTTP 应答中的ExpiresCache-Control头标。Expires一般结合Last-Modified使用。当设置了合理的expires配置时,浏览器第一次访问Web页面元素,会下载页面中的的静态文件到本机临时缓存目录下。第二次及之后再次访问相同 URL 时将发送带头标识If-Modified-Since和本地缓存文件时间属性值的请求给服务器,服务器比对服务器本地文件时间属性值,如果未修改,服务器直接返回http 304状态码,浏览器直接调用本地已缓存的文件;如果时间属性值修改了,重新发送新文件。这样就避免了从服务器再次传送文件内容,减小了服务器压力,节省了带宽,同时也提高了用户访问速度,一举三得。指令后接数字加时间单位,即为缓存过期时间;-1 表示永远过期,不缓存。强烈建议添加expires配置,过期时间的选择具体分析。我们公司的部分 Nginx 配置如下:


location ~ .+\.(gif|jpg|jpeg|png|bmp|swf)${    expires 30d;}
location ~ .+\.(js|css|xml|javascript|txt|csv)${ expires 30d;}
复制代码

防盗链

防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:


  • 水印,品牌宣传,你的带宽,服务器足够;

  • 防火墙,直接控制,前提是你知道 IP 来源;

  • 防盗链策略下面的方法是直接给予 404 的错误提示。


这个一般可以在设置CDN的时候配置,自己配置也行


location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {    valid_referers noneblocked www.aoppp.com aoppp.com;    if($invalid_referer) {      return 404;      break;}     access_log off;}
复制代码


  • none:意思是不存在的 Referer 头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)。

  • blocked:意为根据防火墙伪装 Referer 头,如:“Referer:XXXXXXX”。

fastcig 调优

fastcgi_pass localhost:9000; # fastcgi连接fastcgi_connect_timeout 600; # 设置连接超时fastcgi_send_timeout 600; # 传送请求超时时间fastcgi_read_timeout 600; # 接收FastCGI应答的超时时间。fastcgi_buffer_size 64k; # 缓冲区大小fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k; # 建议设置为fastcgi_buffers的两倍,繁忙时候的bufferfastcgi_temp_file_write_size 128k; # 在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGatewayfastcgi_temp_path/usr/local/nginx1.10/nginx_tmp; # 缓存临时目录fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
复制代码


  • fastcgi_buffers:指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为 256KB,那么会分配 4 个 64KB 的缓冲区来缓存,如果页面大小大于 256KB,那么大于 256KB 的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中 php 脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。

  • fastcgi_cache_path:fastcgi_cache缓存目录,可以设置目录层级,比如 1:2 会生成 16*256 个子目录,cache_fastcgi是这个缓存空间的名字,cache是用多少内存(这样热门的内容 nginx 直接放内存,提高访问速度),inactive表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,max_size表示最多用多少硬盘空间。

Nginx 配置模版

user  nginx nginx;worker_processes  auto;
error_log logs/error.log error;
pid logs/nginx.pid;worker_rlimit_nofile 65536;
events{ use epoll; accept_mutex off; worker_connections 65536;}

http{ include mime.types; default_type text/html;
charset UTF-8; server_names_hash_bucket_size 128; client_header_buffer_size 4k; large_client_header_buffers 4 32k; client_max_body_size 8m;
open_file_cache max=65536 inactive=60s; open_file_cache_valid 80s; open_file_cache_min_uses 1;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; server_tokens off;
fastcgi_temp_path /tmp/fastcgi_temp; fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=30m max_size=1g; fastcgi_cache_key $request_method://$host$request_uri; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout http_500 http_503 invalid_header;
keepalive_timeout 60;
gzip on; gzip_min_length 1k; gzip_buffers 4 64k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
server { listen 80; server_name localhost; index index.html; root /App/web;
location ~ .+\.(php|php5)$ { fastcgi_pass unix:/tmp/php.sock; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache cache_fastcgi; }
location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ { expires 30d; }
location ~ .+\.(js|css|html|xml)$ { expires 30d; }
location /nginx-status { stub_status on; allow 192.168.1.0/24; allow 127.0.0.1; deny all; } }}
复制代码


发布于: 2022-10-23阅读数: 32
用户头像

乌龟哥哥

关注

正在努力寻找offer的大四小菜鸟 2021-03-16 加入

擅长 Hbuilder、VS Code、MyEclipse、AppServ、PS 等软件的安装与卸载 精通 Html、CSS、JavaScript、jQuery、Java 等单词的拼写 熟悉 Windows、Linux、 等系统的开关机 看–时间过得多快,不说了,去搬砖了

评论

发布
暂无评论
Nginx多方面调优策略_10 月月更_乌龟哥哥_InfoQ写作社区