Nginx多方面调优策略

2020-07-21 10:42:37 浏览数 (1)

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

最精简编译安装Nginx

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

代码语言:javascript复制
./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来查看核心数

代码语言:javascript复制
worker_processes 4;

Nginx运行CPU亲和力

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

比如4核配置:

代码语言:javascript复制
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000

比如8核配置:

代码语言:javascript复制
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;

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

打开文件数限制

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

代码语言:javascript复制
worker_rlimit_nofile 65535;

event配置

代码语言:javascript复制
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版本

代码语言:javascript复制
server_tokens off;

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

Gzip压缩

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

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

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

代码语言:javascript复制
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配置如下:

代码语言:javascript复制
location ~ . .(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 30d;
}

location ~ . .(js|css|xml|javascript|txt|csv)$
{
    expires 30d;
}

防盗链

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

  • 水印,品牌宣传,你的带宽,服务器足够;
  • 防火墙,直接控制,前提是你知道IP来源;
  • 防盗链策略下面的方法是直接给予404的错误提示。

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

代码语言:javascript复制
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调优

代码语言:javascript复制
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的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k; # 在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway
fastcgi_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配置模版

代码语言:javascript复制
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;
        }
    }
}

希望大家配置出适合自己项目的最优Nginx,博客借鉴于: http://www.ttlsa.com/nginx/web-server-nginx-optimization/

0 人点赞