nginx配置解析详解(一)

合集下载

nginx配置详解

nginx配置详解

nginx配置详解⾼性能的http服务代理服务器和反向代理服务器,能⽀持50000个并发连接数正向代理明确买家是谁,让代理⼈去联系⽬标例如局域⽹内的客户端想要访问局域⽹外的internet,则需要代理服务器来访问,这种代理就是正向代理反向代理客户端不需要任何配置就可以访问,只需要将请求发送到代理服务器,有代理服务器去选择⽬标服务器在返回给客户端负载均衡将请求分发到不同服务器、负载分发到不同服务器,就是负载均衡访问⼀个ip 默认是80 (nginx) tomcat 是8080动静分离为了加快⽹站的解析速度、将动态和静态页⾯有不同服务器来解析,降低原来单个服务器的压⼒安装进⼊压缩⽬录执⾏./configure执⾏make && make install (编译安装)安装完成后多⼀个local/nginx 在nginx有sbin 启动脚本./nginx访问: ->welcome to nginx查看开放的端⼝:firewall-cmd –list-all添加端⼝:Firewall-cmd –add-service=http -permanentSudo firewall-cmd –add-port=80/tcp –permanent重启防⽕墙:firewall-cmd -reloadNginx 相关命令:1 进⼊到nginx的⽬录 /usr/local/nginx/sbin2 查看nginx的版本号:./nginx -v3 启动nginx ./nginx4 关闭nginx ./nginx -s stop5 重加载 ./nginx -s reload (重新加载配置⽂件 nginx.conf)Nginx的配置⽂件组成第⼀块:全局块从配置⽂件开始到events块之间的内容、主要设置⼀些影响nginx服务器运⾏的配置指令,⽐如 worker_process 1; 值越⼤,可以⽀持的并发量也越多第⼆部分:events涉及的指令主要影响nginx服务器与⽤户的⽹络连接数⽐如 worker connections 1024 ⽀持的最⼤连接数第三部分:http块(配置最多的地⽅)http全局块server块举例:浏览器访问Nginx.conf 配置如下图:proxy_pass 反向代理的地址例如:要实现http://127.0.0.1:9091/edu 访问tomcatl1 (127.0.0.1:8080)http://127.0.0.1:8080/vod 访问tomcatl2 (127.0.0.1:8081)注意:开放端⼝ 9091 8081 8080 (firewall)在 /usr/src/tomcat-xx/apache-tomcat-xx/webapps/ 创建 edu⽬录然后放⼀个a.html⽂件这时访问就能看到这是nginx.conf ⾥要改的内容~ /edu/ #正则表达式,请求路径包含 edu时就会转发到 xxx:8080关于location的说明:负载均衡:访问http://192.168.17.129/edu/a.htmlUpstream myserver{Server 192.168.17.129:8080;Server 192.168.17.129:8081;}策略:轮询(默认)、权重、ip_hash、fair(第三⽅)轮询:服务器如果down掉,⾃动剔除权重:weight 权重越⾼,分配的客户端越多Upstream myserver{Server xxx weight=1;Server xxx weight=10;}Ip_hash:每个访客固定⼀个后端服务器、可以解决session问题Upstream myserver{Ip_hash;Server xxx;Server xxx;}Fair:按后端服务器响应时间来分配请求、响应时间断的优先分配Upstream myserverr{Server xxxx;Server xxxx;Fair;}动静分离:Nginx处理静态页⾯、tomcat处理动态页⾯:⼀:把静态⽂件独⽴成单独的域名放在独⽴的服务器上另⼀种就是动态和静态⽂件混合⼀起发布,通过nginx来分开,通过location指定不同的后缀名实现不同的转发请求、通过expires 参数设置可以使浏览器缓存过期时间,减少与服务器之间的请求和流量;设定⼀个过期时间,也就是⽆需去后端服务验证,直接通过浏览器确认是否过期即可,不会残⽣额外的流量/data/image/01.jpg/data/www/a.htmlAutoinde on; // 列出返回⽬录最终测试:http://192.168.17.129/image/01.jpghttp://192.168.17.129/www/a.html⾼可⽤集群需要两台服务器 192.168.17.129 192.168.17.131 (nginx)这两台都要安装nignx、keepalivedYum -y install keepalived安装好之后修改/etc/keepalived/keepalived.conf ⽂件分别启动nignx和keepalived./nginx systemctl start keepalived.service补充:关闭nginx服务1 kill `cat /usr/local/nginx/logs/nginx.pid` //⽂件中有个pid号2 nginx -s reload //重载Session共享:⽆论登录那⼀台ip,session是⼀致的1 内存数据库(memcache)1 修改服务器和数据库的关联关系。

