Nginx默认配置

Nginx的配置文件为nginx.conf,CentOS中,该文件位于/etc/nginx/nginx.conf。Nginx配置中#号为注释符,并且每项配置都要以;号结尾。nginx.conf默认内容如下:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

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

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       8088;
        listen       [::]:8088;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

Nginx配置结构

Nginx配置中有几个主要模块,了解这几个主要模块可以很好地了解Nginx的配置结构:

# 全局块,主要配置Nginx服务器整体运行的配置指令,这些指令的作用域是Nginx服务器全局
# 可以配置用户组、PID存放路径等信息
...

# event块,配置影响nginx服务器或与用户的网络连接,可以设置是否允许同时接收多个网络连接、选取
# 哪种事件驱动模型、支持的最大连接数等选项
events {
	...
}

# http块,Nginx配置中重要的组成部分,代理、缓存和日志定义等都可以放在该模块中
http {
	# http全局块,作用域为该http块,可以配置文件引入、MIME-Type定义、日志自定义等选项
	...
	# server块,每个http都可以包含多个server块,server块相当于一台虚拟主机,多个server块
	# 类似多台虚拟服务器,提供不同的服务
	server {
		# server全局块,作用域为该server块,http块中的指令同样可以在server块中使用
		...
		# location块,本质为server块的一个指令,但是极其重要,所以也作为一个块来讲解。
		# location的主要作用是对URL进行匹配,并对特定的请求进行处理,地址定向、数据缓存和应答控制都在这部分实现
		location [PATTERN] {
			...
		}
		location [PATTERN] {
			...
		}
	}
	server {
		...
	}
}

详细配置说明

这里只简单说明常用配置项的作用,后面会有专门介绍配置文件的高级用法以及如何优化配置。

# 配置运行nginx的用户和用户组,用户组可省略,如果其他用户尝试启用Nginx进程,会报错
# 如果不设置或者设置为nobody,则所有用户都能启动Nginx
# user user [group]
user nginx;

# 允许生成的进程数,是Nginx实现并发处理服务的关键
# 当设置为auto时,Nginx进程会根据需要自动调整
# worker_processes number | auto
worker_processes auto;

# 存放Nginx守护进程pid的路径
pid /run/nginx.pid;

# 配置错误日志的存放路径并指定日志级别,也可以将错误日志输出到stderr,设置一个级别后,比这级别高的日志也会被记录
# error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg]
error_log /var/log/nginx/error.log;

# 引入其他Nginx配置或第三方模块的配置,被引入的配置文件同样要符合Nginx的配置语法和结构,并且启动Nginx的用户对被引入的配置文件有读写权限
include /usr/share/nginx/modules/*.conf;

events {
	# 当设置为on时,会对多个Nginx进程接收连接进行序列化,防止惊群
	# accept_mutex on | off;
	accept_mutex on;

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

	# 设置事件驱动模型
	# select|poll|kqueue|epoll|resig|/dev/poll|eventport
	use epoll;

	# 配置单个worker_processes的最大连接数
	worker_connections 1024;
}

http {
	# 引入mime.types文件,该文件和nginx.conf位于相同目录。mime.types文件包含了浏览器能够识别的MIME类型以及对应类型的文件后缀名
	include mime.types;
	# 指定用于前端请求的MIME类型,如果不指定,则默认为text/plain,可以在http、server和location中配置
	default_type application/octet-stream;
	
	# 定义服务日志(前端请求和响应的日志)的格式,可以通过指定一些变量获取请求中对应内容
	# log_format name string ...
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
	# 配置保存服务日志的路径和格式,format可以自定义,也可引用log_format定义好的格式,size为临时存放日志的内存缓冲区大小
	# access_log path [format [buffer=size]]
	access_log  /var/log/nginx/access.log  main;
	
	# 配置是否检查传输的数据量大小,如果配置为on,则每次都要和sendfile_max_chunk配置的值进行校验
	# sendfile on | off
	sendfile on;
	# 配置每次传输的数据量最大值,如果是0,则不限制
	sendfile_max_chunk 100k;

	# 配置连接超时时间,单位为秒,header_timeout为响应头部Keep-Alive的值,该执行可在http、server和location中出现
	# keepalive_timeout timeout [header_timeout]
	keepalive_timeout 65;

	# 单一连接发送请求的最大次数,可以在http、server和location中配置
	keepalive_request 100;
	 
	server {
		# 监听配置,可以监听目标IP地址、目标端口等
		# listen address[:port] [default_server] [setfib=number] [bind] [ssl]
		# listen port [default_server] [setfib=number] [bind] [ssl]
		# 
		# 监听8088端口
		listen 8088;
		# 监听所有IPv6连接的8088端口
		listen [::]:8088;

		# 监听地址,允许配置多个地址,多个地址之间用逗号隔开,支持*号通配符和正则表达式,地址支持域名和IP
		# 地址匹配的优先顺序为:准确匹配 > 通配符在开头 > 通配符在结尾 > 正则表达式匹配
		# server_name name ...
		server_name test.com
		
		# 匹配请求的URL,=为完全匹配,~为按照正则表达式匹配并区分大小写,~*为按照正则表达式匹配不区分大小,^~用于标准URL前,如果匹配则立即使用该location
		# location [=|~|~*|^~] uri {...}
		location = /order {
			# 指定资源根目录,匹配到请求后会在该目录中寻找资源,比如:/order/index.html会去找:/sites/html/order/index.html
			root /sites/html;

			# 修改请求路径,需要结合Nginx变量灵活使用
			alias /order1;
			# 设置默认首页
			index /index.html;
			# 设置错误页,code为需要处理的HTTP错误代码,response为转换后的HTTP代码,URL为新的资源路径
			# error_page code ... [=[response]] url
			error_page 404 /404.html;

			# 基于IP配置Nginx访问权限,address为允许访问的客户端IP,当允许多个IP访问时,需要配置多个allow指令,CIDR为允许访问的CIDR地址,all为允许任何客户端访问
			# allow address | CIDR | all
			allow all;
			# 用法和allow一样
			deny all;
		}
	}
}

Nginx匹配请求的顺序

配置文件中,listenserver_name是非常重要的两个配置项,同时很多人可能对这两个配置项如何匹配一个请求有疑问,下面介绍一下Nginx如何处理一个请求,来加深对这两个配置项的理解。

  • 首先Nginx会匹配listen中的地址和端口
  • listen匹配后再匹配server_name,当有多个server_name匹配时:
  • 首先选用准确匹配的server
  • 如果没有,选择通配符在开始位置的server_name
  • 如果没有,选择通配符在结束位置的server_name
  • 如果没有,选择正则表达式匹配的server_name
  • 如果多个匹配server_name优先级一样,则取有default_server修饰的server_name
  • 如果没有default_server修饰的server_name,则默认取第一个server_name

参考
《Nginx高性能Web服务器详解》
https://www.runoob.com/w3cnote/nginx-setup-intro.html