一. nginx.conf 文件结构概述

  在第一篇中讲到nginx的安装,安装完后,默认的nginx服务器配置文件都存在安装目录conf中,主配置文件名为nginx.conf。下面是我linux系统安装nginx的目录信息:

    [root@xuegod64 nginx]# pwd
/usr/local/nginx
[root@xuegod64 nginx]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp

  下面将说明nginx.conf原始文件中,各条语句的生效范围,对指令作用域有一个初步的了解。在nginx.conf文件结构中,最外层的花括号将内容整体分为两部分(event、http)。nginx.conf一共由三部分组成,分别为全局块、events块、http块。 在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌入的配置块,各个之间不存在次序关系。

  配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一块的。同一个指令放在不同层级的块中,其作用域也不同。一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。 如果某个指令在两个不同层级的块中同时出现,则采用"就近原则,即以较低层级的块中的配置为准。

  下面是一个nginx.conf简单的配置示例:

#user  nobody;
user nginx nginx;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid;
#以上是全局块 events {
worker_connections ;
}
#以上是events块 #最后是http块,里面包括location块
http {
include mime.types;
default_type application/octet-stream; #access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout ;
keepalive_timeout ; #gzip on; server {
listen ;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / {
root html;
index index.html index.htm;
if ($request_uri ~* \.html$) {
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.aspx$){
proxy_pass http://aspxservers;
}
proxy_pass http://picservers;
} #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
}
} upstream htmlservers{
server 192.168.2.50:;
server 192.168.2.51:;
}
upstream aspxservers{
server 192.168.2.50:;
server 192.168.2.51:;
}
upstream picservers{
server 192.168.2.50:;
server 192.168.2.51:;
}
}

  1. 全局块

    全局块是默认配置文件从开始到events块之间的一部份内容,主要设置一些影响nginx服务器整体运行的配置指令,因此这些指令作用域是nginx服务器全局。通常包括配置运行nginx服务器的用户(组),允许生成的worker process数、nginx进程pid存放路径、日志的存放路径和类型以及配置文件引入等。

  2. events块

    events块涉及的指令主要影响nginx服务器与用户的网络连接,常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数。这一块对nginx服务器的性能影响较大,应该根据实际情况灵活调整。

  3. http块

    http块是nginx服务器配置中重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。可以在http全局块中配置的指令包括文件引入、mime-type定义、日志自定义、是否使用sendfile转输文件、连接超时时间、单连接请求数上限等。

  4.server块

    每个server块就是一个虚拟主机,是配置虚拟主机的相关参数,一个http中可以有多个server。server块和"虚拟主机"的概述有密切联系,虚拟主机又称虚拟服务器或虚拟机。例如使用VMware来虚拟一个主机。对外表现为多个服务器。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。前面提过每一个http块可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。

    和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块,在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或ip配置。

  5.  location块

    用于配置请求的路由,以及各种页面的处理情况。每个server块中可以包含多个location块,location是server块的一个指令,由于在整个nginx配置中起着重要的作用,而且许多功能上灵活性往往在location指令的配置中体现出来,所以单独列为一个"块"。  这些location块的主要作用是,基于nginx服务器接收到的请求字符串(例如:server_name  或 url_string),对除虚拟主机名称(或ip) 之外的字符串如url_stirng进行匹配,对特定的请求进行处理。地址定向、数据缓存、和应答控制等功能都是在这部分实现,许多第三方模块的配置也是在location块中提供功能。

二.  全局块指令配置

  2.1 运行Nginx服务器用户(组)  user指令

    该指令配置属于全局块,在文件的第一行,默认是user nobody。该user指令的语法格式为:

        user  用户  [用户组];

    用户:是指定可以运行nginx服务器的用户。用户组:是可选项,指定可以运行nginx服务器的用户组。只有被设置的用户或者用户组成员才有权限启动nginx进程。如果希望所有用户可以启动Nginx进程,可以注释掉user指令。下面是user指令,指定nginx用户和nginx用户组。第一行#表示已注释,不生效。

    #user  nobody;
user nginx nginx;

    在nginx.conf配置文件中,每一条指令配置都必须以分号结束。

  2.2 允许生成的工作进程数 worker_processes指令

    worker process是nginx服务器实现并发处理服务(网站)的关键所在。理念上讲,值越大,可以支持的并发处理量也越多。但实现受限于软件本身、操作系统资源。一般建议启动的工作进程数,通常设置成和cpu核数相等。该worker process指令的语法格式为:

       worker_processes number | auto;

    number:指定nginx进程最多可以产生的进程数。auto:自动检测。下面是worker_processes指令,指定一个进程数:

    worker_processes  ;

    当启动nginx服务器后,可以查看nginx服务器除了主进程master process之处,还生成了一个worker process:

    [root@xuegod64 nginx]# ps -ef | grep nginx
