Nginx基础配置指令

摘要:
位置块主要用于基于Nginx服务器接收的请求字符串匹配虚拟机名称以外的字符串,并处理特定请求。在Nginx配置文件中,每个指令配置必须以分号结尾。别忘了。Nginx默认日志存储和级别设置error_loglogs/error。对数误差;可以在全局块、http块、服务器块和位置块中配置此指令。Nginx服务器提供各种事件驱动模型来处理网络消息。
nginx.conf文件的结构
...                        #全局块              
events{                    #events块
  ...
}
http{                      #http块                          
  ...                      #http全局块
  server{                  #server块
    ...                    #server全局块
    location [PATTERN]{    #location块
      ...                  
    }

    location [PATTERN]{
      ...
    }
  }

  server{
    ...
    location [PATTERN]{
      ...
    }

    location [PATTERN]{
      ...
    }
  }
}

nginx.conf一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。

全局块

全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。

通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。

events块

events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。

这一部分的指令对Nginx服务器的性能影响较大

http块

http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。

http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

server块

server块和“虚拟主机”的概念有密切关系。

虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。早期的Linux服务器上,一个服务器只能运行一个网站,也就是说只能跑一个域名。但随着技术的发展,一个服务器上可以跑多个域名了,这样可以帮我们节省了成本。其实这里的服务器就叫主机,早期一个主机对应一个站点。现在不同了,一个主机可以跑多个站点,所以就有了虚拟主机的概念。我们可以把一台服务器虚拟出多个主机出来,这样就实现了一台服务器上跑多个站点

每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机。

location块

location块的主要作用是,基于Nginx服务器接收到的请求字符串,对除虚拟机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。

在Nginx配置文件中,每一条指令配置都必须以分号结束,请不要忘记。

配置运行Nginx服务器用户(组)

用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为

user user [group]
  • user:指定可以运行Nginx服务器的用户
  • group:可选项,指定可以运行Nginx服务器的用户组

只有被设置的用户或者用户组成员才有权限启动Nginx进程。

如果希望所有用户都可以启动Nginx进程,有两种办法

  • 将此指令注释掉
  • 将用户和用户组设置为nobody,user nobody nobody

此指令只能在全局块中进行配置。

配置允许生成的worker process数

worker process数是Nginx服务器实现并发处理服务的关键所在。

其语法格式为

worker_processes number | auto;
  • number:指定Nginx进程最多可以产生的worker process数
  • auto:设置此值,Nginx进程将自动检测

在默认的配置文件中,number=1。启动Nginx服务器后,使用ps aux|grep nginx命令可以看到Nginx服务器除了主进程master之外,还生成了一个worker process。

此指令只能在全局块中进行配置。

配置文件的引入

在一些情况下,我们可能需要将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中。

include file;

此指令可以放在配置文件的任意地方。

配置Nginx进程PID存放路径

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

pid file;
  • file指定存放路径和文件名称

配置文件默认将此文件存放在Nginx安装目录logs下,名字为nginx.pid。

在Nginx运行的时候就会生成这么个文件里边存放着主进程号。为什么要有这么个文件呢,给nginx用的,nginx停止的时候需要杀死这个进程号。Nginx停止后也就没这个文件了。

此指令只能在全局块中进行配置。

配置错误日志的存放路径

在全局块、http块和server块中都可以对Nginx服务器的日志进行相关配置。这里介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。

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

Nginx服务器的日志支持输出到某一固定的文件file或者输出到标准错误输出stderr(就是控制台);日志的级别是可选的。

Nginx默认的日志存放和级别设置

error_log logs/error.log error;

此指令可以在全局块、http块、server块以及location块中配置。

事件驱动模型的选择

Nginx服务器提供了多种事件驱动模型来处理网络消息。

use method;

method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport。

epoll库是Nginx服务器支持的高性能驱动库之一,它是公认的非常优秀的事件驱动模型。

此指令只能在events块中进行配置。

配置最大连接数

指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。

worker_connections number;

此指令的默认值为1024

此指令只能在events块中进行配置。

定义MIME-Type

在浏览器中,可以显示的内容为HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。

在默认的Nginx配置文件中,可以看到在http全局块中有以下两行配置:

include mime.types;
default_type application/octet-stream;

第一行从外部引用了mime_types文件,文件中定义了一个types结构,结构中包含了浏览器能够识别的MIME类型以及对应于相应类型的文件后缀名。

第二行中使用指令default_type配置了用于处理前端请求的MIME类型

default_type mime_type;

