Nginx 配置文件详解

您所在的位置:网站首页 nginx的配置文件详解 Nginx 配置文件详解

Nginx 配置文件详解

#Nginx 配置文件详解| 来源: 网络整理| 查看: 265

一、 nginx文件结构

...              #全局块

// 设定虚拟主机配置

events {         #events块

   ...

}

http      #http块

{

    ...   #http全局块

    server        #server块

    {

        ...       #server全局块

        location [PATTERN]   #location块

        {

            ...

        }

        location [PATTERN]

        {

            ...

        }

    }

    server

    {

      ...

    }

    ...     #http全局块

}

二、模块

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

5、location块:配置请求的路由,以及各种页面的处理情况。

########### 每个指令必须有分号结束。#################

#user administrator administrators;  #配置用户或者组,默认为nobody nobody。

#worker_processes 1;  #允许生成的进程数,默认为1 ,启动进程,通常设置成和cpu的数量相等    //下面解释

#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址

error_log log/error.log debug;  #全局错误日志,制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

#工作模式及连接数上限

events {

    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on    //下面解释

    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off

    #use epoll;      #事件驱动模型,epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 select|poll|kqueue|epoll|resig|/dev/poll|eventport

    worker_connections  1024;    #单个后台worker process进程的最大并发链接数    //下面解释

}

http {

    include       mime.types; #文件扩展名与文件类型映射表 设定mime类型,类型由mime.type文件定义 include  /etc/nginx/mime.types;

   

    default_type  application/octet-stream; #默认文件类型,默认为text/plain

    #access_log off; #取消服务日志

    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #设定日志格式

    access_log log/access.log myFormat;

    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。 //下面解释

    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。

    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

     

    #开启gzip压缩输出

    gzip  on;    /·····     

        #设定负载均衡的服务器列表

    upstream mysvr {

          #weigth参数表示权值,权值越高被分配到的几率越大

      server 127.0.0.1:7878;

      server 192.168.10.121:3333 backup;  #热备

    }

     # 定义错误提示页面

  error_page  500 502 503 504 /50x.html;

    location = /50x.html {

         root  html;

    }

     #设定虚拟主机配置

    server {

        keepalive_requests 120; #单连接请求上限次数。

        listen       80;   #监听端口

        server_name  127.0.0.1;   # 定义使用 127.0.0.1.访问,如果是域名,则使用该域名访问 www.nginx.cn

        #charset koi8-r; #编码格式,若网页格式与此不同,将被自动转码

        location   / {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。

           root path;  #根目录,定义服务器的默认网站根目录位置 ,可相对也可绝对路径

               index index.php index.html index.htm;  # 首页文件。以下按顺序匹配

           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表

           deny 127.0.0.1;  #拒绝的ip

           allow 172.18.5.54; #允许的ip

        }

#静态文件,nginx自己处理

  location ~ ^/(images|javascript|js|css|flash|media|static)/ {

      root /var/www/virtual/htdocs;

      #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。

      expires 30d;

  }

  #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

  location ~ \.php$ {

      root /root;

      fastcgi_pass 127.0.0.1:9000;

      fastcgi_index index.php;

      fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;

      include fastcgi_params;

  }

  #设定查看Nginx状态的地址

  location /NginxStatus {

      stub_status      on;

      access_log       on;

      auth_basic       "NginxStatus";

      auth_basic_user_file conf/htpasswd;

  }

  #禁止访问 .htxxx 文件

  location ~ /\.ht {

       deny all;

  }

    }

}

解释:

1、accept_mutex的意义:

     当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」。

假设你养了一百只小鸡,现在你有一粒粮食,那么有两种喂食方法:

- 你把这粒粮食直接扔到小鸡中间,一百只小鸡一起上来抢,最终只有一只小鸡能得手,其它九十九只小鸡只能铩羽而归。这就相当于关闭了accept_mutex。

- 你主动抓一只小鸡过来,把这粒粮食塞到它嘴里,其它九十九只小鸡对此浑然不知,该睡觉睡觉。这就相当于激活了accept_mutex。

2、worker_connections 

       # 并发总数是 worker_processes 和 worker_connections 的乘积

    # 即 max_clients = worker_processes * worker_connections

    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么

    # 为什么上面反向代理要除以4,应该说是一个经验值

    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000

    # worker_connections 值的设置跟物理内存大小有关

    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数

    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右

    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:

    # $ cat /proc/sys/fs/file-max

    # 输出 34336

    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内

    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置

    # 使得并发总数小于操作系统可以打开的最大文件数目

    # 其实质也就是根据主机的物理CPU和内存进行配置

    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

    # ulimit -SHn 65535

3、sendfile on

          

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,

    #对于普通应用,必须设为 on,

    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,

    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.

4、gzip

     #gzip模块设置

    #开启gzip压缩输出

    gzip on;

    #最小压缩文件大小

    gzip_min_length 1k;

    #压缩缓冲区

    gzip_buffers 4 16k;

    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

    gzip_http_version 1.0;

    #压缩等级 1-9 等级越高,压缩效果越好,节约宽带,但CPU消耗大

    gzip_comp_level 2;

    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

    gzip_types text/plain application/x-javascript text/css application/xml;

    #前端缓存服务器缓存经过压缩的页面

     gzip_vary on;

三、上面是nginx的基本配置,需要注意的有以下几点:

     

1、1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

2.$remote_user :用来记录客户端用户名称;

3.$time_local : 用来记录访问时间与时区;

4.$request : 用来记录请求的url与http协议;

5.$status : 用来记录请求状态;成功是200;

6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;

7.$http_referer :用来记录从那个页面链接访问过来的;

8.$http_user_agent :记录客户端浏览器的相关信息;

9、惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。

10、每个指令必须有分号结束。

四、worker_processes

     

nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu,cpu是任务处理,当计算最费时的资源的时候,cpu核使用上的越多,性能就越好。

2核cpu,开启2个进程

worker_processes 2; worker_cpu_affinity 01 10;

  解释:01表示启用第一个CPU内核,10表示启用第二个CPU内核

worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。

4核cpu,开启2个进程

     worker_processes 2; worker_cpu_affinity 0101 1010;

  解释:0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核;2个进程对应着四个内核;worker_cpu_affinity配置是写在/etc/nginx/nginx.conf里面的;2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,0表示该内核开启,1表示该内核关闭。

8核cpu,开启8个进程

     worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

      解释:0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推;worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。

yum -y install httpd-tools

ab -n10 -c 10 http://139.199.121.180/

配置完之后可以重启nginx,用ab工具可以进行性能测试,在服务器上执行top,然后按1,就可以看到cpu工作情况,如果多个cpu内核的利用率差不多,就证明nginx已经成功利用了多核cpu,测试结束后,cpu内核的负载都同时降低。

/proc/cpuinfo

查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

查看物理CPU个数   cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

查看每个物理CPU中core的个数(即核数)  cat /proc/cpuinfo| grep "cpu cores"| uniq 

查看逻辑CPU的个数  cat /proc/cpuinfo| grep "processor"| wc -l

交流

共同进阶学习

    



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3