nginx配置文件详解

nginx配置文件详解

在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.#运行用户user www-data;#启动进程,通常设置成和cpu的数量相等worker_processes 1;#全局错误日志及PID文件error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;#工作模式及连接数上限events {use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能worker_connections 1024;#单个后台worker process进程的最大并发链接数# multi_accept on;}#设定http服务器,利用它的反向代理功能提供负载均衡支持http {#设定mime类型,类型由mime.type文件定义include /etc/nginx/mime.types;default_type application/octet-stream;#设定日志格式access_log /var/log/nginx/access.log;#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.sendfile on;#tcp_nopush on;#连接超时时间#keepalive_timeout 0;keepalive_timeout 65;tcp_nodelay on;#开启gzip压缩gzip on;gzip_disable "MSIE [1-6]\.(?!.*SV1)";#设定请求缓冲client_header_buffer_size 1k;large_client_header_buffers 4 4k;include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;#设定负载均衡的服务器列表upstream mysvr {#weigth参数表示权值,权值越高被分配到的几率越大#本机上的Squid开启3128端口server 192.168.8.1:3128 weight=5;server 192.168.8.2:80 weight=1;server 192.168.8.3:80 weight=6;}server {#侦听80端口listen 80;#定义使用访问server_name ;#设定本虚拟主机的访问日志access_log logs/.access.log main;#默认请求location / {root /root; #定义服务器的默认网站根目录位置index index.php index.html index.htm; #定义首页索引文件的名称fastcgi_pass ;fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include /etc/nginx/fastcgi_params;}# 定义错误提示页面error_page 500 502 503 504 /50x.html;location = /50x.html {root /root;}#静态文件,nginx自己处理location ~ ^/(images|javascript|js|css|flash|media|static)/ {root /var/www/virtual/htdocs;#过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。

nginx详细配置

nginx详细配置

nginx详细配置Nginx内容概览1、nginx简介(1)介绍 nginx的应⽤场景和具体可以做什么事情(2)介绍什么是反向代理(3)介绍什么是负载均衡(4)介绍什么是动静分离2、nginx安装(1)介绍 nginx在 linux系统中如何进⾏安装3、nginx常⽤的命令和配置⽂件(1)介绍 nginx启动、关闭、重新加载命令(2)介绍 nginx的配置⽂件4、nginx配置实例-反向代理5、nginx配置实例-负载均衡6、nginx配置实例-动静分离7、nginx原理与优化参数配置8、搭建 nginx⾼可⽤集群(1)搭建 nginx⾼可⽤集群(主从模式)(2)搭建 nginx⾼可⽤集群(双主模式)第 1 章 Nginx 简介1.1 Nginx 概述Nginx ("engine x") 是⼀个⾼性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能⼒强,事实上 nginx的并发能⼒确实在同类型的⽹页服务器中表现较好,中国⼤陆使⽤ nginx⽹站⽤户有:百度、京东、新浪、⽹易、腾讯、淘宝等1.2 Nginx 作为 web 服务器Nginx 可以作为静态页⾯的 web 服务器,同时还⽀持 CGI 协议的动态语⾔,⽐如 perl、php等。

