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配置一无所知的情况下,我们可以对上面的配置按照自己的理解做一个分类,看看总共有哪几种情况的配置。
- 按照配置出现的位置划分
- 在最外层级别的配置
包括
user、worker_processes等,不属于任何一个{}配置块
user www www; ## Default: nobody
worker_processes 5; ## Default: 1
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 8192;
- 在块内的配置
包括
http、events等块内的配置
events {
worker_connections 4096; ## Default: 1024
}
- 按照参数的个数划分
- 带一个参数的配置
包括
worker_processes等,只有一个参数
worker_processes 5; ## Default: 1
- 带多个参数的配置
包括
index等,存在多个参数
index index.html index.htm index.php;
- 按照参数的类型划分
- 参数为普通的数值类型的配置
包括
worker_processes等,参数是一个数值
worker_processes 5;
- 参数为普通的字符串的配置
包括
server_name等,参数是一个普通的字符串
server_name big.server.com;
- 参数为带有单位数值的配置
包括
expires等,参数中带有单位
expires 30d;
- 参数为携带特殊操作字符串的配置
包括
server等,参数中有赋值等操作
server 127.0.0.3:8000 weight=5;
- 参数支持多种类型的配置
包括
server等,参数有多种形式
server {}
server 127.0.0.3:8000 weight=5;
在对上面的配置进行分类、分析的过程中,问题自然而然也就积累了下来,如果看完没有疑惑,要不就是原本就很明白了,要不然就是没认真看。 我个人在分析的过程中提出了以下几个问题:
- 配置项所在的位置是怎么决定的?为什么有的配置项是在文件外层,有的是在某个配置块内?
- 每个模块都有自己的配置项,nginx是如何把它们组织到一起的?
- 每个模块都会定义自己的配置项,nginx怎么让各个模块分别处理它们的专属配置项的?
- 如果,我自定义了一个模块,有本模块的专属配置项,我应该怎么把我模块的配置解析工作整合到nginx中?
- 每个配置项的参数有一个的,有多个的,还有多种类型共存的,nginx怎么处理这些配置项参数?
- nginx对那种定义配置块的配置项,如
http、event怎么处理的? - include是怎么实现导入其它文件配置的?
让我们带着上面的问题,开始对nginx源码的分析工作。
配置解析系列: