NGINX优化

main # 全局配置,对全局生效

├── events  # 配置影响 Nginx 服务器或与用户的网络连接

├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置

│  ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分

│  ├── server  # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块

│  ├── server

│  │  ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri

│  │  ├── location

│  │  └── ...

│  └── ...

└── ...

error_log   /var/log/nginx/error.log  debug;

nginx的错误级别分为:debug | info | notice | warn | error | crit | alert | emerg。从左到右,级别从低到高。我们其他的各种编译器输出日志的逻辑差不多。级别越低输出的错误日志就会越多。生产环境建议跳转到warn及以上。否则会有大量的IO请求,耗费系统资源

proxy_buffering主要是实现被代理服务器的数据和客户端的请求异步

server{

    listen 80;    

    server_name www.aminglinux.com;    

    proxy_buffering on;

    proxy_buffer_size 4k;

    proxy_buffers 2 4k;

    proxy_busy_buffers_size 4k;

    proxy_temp_path /tmp/nginx_proxy_tmp12;

    proxy_max_temp_file_size 20M;

    proxy_temp_file_write_size 8k;

}

proxy_buffering on;该参数设置是否开启proxy的buffer功能,参数的值为on或者off。如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

proxy_buffer_size 4k;该参数用来设置一个特殊的buffer大小的。从被代理服务器(C)上获取到的第一部分响应数据内容到代理服务器(B)上,通常是header,就存到了这个buffer中。 如果该参数设置太小,会出现502错误码,这是因为这部分buffer不够存储header信息。建议设置为4k。

proxy_buffers8 4k;这个参数设置存储被代理服务器上的数据所占用的buffer的个数和每个buffer的大小。所有buffer的大小为这两个数字的乘积。

proxy_busy_buffer_size 16k;在所有的buffer里,我们需要规定一部分buffer把自己存的数据传给A,这部分buffer就叫做busy_buffer。proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。对于B上buffer里的数据何时传输给A,我个人的理解是这样的:1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给A;2)如果完整数据大小不少于busy_buffer大小,则装满busy_buffer后,马上传给A;

proxy_temp_path语法:proxy_temp_path path [level1 level2 level3]定义proxy的临时文件存在目录以及目录的层级。例:proxy_temp_path/usr/local/nginx/proxy_temp12;

其中/usr/local/nginx/proxy_temp为临时文件所在目录,1表示层级1的目录名为1个数字(0-9),2表示层级2目录名为2个数字(00-99)

proxy_max_temp_file_size设置临时文件的总大小,例如 proxy_max_temp_file_size 100M;7. proxy_temp_file_wirte_size设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。


1.worker_processes 工作进程(全局)(应该设置为服务器 CPU 的核数)

Nginx 有 master 和 worker 两种进程,master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务

worker_processes  auto;// 自动获取

worker_processes  1; //默认

grep -c processor /proc/cpuinfo //查看CPU核数

worker_processes 2; # 2核CPU的配置

worker_cpu_affinity 01 10;

worker_processes  4;        # 4核CPU的配置

worker_cpu_affinity 0001 0010 0100 1000; 

worker_processes  8;        # 8核CPU的配置

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000

2. worker_connections 最大连接数(events)(控制在3w左右)

进程的最大连接数受 Linux 系统进程打开的最大文件数的限制,只有执行了 “ulimit -HSn 65535” 之后,worker_connections 才能生效。

Nginx 总并发连接数 = worker_processes * worker_connections

events {

    worker_connections  15000;

}

worker_rlimit_nofile 65535; # worker 进程打开的最大文件数,可设置为优化后的 ulimit -HSn 的结果

3.sendfile  高效文件传输模式(http)

实际上是激活了 sendfile () 作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 “零拷贝” 。

sendfile 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作。

tcp_nopush 参数可以把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量。

tcp_nodelay:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I/O 性能,但是,在每次只发送很少字节的业务场景中,使用 tcp_nodelay 功能,等待时间会比较长