但是不⽀持 java。

Java程序只能通过与tomcat配合完成。

Nginx专为性能优化⽽开发,性能是其最重要的考量,实现上⾮常注重效率,能经受⾼负载的考验,有报告表明能⽀持⾼达50,000个并发连接数。

1.3 正向代理Nginx 不仅可以做反向代理,实现负载均衡。

还能⽤作正向代理来进⾏上⽹等功能。

正向代理:如果把局域⽹外的 Internet 想象成⼀个巨⼤的资源库,则局域⽹中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

1.4 反向代理反向代理,其实客户端对代理是⽆感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择⽬标服务器获取数据后,在返回给客户端,此时反向代理服务器和⽬标服务器对外就是⼀个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。

Nginx详解

Nginx详解

Nginx详解1Nginx是什么Nginx(engine X)是一个开源的轻量级的HTTP服务器,能够提供高性能的HTTP和反向代理服务。

与传统的Apache服务器相比,在性能上Nginx占用系统资源更小、支持高并发,访问效率更高;在功能上,Nginx不仅作为Web 服务软件,还适用于反向代理、负载均衡等场景;在安装配置上,Nginx更为简单、灵活。

Nginx因为并发性能和资源占用上的优势,已经广泛用于大中型互联网企业。

1.1Nginx特点Nginx具有以下特点:➢支持高并发:Nginx是专门为性能优化而开发的,采用内核Poll模型,单机能够支持几万以上的并发连接。

➢低资源消耗:Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。

一般1万个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗几MB内存。

➢高拓展性:设计极具扩展性,由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。

➢高可用性:Nginx支持热部署,其中的master管理进程与worker工作进程的分离设计;启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行。

➢丰富的使用场景:可以作为Web服务端、HTTP反向代理、负载均衡和前端缓存服务等场景使用。

➢开源协议:使用BSD许可协议,免费使用,且可修改源码。

1.2Nginx使用场景1.2.1反向代理代理服务器一般指代局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端。

代理服务器是介于客户端和Web服务器之间的服务器,客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或则获得目标服务器的指定资源。

正向代理:为了从原始服务器取的内容,客户端向代理发送一个请求并指定目标(Web服务器),然后代理向Web服务器转交请求并将获得的内容返回给客户端,客户端必须要进行一些特别的设置才能使用正向代理。

Nginx配置文件详解

Nginx配置文件详解

Nginx配置⽂件详解Nginx配置⽂件详解1、主配置⽂件⼤致结构:Nginx配置⽂件(/usr/local/nginx/conf/nginx.conf)[root@nginx-4 nginx]# vim /usr/local/nginx/conf/nginx.conf ## 主要结构如下图配置⽂件主要由四部分组成:main(全区设置),HTTP(设置负载均衡服务器组),server(虚拟主机配置),和location(URL匹配特定位置设置)。

访问⼀个web 页⾯,发起N个HTTP请求产⽣⼀次TCP连接,完成多个 HTTP 请求2、简易⽰例:user nginx nginx;worker_processes 1;events {worker_connections 1024;use epoll;}http{include mime.types;charset utf-8;keepalive_timeout 65;server {ServerName N1location{ }location{ }}server {ServerName N2location{ }location{ }}server {ServerName N3location{ }location{ }}}3、主配置⽂件解析:1)全局变量部分:#user nobody nobody; #Nginx的worker进程运⾏⽤户以及⽤户组worker_processes 1; #Nginx开启的进程数,建议设置为等于CPU总核⼼数。

#worker_processes auto; ## 多核⼼CPU设置。

## [root@server-21 ~]# cat /proc/cpuinfo 查看当前CPU 的信息。

#worker_processes 4 # 4核CPU#worker_cpu_affinity 0001 0010 0100 1000;#亲核##CPU亲核,设置⼯作进程与 CPU 绑定。

Nginx主配置参数详解,Nginx配置网站

Nginx主配置参数详解,Nginx配置网站

