Nginx基础配置详解(main、events、http、server、location)

1.概览

nginx为我们提供了一个配置文件nginx.conf,其存放于/usr/local/nginx,我们来看看。这里是已经去除#注释部分的内容,同时加上了每个指令代表的含义。

# worker进程的数量,设置为auto,将获取CPU的核心数
worker_processes  1;

events {
    # 设置每个工作进程同时连接的最大数量
    worker_connections  1024;
}
# 提供配置文件上下文,设置http服务器
http {
	# 设置包含的mime类型
    include       mime.types;
    # 定义响应的默认mime类型
    default_type  application/octet-stream;
    # 高效文件传输模式
    sendfile        on;
    # 长连接超时时间,在此期间客户端连接将保持打开状态,如果连接一直活跃,超时时间将自动刷新。如果设置为0,即禁用长连接
    keepalive_timeout  65;
    # 虚拟服务器配置
    server {
    	# 配置监听端口,多个server可以监听同一个端口,只要server_name + listen的组合值唯一即可。
        listen       80;
        # 配置服务器名称,如果请求时没有匹配的服务器名称,将使用默认的服务器名称
        server_name  localhost;
        location / {
        	# html为相对路径,相对于当前配置文件所在的目录
            root   html;
            index  index.html index.htm;
        }
		# 配置错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

可以看到,nginx.conf配置文件由3部分组成:

  • main块
  • events块
  • http块。http块中可以配置多个server块,每个server块中可以配置多个location块。

接下来我们来分别看看这三大块可以进行哪些配置。由于可配置项的数量很多,我们仅列举出常用的配置选项,具体可见官方文档:

**main块+events块:**https://nginx.org/en/docs/ngx_core_module.html

**http块:**https://nginx.org/en/docs/http/ngx_http_core_module.html

2.main块

main块也就是全局块,主要设置一些影响nginx服务器整体运行的配置指令。例如:worker进程数量,master进程pid存放位置等。

以下是main块的常用配置:

1)配置是否以守护进程方式运行nginx

作用域:main

语法:daemon on | off

默认值daemon on;

2)配置工作进程的数量

作用域:main

语法:worker_processes number | auto

默认值worker_processes 1;

3)配置主进程pid存放位置

作用域:main

语法:pid file

默认值pid logs/nginx.pid;

配置示例:

# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;

3.events块

events块主要配置Nginx服务器与客户端的网络连接相关指令。例如每个worker进程可以同时支持的最大连接数。

以下是events块的常用配置:

1)配置有新连接时工作进程的唤醒方式

这里有一个“惊群”的问题,大致意思是:在某一时刻只接收到一个新的网络连接,多个睡眠的进程会被同时唤醒,但只有一个进程可以获得连接,这就回造成一部分系统资源的浪费。在Nginx服务中,如果存在多个工作进程,就有可能出现“惊群”问题。

作用域:events

语法:accept_mutex on | off

默认值accept_mutex off;

作用:如果启用accept_mutex,有新连接时,工作进程将依次接受。否则,所有工作进程将被通知,如果新连接的数量低,就会造成工作进程资源浪费。

2)配置是否允许同时接收多个连接

作用域:events

语法:multi_accept on | off

默认值multi_accept off;

作用:如果禁用multi_accept,工作进程将一次接受一个新连接。否则,工作进程将一次接受所有新连接。

3)配置每个工作进程最大连接数

作用域:events

语法:worker_connections number

默认值worker_connections 512;

作用:设置工作进程可以同时打开的最大连接数。

配置示例:

# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;

events {
	# 配置有新连接时,唤醒工作进程的方式
	accept_mutex on;
	# 配置每个工作进程是否可以同时接收连接
	multi_accept on;
	# 配置每个工作进程的最大连接数
	worker_connections 1024;
}

4.http块

http块是Nginx服务器配置中的重要部分,代理、缓存、第三方模块的配置都放在这个模块。http块中可以包含多个server块,server块也可以包含多个location块。

Tips:很多的配置指令可以同时存在于http,server,location块中,如果同时配置,生效的原则为就近原则

以下是http块的常用配置:

1)配置mime-type

作用域:http,server,location

语法:default_type mime-type

默认值default_type text/plain;

作用:定义响应的mime类型

在浏览器中,可以显示文本,图片等资源,浏览器为了区分这些资源,需要使用mime-type(网络资源的媒体类型)。Nginx作为web服务器,也需要识别客户端请求的资源类型。因此,Nginx定义了mime.types文件,其中定义了很多的资源类型。我们在定义default_type时,参照这个文件配置即可。

cd /usr/local/nginx
cat mime.types
# 输出内容,省略绝大部分
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/json                                 json;
    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;
	......
}

2)配置错误页面

作用域:http,server,location,if in location

语法:error_page code … [=[response]] uri;

作用:定义错误对应的响应

示例:

1)指定404错误码对应的响应

error_page 404 /404.html;

2)更改404错误码为200,并指定响应

error_page 404 =200 /empty.gif;

3)指定响应代码

error_page 404 = /404.php;

3)配置每个连接的最大请求数

作用域:http,server,location

语法:keepalive_requests number

默认值keepalive_requests 1000;

作用:设置一个连接能提供服务的最大请求数。在发出最大数量的请求后,连接将关闭。定期关闭连接有利于内存的释放。

4)配置每个连接处理请求的最长时间

作用域:http,server,location

语法:keepalive_time time

默认值keepalive_time 1h;

作用:设置一个连接处理请求的最长时间。到达该时间后,连接将在随后的请求处理之后关闭。

5)配置连接超时时间

作用域:http,server,location