其中,mime_type为types块中定义的MIME-type,如果不加此指令,默认值为text/plain。此指令还可以在http块、server块或者location块中进行配置。

自定义服务日志

之前介绍过errer_log指令,其用于配置Nginx进程运行时的日志存放和级别,而此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志,我们将其称为服务器日志以示区分。

Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access_log和log_format指令

access_log path[format[buffer=size]]
  • path:配置服务日志的文件存放的路径和名称
  • format:可选项,自定义服务日志的格式字符串,也可以通过“字符串的名称”使用log_format指令定义好的格式。“格式串的名称”在log_format指令中定义。
  • size:配置临时存放日志的内存缓存区大小

此指令可以在http块、server块或者location块中进行设置。默认的配置为

access_log logs/access.log combined;

其中,combined为log_format指令默认定义的日志格式字符串的名称。

如果要取消记录服务日志的功能,则使用

access_log off;

和access_log联合使用的另一个指令是log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便access_log指令可以直接调用。

log_format name string...
  • name:格式字符串的名字,默认的名字为combined
  • string:服务日志的格式字符串。在定义过程中,可以使用Nginx配置预设的一些变量获取相关内容,变量的名称使用双引号括起来,string整体使用单引号括起来。
log_format exampleLog '$remote_addr - [$time_local] $request'
                      '$status $body_bytes_sent $http_referer'
                      '$http_user_agent';

此指令只能在http块中进行配置。

配置允许sendfile方式传输文件

sendfile on | off;

用于开启或者关闭使用sendfile传输文件,默认值为off,可以在http块、server块或者location块中进行配置。

sendfile_max_chunk size;

其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile传输数据量最大不能超过这个值;如果设置为0,则无限制。默认值为0。此指令可以在http块、server块或location块中配置

sendfile_max_chunk 128k;

配置连接超时时间

与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间

keepalived_timeout timeout[header_timeout];
  • timeout:服务器端对连接的保持时间。默认为75s
  • header_timeout:可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout=header_timeout”。
keepalived_timeout 120s 100s

此指令可以在http块、server块或location块中配置。

单连接请求数上限

Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。此指令用于限制用户通过某一连接向Nginx服务器发送请求的次数

keepalived_requests number;

此指令还可以出现在server块和location块中,默认设置为100。

配置网络监听

listen 192.168.1.10:8000;#监听具体的ip和具体的端口上的连接
listen 192.168.1.10#监听具体ip的所有端口上的连接
listen 8000#监听具体端口上的所有ip连接
listen 192.168.1.10 default_server;#设置192.168.1.10的连接请求默认由此虚拟机处理

基于名称的虚拟主机配置

这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟机发送请求了。(写localhost的话就相当于是本机ip,在hosts文件中默认配置着呢)

server_name name ...;

对于name来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两端或者三段组成,之间由点号“.”隔开

server_name myserver.com www.myserver.com

在name中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段。

server_name *.myserver.com www.myserver.*;

在name中还可以使用正则表达式。

这下可以知道虚拟主机可以接受使用哪些域名的请求了。

基于IP的虚拟主机配置

配置基于IP的虚拟主机,及为Nginx服务器提供的每台虚拟主机配置一个不同的ip,因此需要将网卡设置为同时能够监听多个IP地址。

给一个网卡设定多个ip,参看笔记。

server{            #第一台虚拟主机
  listen 80;
  server_name 192.168.25.133;
  ...
}

server{           #第二台虚拟主机
  listen 80;
  server_name 192.168.25.134;
  ...
}

之后访问133的请求将由第一台虚拟主机接受和处理,访问134的请求将由第二台虚拟主机接收和处理。

配置location块

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

其中,uri变量是带匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达式的字符串,如.php$(表示以.php结尾的URL)等。为了下文叙述方便,我们约定,不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。‘

其中方括号里的部分,是可选项,用来改变请求字符串与uri的匹配方式。在介绍四种标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。

在不添加此选项时,Nginx服务器首先在server块的多个location中搜索是否有标准的uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。

  • “=”:用于标准uri之前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
  • “~”:用于表示uri包含正则表达式,并且区分大小写。
  • “~*”:用于表示uri包含正则表达式,并且不区分大小写
  • “^~”:用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

注意:如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。

配置请求的根目录

Web服务器接收到网络请求后,首先要在服务器端指定目录中寻找请求资源。在Nginx服务器中,指令root就是用来配置这个根目录的。

root path;

其中,path为Nginx服务器接收到请求以后查找资源的根目录路径。此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别作出处理,因此该指令通常在location块中进行设置。

location /data/{
  root /locationtest1;
}