Nginx主配置参数详解,Nginx配置⽹站1.Niginx主配置⽂件参数详解 a.上⾯博客说了在Linux中安装nginx。

博⽂地址为:/hanyinglong/p/5102141.html b.当Nginx安装完毕后,会有相应的安装⽬录,安装⽬录⾥的nginx.confg为nginx的主配置⽂件,nginx主配置⽂件分为4部分,main(全局配置)、server(主机配置)、upstream(负载均衡服务器设置)以及location(URL匹配特定位置的设置),这四者的关系是:server继承main,location继承server,upstream既不会继承其它设置也不会被继承。

c.Nginx是⼀个代理服务器,⼀般情况下,⽹站是不能部署在Nginx下的,⽐如⽤Java开发的JavaWeb程序,我们部署在tomcat下,然后使⽤Nginx代理将⽹址指向tomcat即可。

2.Nginx.conf配置⽂件详细说明(附备注)1# kencery 注释说明Nginx⽂件2# 时间:2016-1-193# 学习内容,只是来⾃互联⽹,有版权问题请联系我删除。

45######## Nginx的main(全局配置)⽂件6#指定nginx运⾏的⽤户及⽤户组,默认为nobody7#user nobody;89#开启的线程数,⼀般跟逻辑CPU核数⼀致10 worker_processes 1;1112#定位全局错误⽇志⽂件,级别以notice显⽰,还有debug,info,warn,error,crit模式,debug输出最多,crir输出最少,根据实际环境⽽定13#error_log logs/error.log;14#error_log logs/error.log notice;15#error_log logs/error.log info;1617#指定进程id的存储⽂件位置18#pid logs/nginx.pid;1920#指定⼀个nginx进程打开的最多⽂件描述符数⽬,受系统进程的最⼤打开⽂件数量限制21#worker_rlimit_nofile 655352223 events {24#设置⼯作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式25#use epoll;2627#定义每个进程的最⼤连接数,受系统进程的最⼤打开⽂件数量限制。

详解Nginx静态服务配置(root和alias指令)

详解Nginx静态服务配置(root和alias指令)

详解Nginx静态服务配置(root和alias指令)静态⽂件Nginx以其⾼性能著称,常⽤与做前端反向代理服务器。

同时nginx也是⼀个⾼性能的静态⽂件服务器。

通常都会把应⽤的静态⽂件使⽤nginx处理。

配置nginx的静态⽂件有两个指令,⼀个 root 和⼀个 alias。

对于这两个指令,是否需要在路径的后⾯加上斜杠,经常容易让⼈犯晕,本⽂通过尝试不同的匹配规则,归纳了⼀个⽐较通⽤的配置⽅式。

基本配置与Nginx Location Url⼀⽂关于location url配置的实验⼀样,本⽂也使⽤vagrant虚拟机⾥的nginx。

其基本配置如下:/etc/nginx/sites-enabled/pro.confserver {listen 80 default_server;server_name localhost;access_log /var/log/nginx/pro/access.log;error_log /var/log/nginx/pro/error.log;error_page 404 /404.html;root /vagrant/pro;index index.html index.htm;}项⽬的⽬录如下:pro tree.├── 403.html├── 404.html├── index.html├── static│├── flask││└── m.png│└── stc.jpg└── upload└── up.png3 directories, 6 files分别有两个静态⽂件夹,⼀个是static,另外⼀个是upload。

初识rootroot 是指定项⽬的根⽬录,适⽤与server和location。

可以指定多个,如果locaiton没有指定,会往其外层的server或http中寻找继承。

2016/09/28 07:41:48 [error] 4416#0: *70 open() "/vagrant/pro/static/stc.jpgx" failed (2: No such file or directory),client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpgx HTTP/1.1", host: "192.168.33.10"即/vagrant/pro/static/stc.jpgx ⽂件不存在。

nginx安装升级及配置详解

nginx安装升级及配置详解