root 1月03 ? :: nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf
nginx 1月03 ? :: nginx: worker process
root : pts/ :: grep --color=auto nginx

  

   2.3 nginx进程存放路径 PID指令  

    nginx进程作为系统的守护进程运行,需要在某文件中保存当前运行程序的主进程号。nginx支持对它的存放路径进行自定义配置。该pid指令语法格式为:

        pid    file;

    file:指定存放路径和文件名称。配置文件默认将此文件存放在nginx安装目录logs下,名字为nginx.pid。file可以是相对路径,注意file除了路径一定要指定文件名。下面是pid指令的配置路径存放于安装目录logs文件夹下:

    pid   logs/nginx.pid;

    

  2.4 错误日志的存放路径 error_log指令

    在全局块、http块、server块都可以对nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,另二块配置基本相同,只是作用域不同。该error_log指令语法格式为:

        error_log file | level [debug | info |notice |warn | error| crit | alert| emerg];

    nginx服务器日志支持输出到某一固定的文件file 以及level日志级别。日志的级别是可选项,由低到高,级别越高记录的信息越少, 比如设置了warn级别后,级别为warn、error、crit、alert、emerg的日志都会被记录下来。生产场景一般是 warn | error | crit 这三个级别之一。下面看一个配置实例,也是nginx默认的日志存放路径和默认日志级别设置:

    error_log  logs/error.log  error;

    注意指定的文件对于运行nginx进程的用户具有写权限,否则在启动ningx进程时会报错(/nginx/logs/error.log permission denied)。

  

三. events块指令配置 

  3.1  最大连接数worker_connections指令

    该指令用来设置允许每一个worker process同时开启的最大连接数。number默认值是1024。这个number不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。该worker_connections指令语法格式为:

      worker_connections number;

  3.2 事件驱动模型 use指令

    nginx服务器提供了多种事件驱动模型来处理网络消息,可以使用user指令来指定某一事件驱动模型。后面再详细介绍。 user指令语法结构为:

      use  select | poll | kqueue | epoll | rtsig | /dev/poll | eventport;

  3.3 是否允许同时接收多个网络连接 multi_accept 指令

    每个nginx服务器的worker_process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,默认是关闭。当指令默认为关闭状态,即每个worker_process一次只能接收一个新到达的网络连接。 该multi_accept 指令语法结构为:

      multi_accept  on | off

  

  3.4 设置网络连接的序列化 accept_mutex指令

    这里涉及到一个名词"惊群"。惊群(thundering herd problem) 大意是:当某一时候只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在nginx服务器的多进程下,有可能出现这样的问题。

    为了解决这样的问题,nginx配置中包含了这样一条指令accept_mutex。当设置为开启的时候会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢。默认为开启状态。其语法结构为:

    accept_mutex   on | off;

  本篇最后先展示nginx.conf配置文件的全局块和event块的指令条数示例:

    user nginx nginx;
worker_processes ;
pid logs/nginx.pid;
error_log logs/error.log error; #制定日志路径,级别。这个设置可以放入全局块,http块,server块 events {
accept_mutex on; #默认为on
multi_accept on; #默认为off
use epoll; #事件驱动模型
worker_connections ; #最大连接数
}

参考文献:

  Nginx高性能Web服务器详解

nginx系列 3 nginx.conf介绍(1)的更多相关文章

  1. 死磕nginx系列--使用nginx做负载均衡

    使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 ...

  2. 死磕nginx系列--使用nginx做cache服务

    配置文件 nginx.conf 主配置文件 worker_processes 1; events { worker_connections 1024; } http { include mime.ty ...

  3. 【Nginx系列】Nginx编译与安装

    Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.Nginx是由Igor Sysoev为俄罗斯访问第二的Rambler.ru站点开发的. 一.Nginx ...

  4. 【Nginx系列】Nginx虚拟主机的配置核日志管理

    Nginx配置段 #user nobody; worker_processes 1;// 有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数 #error_lo ...

  5. 【Nginx系列】Nginx之location

    语法: location [=|~|~*|^~] patt { } 一.分类 中括号可以不写任何参数,此时称为一般匹配 也可以写参数 因此,大类型可以分为3种 location = patt {} [ ...

  6. Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size

    原文:http://php-note.com/article/detail/488 client_max_body_size client_max_body_size 默认 1M,表示 客户端请求服务 ...

  7. 死磕nginx系列--配置文档解读

    nginx配置文件主要分为四个部分: main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设置) serve ...

  8. 死磕nginx系列--nginx 目录

    死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统-nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕nginx系列--使用 ...

  9. 死磕nginx系列

    死磕nginx系列 死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统--nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕 ...

随机推荐

  1. webserver开发

    https://www.cnblogs.com/zakun/p/5387910.html

  2. 提高在word编辑公式的效率,及快捷键、对齐、编号问题

    1.     Word中编辑公式简介(重点看) https://jacobz.top/2017-08/WordMath/ 2.     快捷键 https://wenku.baidu.com/view ...

  3. Java下载文件的几种方式

    转发自博客园Sunny的文章 1.以流的方式下载 public HttpServletResponse download(String path, HttpServletResponse respon ...

  4. promisify,promisifyAll,promise.all实现原理

    1.promisify function toPrimisify (fn){ return function (...args){      return new Promise(function(r ...

  5. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  6. centos7.5安装python3.7

    系统状态 CentOS Linux release 7.5.1804 (Core) mini版安装系统 Python-3.7.0.tgz 官方下载源码包 安装系统依赖包 # 编译必备 yum inst ...

  7. python中的双向链表实现

    引子 双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search.这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可. ...

  8. Vue 过滤器的使用

    Vue官方文档是这样说的:Vue过滤器用于格式化一些常见的文本. 在实际项目中的使用: 定义过滤器 在src定义一个filter.js文件,里面定义过滤器函数,在最后要使用 exprot defaul ...

  9. Python-JSON和pickle

    笔记:一:简介 (1)JSON (JavaScript Object Notation) 是一种轻量级(XML重量级)的数据交换格式. 是为了数据交换而定制的一种规则,它基于ECMAScript的一个 ...

  10. Python-字典与json的转换

    #json是字符串,只不过长得像字典 import json user_info='''{"niuhy":1234,"shanbl":44566}''' #js ...