当location块接收到“/data/index.htm”的请求时,将在/locationtest1/data/目录下找到index.htm响应请求。

设置网站的默认首页

指令index用于设置网站的默认首页,用户在发出请求访问网站时,请求可以不写首页名称

index file ...;

file变量可以包括多个文件名,使用空格分隔,默认为index.html

设置网站的错误页面

一般来说2XX代表请求正常完成,3XX代表网站重定向,4XX代表客户端出现错误,5XX代表服务器出现错误。

error_page code... [=[response]] uri
  • code,要处理的http错误代码
  • response,可选项,将code指定的错误代码转化为新的错误代码response
  • uri,错误页面的路径或者网站地址。如果设置为路径,则是以Nginx服务器安装路径下的html目录为根路径的想对路径

。。。。

实例

user nobody nobody;
worker_processes 3;
error_log logs/error.log;
pid nginx.pid;

events{
  use epoll;
  worker_connections 1024;
}

http{
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalived_timeout 65;
  log_format access.log '$remote_addr-[$time_local]-"$request"-"$http_user_agent"';

  server{
    listen 8081;
    server_name myServer1;
    access_log /myweb/server1/log/access.log;
    error_page 404 /404.html;

    location /server1/location1{
      root /myweb;
      index index.svr1-loc1.htm;
    }

    location /server1/location1{
      root /myweb;
      index index.svr1-loc2.htm;
    }

  }

  server{
    listen 8082;
    server_name 192.168.1.3;
    access_log /myweb/server2/log/access.log;
    error_page 404 /404.html;

    location /server2/location1{
      root /myweb;
      index index.svr2-loc1.htm;
    }

    location /server2/location1{
      root /myweb;
      index index.svr2-loc2.htm;
    }

    location=/404.html{
      root /myweb/;
      index 404.html;
    }

  }

}

  • 输入myserver1:8081/svr1/location1/
  • 输入myserver1:8081/server1/location2/
  • 输入192.168.1.3:8082/server2/location1/
  • 输入192.168.1.3:8082/svr2/loc2/
  • 输入192.168.1.3:8082/server2/location2/

免责声明:文章转载自《Nginx基础配置指令》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++学习笔记(三):布尔类型和引用通过批处理变更系统时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

react 中echarts-for-react使用 自适应div

import*asReactfrom'react'importReactEchartsfrom'charts-for-ract'导出接口IProps{}接口IState{}classCapitalBudgetsextendsReact.Component<IProps,IState>{constructor(props:IProps){super(props...

sikuli简介

Sikuli脚本自动化,你在屏幕上看到的任何东西。Sikuli是一个开放源码的最初的用户界面设计组织在麻省理工学院的研究项目。现在是保持并进一步协调与开源社区开发的Sikuli实验室在美国科罗拉多州博尔德大学。Sikuli的MIT许可证下发布的。当然,你也可以使用sikuli的javaAPI使其在java环境下运行。小例子大体上了解sikuli的界面,下面来...

css动画延迟好像有点怪

项目需要使用动画Css。自定义时,会发现设置动画延迟和动画持续时间的总时间不正确,这将导致动画丢失。例如,bounceInLeft动画从左侧出现,然后抖动。当初始动画延迟为0时,动画持续时间为1s,动画已完成,但如果设置该值,动画延迟为1s且动画持续时间是2s,则动画未完成。具体的动画是从左侧出现,然后在1s延迟后直接到达终点,但没有抖动。然后我用w3c写了...

Oracle11g温习-第七章:redo日志

thread:线程,在单实例的环境下,thread#永远是1sequence:日志序列号。在日志切换时会递增。FIRST_CHANGE#:在当前日志中记录的首个数据块的scn。...

rz上传文件及出错解决方案

原始链接:https://blog.csdn.net/yjk13703623757/article/details/87083997单独使用rz命令时有两个问题:上载中断和文件更改。解决方案是使用rz be进行上传,并在弹出对话框中删除“UploadfilesasASCII”之前的复选框。如果使用不带参数的rz命令上传一个大文件,则在上传过程中通常会中断。很...

js学习-es6实现枚举

最近,我大部分时间都在写dart,突然使用了js。我发现js不能直接声明枚举。目录枚举功能对象冻结()符号实现反映了不可更改值的唯一性。请注意,枚举特性枚举值不能重复,也不能修改。Switchcase可以直接判断对象。冻结()对象。方法可以冻结对象。无法更改实现constEnumSex=Object。冷冻枚举性别。人=1;安慰日志;//符号(男性)表示值co...