nginx安装升级及配置详解1.简介2.安装配置3.配置⽂件介绍4.启动、停⽌、平滑重启、升级⼀、Nginx简介Nginx(engine x)是俄罗斯⼈Igor Sysoev编写的⼀款⾼性能的http和反向代理服务器。

在连接⾼并发的情况下,nginx是apache服务器不错的替代品,它能够⽀持50000个并发连接数的响应,⽽内存、cpu等系统资源资源消耗却⾮常低,运⾏⾮常稳定。

性能优势:作为web服务器,处理静态⽂件、索引⽂件及⾃动索引效率⾼作为代理服务器,快速⾼效反向代理作为负载均衡服务器性能,⽀持多并发的连接,占⽤低内存稳定,采⽤分段资源分配技术⾼可⽤,⽀持热部署,启动迅速其它特点:成本低廉;配置⽂件⾮常简单;⽀持Rewrite重写规则,能够根据域名、URL的不同,将http请求分到不同的后端服务器群组;内置健康检查功能,如果nginx proxy后端的某台web服务器宕机了,不会影响到前端的访问;节省带宽,⽀持gzip压缩;⼆、Nginx安装与配置编译安装1.⾸先下载gcc编译器以及nginx⼀些模块的依赖库,通常有pcre库(⽀持rewrite模块),zlib(⽀持gzip模块)库,openssl(⽀持ssl模块)库等。

这些库可以编译安装,也可以yum安装,这⾥选择yum安装。

# yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel2.然后选择nginx版本下载源码并解压# tar –zxvf nginx-1.12.2.tar.gz –C /PATH3.使⽤configure脚本⾃动⽣成Makefile⽂件,nginx的configure脚本⽀持常⽤选项如下,但⾸先给出⼀个例⼦:./configure --prefix=/usr/local/nginx \--conf-path=/etc/nginx/nginx.conf \--error-log-path=/datadisk/data/log/nginx/error.log \--http-log-path=/datadisk/data/log/nginx/access.log \--pid-path=/var/run/nginx.pid \--lock-path=/var/run/nginx.lock \--http-client-body-temp-path=/var/cache/nginx/client_temp \--http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_realip_module \--with-http_addition_module \--with-http_sub_module \--with-http_dav_module \--with-http_flv_module \--with-http_mp4_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_random_index_module \--with-http_secure_link_module \--with-http_stub_status_module \--with-http_auth_request_module \--with-threads --with-stream \--with-stream_ssl_module \--with-http_slice_module \--with-file-aio \--with-http_v2_module \--with-ipv6然后make && make install即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

nginx配置解析详解(一)现在针对nginx源码分析的blog和文章已经很多了,之前我也看过不少,大家的分析都很不错。

太多重复的内容就不写了,主要想针对在我分析代码和查阅blog的过程中,发现的一些比较晦涩或者某些细节有待展开讨论的地方,给出我的自己理解和看法,希望跟大家交流和学习。

使用的nginx版本是nginx-1.0.6,我最开始看的代码是0.7.62,新的版本在功能和稳定性上做了很多的工作。

在分析的时候,我尽量简单明了,不太重要的地方一带而过,具体地大家可以去读代码。

相对复杂或者晦涩的地方,将详细展开。

首先我们从配置文件开始,下面的分析是建立在网友对nginx的配置文件结构有大概熟悉为前提,这样才可以很好的理解代码。

这里有必要提醒一点:原始代码目录中ngx_modules这个结构,是找不到它的定义和初始化,要看到它,你必须执行configure,make,在原来的代码目录下会出现一个objs文件夹,里面的3个文件ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c,需要在建source insight工程时也包含进去,这样有利于我们把握整个代码结构。

有意思的是,nginx的configure文件是作者手工写的,里面有许多管理代码工程的方法,有时间的话,也是值得学习下的。

1.ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);配置文件的解析相关的处理主要在ngx_init_cycle函数中被调用。

