自己一直没有信心手撸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中我们可以配置如何处理请求,其中的serverlocation是在其基础上由相关模块实现的常用功能。

总结思路,要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.

文档中详细介绍了accessdeny两个指令的语法、合法参数、默认值、以及合法的作用context。

Nginx常用核心模块

ngx_http_core_module

http核心模块,是httpserverlocation等指令的来源。

ngx_http_rewrite_module

url重写模块,是ifrewrite指令的来源。

ngx_http_access_module

访问控制模块,是accessdeny指令的来源。

ngx_http_proxy_module

反向代理模块,非常重要的模块之一,作为反向代理服务器使用proxy_pass指令的来源。

ngx_http_log_module

日志模块,基本模块之一access_loglog_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指令的来源。