带着问题去学习--Nginx配置解析(前言)

583 阅读3分钟

Nginx配置解析

前言

去学习一件事情之前,请务必要带着问题去学习,不然很容易在一大堆东西中迷失了方向,最后把自己绕进去迷失了方向。做学习以外的其他事情亦是如此,一定要抱有强烈的目的性,不然很容易在纷纷杂杂的事物中耗尽了时间,花光了精力最终却一无所获。

在学习nginx的配置解析前,我们先看一下,nginx的配置文件是怎么用的。 下面是一个nginx配置示例文件:

user       www www;  ## Default: nobody
worker_processes  5;  ## Default: 1
error_log  logs/error.log;
pid        logs/nginx.pid;
worker_rlimit_nofile 8192;

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  include    conf/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;

  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log   logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts

  server { # php/fastcgi
    listen       80;
    server_name  domain1.com www.domain1.com;
    access_log   logs/domain1.access.log  main;
    root         html;

    location ~ \.php$ {
      fastcgi_pass   127.0.0.1:1025;
    }
  }

  server { # simple reverse-proxy
    listen       80;
    server_name  domain2.com www.domain2.com;
    access_log   logs/domain2.access.log  main;

    # serve static files
    location ~ ^/(images|javascript|js|css|flash|media|static)/  {
      root    /var/www/virtual/big.server.com/htdocs;
      expires 30d;
    }

    # pass requests for dynamic content to rails/turbogears/zope, et al
    location / {
      proxy_pass      http://127.0.0.1:8080;
    }
  }

  upstream big_server_com {
    server 127.0.0.3:8000 weight=5;
    server 127.0.0.3:8001 weight=5;
    server 192.168.0.1:8000;
    server 192.168.0.1:8001;
  }

  server { # simple load balancing
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;

    location / {
      proxy_pass      http://big_server_com;
    }
  }
}

在对nginx配置一无所知的情况下,我们可以对上面的配置按照自己的理解做一个分类,看看总共有哪几种情况的配置。

  • 按照配置出现的位置划分
  1. 在最外层级别的配置

包括userworker_processes等,不属于任何一个{}配置块

user       www www;  ## Default: nobody
worker_processes  5;  ## Default: 1
error_log  logs/error.log;
pid        logs/nginx.pid;
worker_rlimit_nofile 8192;
  1. 在块内的配置

包括httpevents等块内的配置

events {
  worker_connections  4096;  ## Default: 1024
}
  • 按照参数的个数划分
  1. 带一个参数的配置

包括worker_processes等,只有一个参数

worker_processes  5;  ## Default: 1
  1. 带多个参数的配置

包括index等,存在多个参数

index    index.html index.htm index.php;
  • 按照参数的类型划分
  1. 参数为普通的数值类型的配置

包括worker_processes等,参数是一个数值

worker_processes  5;
  1. 参数为普通的字符串的配置

包括server_name等,参数是一个普通的字符串

server_name     big.server.com;
  1. 参数为带有单位数值的配置

包括expires等,参数中带有单位

expires 30d;
  1. 参数为携带特殊操作字符串的配置

包括server等,参数中有赋值等操作

server 127.0.0.3:8000 weight=5;
  1. 参数支持多种类型的配置

包括server等,参数有多种形式

server {}
server 127.0.0.3:8000 weight=5;

在对上面的配置进行分类、分析的过程中,问题自然而然也就积累了下来,如果看完没有疑惑,要不就是原本就很明白了,要不然就是没认真看。 我个人在分析的过程中提出了以下几个问题:

  1. 配置项所在的位置是怎么决定的?为什么有的配置项是在文件外层,有的是在某个配置块内?
  2. 每个模块都有自己的配置项,nginx是如何把它们组织到一起的?
  3. 每个模块都会定义自己的配置项,nginx怎么让各个模块分别处理它们的专属配置项的?
  4. 如果,我自定义了一个模块,有本模块的专属配置项,我应该怎么把我模块的配置解析工作整合到nginx中?
  5. 每个配置项的参数有一个的,有多个的,还有多种类型共存的,nginx怎么处理这些配置项参数?
  6. nginx对那种定义配置块的配置项,如httpevent怎么处理的?
  7. include是怎么实现导入其它文件配置的?

让我们带着上面的问题,开始对nginx源码的分析工作。

配置解析系列:

带着问题去学习--Nginx配置解析(前言)

带着问题去学习--Nginx配置解析(一)