语法:keepalive_timeout timeout [header_timeout]

默认值keepalive_timeout 75s;

作用:设置长连接的超时时间,在此期间,连接将保持打开状态。零值将禁用长连接

6)配置文件高效传输模式

作用域:http,server,location,if in location

语法:sendfile on | off

默认值sendfile off;

作用:如果开启此选项,可以提升文件传输的速度。

7)包含其他文件

作用域:any

语法:include file

示例include mime.types;

作用:将另一个文件包含到配置中

配置示例:

# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;

events {
	# 配置有新连接时,唤醒工作进程的方式
	accept_mutex on;
	# 配置每个工作进程是否可以同时接收连接
	multi_accept on;
	# 配置每个工作进程的最大连接数
	worker_connections 1024;
}

http {
	# 配置引入资源的媒体类型文件
	include mime.types;
	# 配置默认的响应类型
	default_type text/plain;
	# 配置每个连接能处理的最大请求数
	keepalive_requests 1000;
	# 配置每个连接处理请求的最长时间
	keepalive_time 1h;
	# 配置每个连接的超时时间
	keepalive_timeout 75s;
	# 配置开启文件高效传输模式
	sendfile on;
}

5.server块

server块包含在http块中,在server块里,我们可以配置虚拟主机,虚拟主机技术将一台服务器划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。这和可以http块中定义多个server块契合。

以下是server块的常用配置:

1)配置网络监听端口

listen指令的配置相对复杂,我们这里只看最简单且常用的一种方式:listen port

在nginx中有个概念:default_serer,如果没有显式指定,则配置文件中定义的第一个server为默认server

作用域:server

语法listen 8080

作用:监听指定端口上的所有的连接

2)配置虚拟主机的名称

作用域:server

语法:server_name name …

默认值:server_name “”

作用:设置虚拟主机的名称

server_name的语法看上去比较简单,支持同时配置多个名称,第一个为主名称。

Nginx为我们提供了多种配置形式:使用具体名称使用通配符以及使用正则表达式

1)使用具体名称

server_name myserver.com www.server.com;

2)使用通配符

可以使用*替换名称的开头部分和结尾部分。

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

3)使用正则表达式

使用正则表达式,在Nginx中使用正则表达式需要以~开头。

server_name ~^www\.\d+\.com$;

该正则表达式的含义是:以www开头,紧跟..在正则表达式中有特殊含义,因此需要使用\转义)再紧跟一个或多个0-9的数字(\d代表0-9的任意一个数字,+代表其前面的字符出现一次或多次),再紧跟.com

示例:www.4399.com

既然可以通过多种形式来配置server_name,因此在包含多个虚拟主机的配置中,可能会出现一个请求被多个虚拟主机的server_name匹配成功,Nginx做了规定,按照以下优先级匹配虚拟主机:

1)完全匹配server_name成功

2)通配符在开头部分时匹配server_name成功

3)通配符在结尾部分时匹配server_name成功

4)第一个正则表达式匹配server_name成功

Tips:如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。

6.location块

location块包含在server块中,每个server块可以设置多个location块。location块的作用在于,对请求中的URI进行匹配并进行处理。

1)配置location块

作用域:server,location

语法:location [ = | ~ | ~* | ^~ ] uri { … }

​ location @name { … }

作用:对请求的URI进行匹配

同样的location的配置也存在多种方式:

Nginx定义了匹配规则:

1)先使用不含正则表达式的location进行匹配,找到匹配度最高的一个

2)再通过包含正则表达式的配置进行匹配,如果能匹配到则停止向下匹配并立即处理请求,否则使用第一步的匹配度最高的location来处理请求。

1)精准匹配,如果匹配成功,则停止向下匹配并立即处理请求

# 精准匹配
location = /test {
	...
}

2)匹配以/test开头

# 匹配以/test开头的URI
location /test {
	...
}

3)匹配以/test开头,如果匹配成功,则停止向下匹配并立即处理请求

# 匹配以/test开头的URI,如果匹配成功,则停止向下匹配并立即处理请求
location ^~ /test {
	...
}

4)正则匹配,区分大小写

# 匹配以/test开头的URI,区分大小写
location ~ /test {
	...
}

5)正则匹配,不区分大小写

# 匹配以/test开头的URI,不区分大小写
location ~* /test {
	...
}

2)配置请求的根目录

作用域:http, server, location, if in location

语法:root path

默认值root html

作用:配置请求的根目录

可以看到默认配置为root html,这里的html是一个相对路径,相对于当前配置文件所在的目录

配置示例:

# 配置以守护进程方式运行
daemon on;
# 配置工作进程数量
worker_processess 2;
# 配置主进程pid存放位置
pid logs/nginx.pid;

events {
	# 配置有新连接时,唤醒工作进程的方式
	accept_mutex on;
	# 配置每个工作进程是否可以同时接收连接
	multi_accept on;
	# 配置每个工作进程的最大连接数
	worker_connections 1024;
}

http {
	# 配置引入资源的媒体类型文件
	include mime.types;
	# 配置默认的响应类型
	default_type text/plain;
	# 配置每个连接能处理的最大请求数
	keepalive_requests 1000;
	# 配置每个连接处理请求的最长时间
	keepalive_time 1h;
	# 配置每个连接的超时时间
	keepalive_timeout 75s;
	# 配置开启文件高效传输模式
	sendfile on;
	
	
	server {
		# 配置监听端口
		listen 8080;
		
		# 配置location
		location / {
			root html;
			index index.html;
		}
		location /test {
			return 200 'test success';
		}
	}
}

以上就是Nginx配置文件的基本配置,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

你可能感兴趣的:(nginx,nginx)