自己一直没有信心手撸nginx配置,总结原因是不够了解其架构、设计思想,导致配置参数的时候存在试一试的心态,不能像写代码一样有预期的执行过程。
所以决定从了解其设计,到掌握常见配置,知道常见配置为什么,梳理一遍nginx配置使用。
Nginx设计理解
nginx的功能组织是模块化的,特定模块解决特定的问题,读文档了解这个设计的时候第一个感觉是模块有点“松散”,一下子梳理不出来一个思路。比如“如果我要实现这样一个功能,应该超什么方向,深入那个相关模块”?
所以按照一个常见配置,提出问题,到文档里面去寻找答案,来梳理思路。
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
daemon off;
http {
server {
listen 8080;
server_name static.demo.com;
location / {
root /tmp/nginx/data/html ;
}
}
}
提出问题:
- events、http、server、location这些block怎么解释,那些配置算block?
- 每一个block里面可写什么?
- 每个block和里面的配置会影响到nginx的那方面?
- 假设从零开始写一个配置文件,得按照什么思路写起?
基于自己的网络编程经验,一边推测,一边读文档证实,整理如下:
- 配置中不在block中的配置,影响的是nginx进程行为,如
work_processes
配置进程数量,daemon
配置是否守护运行。 - nginx基于事件实现网络请求处理,所以
events
配置是影响核心事件机制的配置。 - 在事件机制基础上,模块化的实现网络协议,所以
http
是配置http协议模块行为的地方。 - 在
http
中我们可以配置如何处理请求,其中的server
、location
是在其基础上由相关模块实现的常用功能。
总结思路,要setup一个nginx服务器,流程大概就这样子:
配置进程行为 -> 配置事件机制 -> 配置协议模块 -> 配置协议请求行为
其中目前nginx协议模块有http、mail、stream,分别对应作为http服务器、邮件服务器、四层服务器。
Nginx配置结构
在nginx中配置属性(关键字)称作指令,指令分两种:
- 简单指令:名字加参数以
;
结尾,名字和参数之间用空格分隔。 - 块指令: 在简单指令基础上,以
{}
结尾,其中{}
定义了一个context,context里面可以写合法的简单指令或块指令。
所有的指令都可以认为在context中,没有被任何块指令包括的指令,可以认为在全局的main context中。
指令是可以被扩展的、通过编写扩展模块。常用的基础指令nginx本身也是通过模块实现的,所以配置一个目标功能,查阅对应模块文档,了解其指令参数便有头绪。
以access
模块为例
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Allows access for the specified network or address. If the special value unix: is specified (1.5.1), allows access for all UNIX-domain sockets.
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Denies access for the specified network or address. If the special value unix: is specified (1.5.1), denies access for all UNIX-domain sockets.
文档中详细介绍了access
、deny
两个指令的语法、合法参数、默认值、以及合法的作用context。
Nginx常用核心模块
ngx_http_core_module
http核心模块,是http
、server
、location
等指令的来源。
ngx_http_rewrite_module
url重写模块,是if
,rewrite
指令的来源。
ngx_http_access_module
访问控制模块,是access
、deny
指令的来源。
ngx_http_proxy_module
反向代理模块,非常重要的模块之一,作为反向代理服务器使用proxy_pass
指令的来源。
ngx_http_log_module
日志模块,基本模块之一access_log
,log_format
指令的来源。
ngx_http_fastcgi_module
fastcgi协议模块,是常用nginx+php(fastcgi应用)架构应用的重要支持模块,fastcgi_pass
指令的来源。
ngx_http_uwsgi_module
wsgi协议,是常用nginx+python(wsgi应用)架构应用的重要支持模块,wsgi_pass
指令的来源。
ngx_http_upstream_module
作为负载均衡服务器的重要模块,upstream
指令的来源。
ngx_stream_core_module
作为四层协议TCP、UDP代理服务的核心模块,stream
指令的来源。