既然如此,我们就先说说ngx_init_cycle函数吧。

它需要一个参数类型为ngx_cycle_t *,返回值也是一个ngx_cycle_t*,与此同时我们注意到参数名为old_cycle,那么这个函数的作用是啥呢?很明显是由old得到一个new。

其中ngx_cycle_t的结构保存一些全局的配置和信息。

这个函数具体作用将在reconfig(重读配置文件)的时候得到体现,可以理解为old_cycle 是当前正在使用的配置信息,当配置文件做了某些修改之后,ngx_init_cycle通过old_cycle 中的一些数据,对new_cycle进行一些设置,在经过进一步的配置解析之后,就可以得到一个new cycle。

2.char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)当我们使用sourceinsight查看这个函数的调用情况时,会发现调用它的地方很多。

其实,入口点就在ngx_init_cycle中对ngx_conf_parse调用,后面的所有的调用可以看作是在此之后的递归调用。

为什么会是这个样子呢?原因在于nginx是一边读取配置信息,一边解析执行相关的处理,具体一点讲,就是“读一行,执行一行”,一行的定义在这里是指以分号或者是“{”和“}”等结尾的一行,例如:我们解析到http {},我们就调用针对httpblock的处理,在处理的时候我们又会碰到server {},自然就会调用server block的处理。

以此类推!。

对配置文件的读取主要在函数ngx_conf_read_token中,这个函数每次会把NGX_CONF_BUFFER(即4KB)大小的配置信息读到内存buf中,然后对该buf进行分析。

在该函数外,主要通过该函数的返回值在做不同的处理,关于它的返回值的含义,大家可以去细细读下代码,意义很明确!配置指令我们通过上面的操作就可以拿到了,以空格分开的各个字符串被保存在一个字符串数组里(即cf->args),这一点代码体现的很明显。

之后呢,我们就调用ngx_conf_handler 函数来处理当前拿到的这行配置。

这里我们先从总体上说一下ngx_conf_handler这个函数的工作原理:”它遍历系统中所有的模块配置,找到特定模块,并匹配特定命令,然后执行“。

下面我们展开来讲一下。

nginx会将所有的模块分类管理,自然各个模块被划分到了一个个“集合”中去,同样一个模块下的指令也是分类的(如属于哪类模块,配置在哪些位置是正确的等等),所以在每次调用ngx_conf_parse的时候都会指出”我这次解析的配置信息是啥类型“,举例:conf.module_type= NGX_CORE_MODULE;conf.cmd_type = NGX_MAIN_CONF;即解析得到的指令我们将core module类型中查找,并且在找到的module中类型为main conf的指令。

在进入重点之前,我们先看一个地方,就是cf->handler的处理,它是做什么用的?是这样的,nginx的通用处理函数ngx_conf_handler主要是针对cf->args的字符串数组来使用的,像有的配置,如types,charset_map,并不是单纯的字符串数组,指令的参数可能会放在{}中,这样通用的解析和处理函数就不适用了。

通过我们注册cf->handler,我们就可以对下面{}中参数做常规的配置处理了。

我们进入到ngx_conf_handler函数中,看看它的工作机理。

3. static ngx_int_tngx_conf_handler(ngx_conf_t *cf,ngx_int_t last)参数last是ngx_conf_read_token解析的返回结果。

强调一点的是,cf->args中已经保存了我们需要的各个参数。

接下来的处理分4步走:(1) 模块匹配代码显示的很明显,它首先会根据你指定的类型,对特定的模块进行查找。

(2) command匹配找到匹配的模块之后会遍历该模块下的command数组,来从中找到它需要找command信息。

如果字面上匹配,还要进行command类型的配置检查,如果此时类型不匹配,nginx会报告给你。

(3) 参数个数匹配主要检查对个数有严格要求的command,对于任意个数(即NGX_CONF_ANY)的command,就直接处理了。

