天天看点

【深度】一文详解nginx配置

作为研发人员、无论是服务端、前端或者APP端,都应该具备自行搭建服务的能力,这就要求对服务器(apache、nginx等)服务器有一定的了解和掌握,本文将针对工作中接触到的nginx服务器做一些介绍,并针对其配置文件做概括说明。

一、NGINX的由来

(engine x)

是一个高性能的HTTP和反向代理web服务器,由

伊戈尔·赛索耶夫

为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日,当前发行的最新稳定版本为

nginx-1.19.2

它是在BSD-like 协议下发行,由于占有内存少,并发能力强等特点,在国内大厂应用广泛。

二、NGINX源码阅读

其实之前读过一些,也做过一个源码注释的项目【NGINX源码注释】,有兴趣的可以看一下,版本为1.17。主要包含以下几个大块:

├── auto             自动检测系统环境以及编译相关的脚本
│   ├── cc           关于编译器相关的编译选项的检测脚本
│   ├── lib          nginx编译所需要的一些库的检测脚本
│   ├── os           与平台相关的一些系统参数与系统调用相关的检测
│   └── types        与数据类型相关的一些辅助脚本
├── conf             存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib          存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html             存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man              nginx的man手册
└── src              存放nginx的源代码
    ├── core         nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
    ├── event        对系统事件处理机制的封装,以及定时器的实现相关代码
    │   └── modules  不同事件处理方式的模块化,如select、poll、epoll、kqueue等
    ├── http         nginx作为http服务器相关的代码
    │   └── modules  包含http的各种功能模块
    ├── mail         nginx作为邮件代理服务器相关的代码
    ├── misc         一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
    └── os           主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口
           

之前梳理过一版nginx启动及处理流程图,如下:

【深度】一文详解nginx配置

三、NGINX配置项说明

nginx.conf 是nginx配置的核心文件,结构如下:

1、全局块

全局块是默认配置文件从开始到events块之间的内容,主要设置影响Nginx服务器正题运行的配置指令。通常包括:用户(组)、worker process、worker_rlimit_nofile、nginx进程pid存放路径、日志存放路径、类型、配置文件引入等.

2、events块

events块配置主要影响Nginx服务器与用户的网络连接。

常用包括:是否开启对多worker process下的网络连接序列化、是否允许同时接受多个网络连接请求、选取那种事件驱动模型处理连接请求以及每个work process可以同时支持的最大连接数等。

events {

 …

}

3、http块

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

http模块包括http全局配置和server模块,全局配置是所有server共用,常用包括:文件引入、mime-type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求上限等。

http {

 … // 全局配置

  server {}

}

4、server块

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

虚拟主机又称虚拟服务器,是为了节省网络服务硬件成本而出现的一种技术。

每一个http块包含多个server块,而每个server块就相当于一台虚拟主机,它内部可以有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务。在server块中,又包括全局配置和location块等,常用包括:虚拟主机的监听配置和虚拟主机的名称或IP配置。

5、location块

在每个server块下可以有多个location块,location是server块的一个指令。

location块作用是,对Nginx服务器接收到的请求串,对除虚拟主机之外的串进行匹配并处理。常用包括:地址定向、数据缓存、应答控制等。

详细配置项说明:

#全局配置
user nobody nobody; #指定nginx的用户,用户组
worker_processes 1024; #设置nginx进程数,最好与cpu核数
error_log  logs/error.log  info; #设置错误日志,debug、info、notice、warn、error、crit
worker_rlimit_nofile 65535; #一个nginx进程打开的最多文件描述符数目
pid   logs/nginx.pid; #指定pid进程ID文件
include files #引入其他配置文件,例如:通常我们会include vhosts/*.conf,即引入所有server虚机配置文件

events { #events模块
	use epoll; #指定事件驱动模型(select, poll, epoll, kqueue等)
	worker_connections: 65535; #单进程最大连接数
	multi_accept on; #一个工作进程是否允许接收多个连接
}

http { #http模块
	include mime.types; #引入网络资源媒体类型
	default application/octet-stream; #默认文件类型
	charset utf-8; #默认编码
	gzip on; #开启gzip压缩输出
	sendfile on | off; #sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝
	client_max_body_size:8m; #上传文件大小限制
	log_format main '$remote_addr $time_local "$request" $status "$http_referer" $http_user_agent $http_x_forwarded_for';
	log_format combinedio '$remote_addr $time_local "$request" "$request_body" $status $body_bytes_sent "$http_referer" $http_x_forwarded_for '; #定义第二个日志格式

	access_log logs/access.log main; #定义main格式的access日志
	keepalive_timeout 60s; #连接超时时间

	upstream backend {
		#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。其他的规则还有ip_hash, fair,url_hash等,
		server 192.168.80.121:80 weight=3;
		server 192.168.80.122:80 weight=2 down; 下线
		server 192.168.80.123:80 weight=3 backup; 备用
	}
	
	server { #server模块
		listen 80; #监听端口
		server_name localhost; #主机名称,多个用空格隔开
		root /opt/projects/deploy/public; #项目根目录,用于访问文件系统,在匹配到URI后,指向root配置的路径,并把请求路径附加到其后,也可在location中配置
		index index.php index.html; 
		error_page 50x /50x.html; 错误页
		access_log logs/myserver.access.log main; #当前server的日志
		error_log logs/myserver.error.log;
	
		location / { #location模块,匹配去除域名后的字符串,转发所有请求道backend
			proxy_pass backend; #fastcgi_pass,是针对动态语言(php,python,java等)的反向代理,反向代理是实现负载均衡的前提
		}
		
		location / { #rewrite重写
			if ($http_user_agent ~ MSIE) {
    			rewrite ^(.*)$ /msie/$1 break;
			} //如果UA包含"MSIE",rewrite请求到/msid/目录下,$1即^(.*)$表达式匹配到的所有内容
		}
		
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #图片缓存时间设置
			expires 10d;
		}
		
		location = /50x.html { #错误页重定向
			root html
		}
		location /test/ { #匹配url字符串包含test的请求
			proxy_pass backend;
		}
		location ~* \.php { #不区分大小写,匹配后缀为.php的文件
			root /opt/workspace/abc;
			index index.php;
		}
	}
}

           

location中的匹配规则说明:

命令 作用
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其他。一般用来匹配目录
= 精确匹配
@ 定义一个命名的location,在内部定向时使用,例如error_page,try_files
try_files 用于顺序检查指定文件是否存在,如果不存在,则按照最后一个指定 URI 做内部跳转

优先级顺序:"=" > “完整路径” > “^~” > “/*” > “/”

关键字 作用
last 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚才的行为
break 使用了break 指令,rewrite后不会跳出location 作用域,它的生命也在这个location中终结

参考文档

1 中文文档

2 官方文档

3 nginx 注释项目

继续阅读