http {

      include      mime.types;

      default_type  application/octet-stream;

      sendfile      on;    # 开启文件的高效传输模式

      tcp_nopush    on;    # 激活 TCP_CORK socket (与sendfile 一起使用),

      tcp_nodelay  on;    # 数据在传输的过程中不进缓存

      keepalive_timeout  65;    #用于设置客户端连接保持会话的超时时间

      client_max_body_size 8m;    # 设置客户端最大的请求主体大小为8M

      client_header_timeout 15;    #用于设置读取客户端请求头数据的超时时间,超时报错 Request time out (408)

       client_body_timeout 15;    #用于设置读取客户端请求身体数据的超时时间,超时报错 Request time out (408)

       send_timeout 25    #用于指定响应客户端的超时时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接

       include vhosts/*.conf;

}

4.gzip 压缩(http)

Nginx gzip 压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx 服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。

另外,压缩的对象必须大于 1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。

http {

    gzip  on;                    # 开启压缩功能

    gzip_min_length  1k;        # 允许压缩的对象的最小字节

    gzip_buffers  4 32k;        # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存

    gzip_http_version  1.1;      # 压缩版本,用于设置识别HTTP协议版本

    gzip_comp_level  9;          # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢

    gzip_types  text/plain application/x-javascript text/css application/xml;    # 允许压缩的媒体类型

    gzip_vary  on;      # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据

}

5.配置 expires 缓存期限(server)

不希望被缓存的内容:广告图片、网站流量统计工具、更新很频繁的文件。

缓存期限参考:新浪缓存 15 天,京东缓存 25 年,淘宝缓存 10 年。

server {

    listen      80;

    server_name  www.abc.com abc.com;

    root    html/www;

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$    # 缓存的对象

    {

        expires 3650d;    # 缓存期限为 10 年

    }

}

6.配置防盗链(location)

简单地说,就是其它网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,使得被盗链的那一端消耗带宽资源 。

通过 HTTP referer 实现防盗链。

#第一种,匹配后缀

location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ {    # 指定需要使用防盗链的媒体资源

    access_log  off;                                              # 不记录日志

    expires  15d;                                                # 设置缓存时间

  valid_referers  none  blocked  *.test.com  *.abc.com;        # 表示仅允许这些域名访问上面的媒体资源

    if ($invalid_referer) {                                      # 如果域名不是上面指定的地址就返回403

      return 403

    }

}

#第二种,绑定目录

location /images { 

    root /web/www/img;

    vaild_referers none blocked *.spdir.com *.spdir.top;

    if ($invalid_referer) {

        return 403;

    }

}

7.代码块 http(1) -> (n)server(1) -> (n)location

listen 虚拟主机监听的端口

server_name 虚拟主机的域名或 IP 地址,可以配置多个(用空格隔开)

root 虚拟主机的根目录

index 虚拟主机的首页,也可以用 location 代码块来配置

access_log 虚拟主机的访问日志

error_log 虚拟主机的错误日志

error_page 错误页面

server {

    listen      80;

    server_name  localhost;

    root  "D:/phpStudy/WWW";

    location / {

      index  index.html index.htm index.php l.php;

      autoindex  off;

    }

    location = /50x.html {

        root  html;

    }

    location ~ \.php(.*)$  {

        fastcgi_pass  127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        fastcgi_param  PATH_INFO  $fastcgi_path_info;

        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;

        include        fastcgi_params;

    }

}

8.location 的语法格式

location [ = | ~ | ~* | ^~ | @] uri {...}

其中, = | ~ | ~* | ^~ | @ 表示前缀,也叫修饰符,是可选的;uri 表示普通字符串或正则表达式,是必须的。

@ 这个修饰符非常特殊,后面跟一个普通字符串,用于定义特殊的类型,被定义的类型只能被 nginx 内部调用,用于内部的重定向。这个重定向纯碎是 nginx 内部的一个转发行为。

= 字符串完整匹配。

~ 区分大小写的正则匹配。

~* 不区分大小写的正则匹配。

^~ 字符串前缀匹配,只要匹配到了,就不会再匹配其他的正则 location。

如果没有任何修饰符,也表示字符串前缀匹配,即字符串 location。

如果 location 中使用了修饰符~或者~*,那么,这个 location 就是正则 location;否则,就是字符串 location。


= 修饰符的优先级最高,表示完整匹配。如果匹配成功,则停止匹配其他 location。

字符串 location 的优先级第二;多个字符串 location 的匹配顺序为从长到短,也就是说优先选择长度最长的字符串匹配;匹配成功的字符串 location 如果使用了修饰符 ^~ 或者正好是精准匹配,则不会再去检验正则 location。

正则 location 的优先级低于字符串 location;多个 正则 location 会按照配置文件里的位置顺序进行匹配,如果匹配成功,就停止匹配。

location = /string 字符串完整匹配,优先级最高。

location ^~ /string 字符串前缀匹配(不检测正则 location)。

location ~ pattern 正则匹配(区分大小写)。

location ~* pattern 正则匹配(不区分大小写)。

location /string 不带修饰符的字符串前缀匹配。

location / 默认匹配,如果一个请求没有匹配到其他的 location,就会匹配默认匹配。它相当于 switch 中的 default

9.全局变量

$args #这个变量等于请求行中的参数。

$content_length #请求头中的 Content-length 字段。

$content_type #请求头中的 Content-Type 字段。

$document_root #当前请求在 root 指令中指定的值。

$host #请求主机头字段,否则为服务器名称。

$http_user_agent #客户端 agent 信息

$http_cookie #客户端 cookie 信息

$limit_rate #这个变量可以限制连接速率。

$request_body_file #客户端请求主体信息的临时文件名。

$request_method #客户端请求的动作,通常为 GET 或 POST。

$remote_addr #客户端的 IP 地址。

$remote_port #客户端的端口。

$remote_user #已经经过 Auth Basic Module 验证的用户名。

$request_filename #当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。

$query_string #与 $args 相同。

$scheme #HTTP 方法(如 http,https)。

$server_protocol #请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1。

$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name #服务器名称。

$server_port #请求到达服务器的端口号。

$request_uri #包含请求参数的原始 URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri #不带请求参数的当前 URI,$uri 不包含主机名,如”/foo/bar.html”。

$document_uri #与 $uri 相同。


刷新404的问题解决

http {

    server {

        location / {

          root /usr/share/nginx/html/main;

          index index.html;

          add_header Access-Control-Allow-Origin *;

          if ( $request_uri ~* ^.+.(js|css|jpg|png|gif|tif|dpg|jpeg|eot|svg|ttf|woff|json|mp4|rmvb|rm|wmv|avi|3gp)$ ){

              add_header Cache-Control max-age=7776000;

              add_header Access-Control-Allow-Origin *;

          }

          try_files $uri $uri/ /index.html;

        }

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • client_body_buffer_size 1m; //请求体缓冲区大小(post大的要设置)client_m...
    SkTj阅读 457评论 0 6
  • 1、基本安全优化1.1隐藏版本信息一般来说,软件的漏洞都和版本相关,所以我们要隐藏或消除web服务对访问用户显示的...
    Joening阅读 775评论 0 7
  • nginx优化思路 安全优化 1.隐藏nginx版本信息优化 修改nginx配置文件实现优化 2.修改nginx版...
    七两三_e13f阅读 717评论 0 1
  • Nginx优化详解-------超详细 一、一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. w...
    name_cc2f阅读 626评论 0 1
  • 引言 Nginx的优化其实有很多,阿里系的Tengine其实就是优化过的nginx。 本文接着上文继续关注Ngin...
    OzanShareing阅读 280评论 0 5