关于参数个数,nginx定义了一些宏,如NGX_CONF_TAKEx(x代表1,2,3等,表示可配置一个,两个,三个参数。

),还有像1MORE,2MORE,意思也很明确。

注意的是,对于有个数限制的command,最多可配置的个数为8个,即NGX_CONF_MAX_ARGS,这个在写自己的module时要注意,我吃过这方面的亏。

(4) 执行command(即set函数)。

前面的检查工作做完之后,就要真正去执行相关的操作,生成module的配置信息了。

这里涉及command的类型问题,搞清楚它对后面的理解很重要。

NGX_DIRECT_CONF,NGX_MAIN_CONF,NGX_HTTP_MAIN_CONF,NGX_HTTP_SRV _CONF,NGX_HTTP_LOC_CONF等。

其中NGX_DIRECT_CONF一般是在http块等之外的配置, NGX_HTTP_MAIN_CONF 是直接配置在http块中的,NGX_HTTP_SRV_CONF配置在server块中,NGX_HTTP_LOC_CONF配置在location中等等。

我们来看cf->ctx这个成员,它的类型是void *,到这里你大概会猜到它的用处,肯定是在不同的条件下转来转去!在ngx_init_cycle中我们发现最初cf->ctx的值由cycle->conf_ctx赋值得到,cycle->conf_ctx是一个void ****类型。

(-_-!)在ngx_init_cycle中有这样关键的一句:cycle->conf_ctx =ngx_pcalloc(pool, ngx_max_module * sizeof(void *));所以,这里ngx_max_module是系统中所有module的总数,conf_ctx在这一句中用来给每个module占一个位置(一个指针),但是每个位置到底指向啥东西呢?反正是个void *,指啥都行,一般都只指向一些模块的配置结构,但是对于有些模块,我们要拿到它,要透过n层的指针(例如void ****)来拿到,这样的设计是为了逻辑分层和模块划分。

最终这些指针数组的成员赋值都会在这里的第4步来完成:这里分3种情况:(1) NGX_DIRECT_CONF对于那些游离于{}之外的配置,一般属于ngx_core_conf_t的配置内容,在ngx_init_cycle的时候已经对NGX_CORE_MODULE类型的模块进行了初始化(模块需要有init函数),这里根据配置信息,set函数会做配置结构内中成员的赋值。

(2) NGX_MAIN_CONF这样的配置包括event,http等,他们没有init函数,所以实际的空间分配需要在set 函数内完成,于是就有了:conf =&(((void **) cf->ctx)[ngx_modules[i]->index]); //取指针的地址rv =cmd->set(cf, cmd, conf); // 指针在函数内被赋值set中conf参数是一个二重指针,这也就有个之后在ngx_http_block中的语句:ctx =ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));*(ngx_http_conf_ctx_t **) conf = ctx;(3)其他其实这里的“其他”,主要是一些server和location的类型的command,这些command 大量的集中于http的相关配置中。

我们先来看ngx_http_conf_ctx_t结构:typedefstruct {void **main_conf;void **srv_conf;void **loc_conf;} ngx_http_conf_ctx_t;这里有一点需要交代的是,像http模块下,有一些所谓的子模块,而这些子模块基本上都是http中server或者location中的一些配置。

这些配置通过模块中ctx_index,以数组的形式,将他们的配置结构的指针保存在srv_conf或loc_conf中,这就是他们的类型为什么会是void **。

看下面的行代码:// cmd->conf是cf->ctx成员的位移,这里的处理就是把该位置的成员当成一个指针来处理,// 而实际上,它是一个二级指针,即子模块配置的指针的数组!confp =*(void **) ((char *) cf->ctx + cmd->conf);conf = confp[ngx_modules[i]->ctx_index]; // 拿到配置结构rv =cmd->set(cf, cmd, conf); // 做处理最后说明一下,开始提到的那个void ****类型成员,使用这种类型的原因我们可以在ngx_events_block函数中找到答案。

相关文档
最新文档