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即可。

Nginx配置和说明以及使用Nginx的好处

Nginx配置和说明以及使用Nginx的好处

nginx.conf配置文件一般在:/usr/local/nginx/conf 下
在nginx.conf配置文件中
步骤1:要配置访问的路径
server{
listen 8088;//这个是端口号(通过Nginx的端口)
server_name 192.168.33.128;//这个是ip(通过Nginx访问的ip)
}
步骤2:拦截资源(jsp|do|json|css|html|css|js)
location ~ \.(jsp|do|json|css|html|css|js)${ //这个是拦截资源
proxy_pass http://localtomcat; //这是跳转的localtomcat名字
}
步骤3:分配请求到不同的服务器中
upstream localtomcat{ //localtomcat就是步骤2中跳转名字
server localhost:8080; //这是分配资源的第一个tomcat服务器
server localhost:8081; //这是分配资源的第二个
tomcat服务器
}
当然这个服务器地址可以配置多个,对应多个tomcat,也可以配置在不同的虚拟机下的tomcat
说下使用负载均衡的好处:
1,可以把静态资源放在Nginx下实现共享(或者专门使用一个服务器)
2,动态请求,可以分配到各个服务器上,实现分摊处理请求,不至于系统奔溃,就算奔溃一个,还有其他的服务器
启动Nginx需要进入到/usr/local/nginx/sbin 目录下输入 ./nginx
关闭输入 pkill -9 nginx。

nginx源码安装配置详解(.configure)

nginx源码安装配置详解(.configure)

nginx源码安装配置详解(.configure)在"./configure"配置中,"--with"表⽰启⽤模块,也就是说这些模块在编译时不会⾃动构建,"--without"表⽰禁⽤模块,也就是说这些模块在编译时会⾃动构建,若你想Nginx轻量级运⾏,可以去除⼀些不必要的模块。

[root@localhost nginx-1.14.0]# ./configure --help => 查看编译配置项--help打印帮助信息。

--prefix=PATH设置软件安装⽬录路径。

--sbin-path=PATH设置可执⾏⽂件安装⽬录路径。

--modules-path=PATH设置模块安装⽬录路径。

--conf-path=PATH设置配置⽂件安装⽬录路径。

--error-log-path=PATH设置错误⽇志⽂件安装⽬录路径。

--pid-path=PATH设置进程⽂件安装⽬录路径。

--lock-path=PATH设置NGINX锁⽂件安装⽬录路径,当NGINX运⾏时会⾃动创建该⽂件,⽤于在⼀台服务器上只允许运⾏⼀个NGINX服务。

--user=USER设置运⾏进程时所使⽤的系统⽤户,如果没有指定,则默认为nobody,就算安装时不指定,后期也可以通过修改"nginx.conf"配置⽂件中的"user"项修改。

--group=GROUP设置运⾏进程时所使⽤的⽤户组。

--build=NAME设置编译名,⼀个描述,没有任何其他作⽤。

--builddir=DIR设置编译⽬录,会将编译后⽣成的⽂件写⼊到这个⽬录中。

----------------------------------------------------------------------------------with-select_module--without-select_module启⽤或禁⽤select事件驱动模型。

学会使用Nginx进行Web服务器配置和负载均衡

学会使用Nginx进行Web服务器配置和负载均衡

学会使用Nginx进行Web服务器配置和负载均衡Nginx(发音为engine-x)是一个高性能的开源Web服务器。

它被广泛应用于构建高性能和可靠的网站,实现负载均衡,进行反向代理,以及提供动态内容的缓存。

本文将介绍如何使用Nginx 进行Web服务器配置和负载均衡。

第一章:Nginx简介Nginx是一款轻量级的服务器,它具有卓越的性能和可扩展性。

与传统的Web服务器相比,Nginx采用了事件驱动的架构,能够处理大量的并发请求,同时占用较少的系统资源。

此外,Nginx还支持高级功能如负载均衡、反向代理和HTTPS。

第二章:安装和配置Nginx安装Nginx非常简单。

在Linux系统中,可以通过包管理器(如apt-get或yum)进行安装。

一旦安装完成,我们需要对Nginx进行基本配置。

首先,我们需要编辑Nginx的主配置文件,通常位于/etc/nginx/nginx.conf。

在此文件中,我们可以配置Nginx的全局设置,如监听的端口、日志文件的位置等。

我们还可以创建一个新的配置文件,用于特定的虚拟主机。

第三章:配置虚拟主机Nginx支持多个虚拟主机配置,每个虚拟主机都可以有独立的设置和规则。

为了配置虚拟主机,我们需要在Nginx的配置文件中添加server块。

在server块中,我们可以指定虚拟主机的监听端口、域名以及其他相关设置。

此外,我们还可以使用location块来定义URL路径的匹配规则,并指定相应的动作。

例如,我们可以将所有以/api 开头的请求转发到后端API服务器。

第四章:负载均衡负载均衡是将请求分发到多个服务器上,以实现更好的性能和可用性。

Nginx提供了多种负载均衡策略,如轮询、加权轮询和IP哈希。

要配置负载均衡,我们需要在Nginx的配置文件中添加upstream块。

在upstream块中,我们可以列出多个后端服务器,并为每个服务器指定权重。

然后,我们将这个upstream块与虚拟主机的location块关联起来,以实现请求的负载均衡。

写给大忙人的nginx核心配置详解(匹配重写、集群、环境变量上下文、Lua)

写给大忙人的nginx核心配置详解(匹配重写、集群、环境变量上下文、Lua)

写给⼤忙⼈的nginx核⼼配置详解(匹配重写、集群、环境变量上下⽂、Lua) 由于当前很多应该都是前后端分离了,同时⼤量的基于http的分布式和微服务架构,使得很多时候应⽤和不同项⽬组之间的系统相互来回调⽤,关系复杂。

如果使⽤传统的做法,都在应⽤中进⾏各种处理和判断,不仅维护复杂、容易出错,还⼤⼤增加开发、调试的⼯作量,在nginx中,有不少的⾮功能类其实是可以帮我们处理掉的,所以,对于现代开发⼈员来说,有必要对nginx的location⽐较熟悉,以便达到事半功倍的效果,⽐如说,⽇常的图⽚上传就是个例⼦,我们可以将图⽚上传到特定的⽬录,然后配置nginx对于⽤户上传的图⽚,都转发到特定的⽬录,该⽬录不⼀定是nginx的html⽬录,甚⾄是挂载的盘,这样对于⼀般的应⽤来说,既可以按应⽤规划设置⽂件服务器,也避免了需要安装和维护ftp服务器软件的⼯作。

nginx配置 因为Nginx是模块化架构,每个模块都会有⼀系列⾃⼰引⼊的指令,这些指令通常包含在指令块中,⽐如events模块,就有⼀个events 块。

如下所⽰:events {worker_connections 1024;} 对于最常⽤的部分,指令块通常层层嵌套。

例如:http {server {listen 80;server_name ;access_log /var/log/nginx/.log;location ^~ /admin/ {index index.php;}}} 默认情况下,之块会继承⽗块中声明的设置,除⾮明确覆盖。

在nginx的配置中,语法⽐较复杂,⽽且不同的指令,可能规则完全不同。

⽐如root仅接受⼀个字符,声明服务于⽹站的⽂件的根路径。

模块中通常定义了可以⽤于指令中的变量,变量以$开头。

某些指令中不允许使⽤变量,⽐如error_log,此时它会被当做字⾯量处理。

指令的值可以带双引号、带单引号、不带引号,除⾮使⽤了特殊符号,此时需要⽤引号括起来以避免nginx解析误解,对于特殊符号需要当做字⾯量使⽤的,需要⽤\,⽐如$。

Nginx配置文件(nginx.conf)配置详解

Nginx配置文件(nginx.conf)配置详解

Nginx配置文件(nginx.conf)配置详解usernginxnginx ;Nginx用户及组:用户组。

window下不指定worker_processes 8;工作进程:数目。

根据硬件调整,通常等于CPU数量或者2倍于CPU。

error_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;错误日志:存放路径。

pid logs/nginx.pid;pid(进程标识符):存放路径。

worker_rlimit_nofile 204800;指定进程可以打开的最大描述符:数目。

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

events{useepoll;使用epoll的I/O 模型。

linux建议epoll,FreeBSD建议采用kqueue,window下不指定。

补充说明:与apache相类,nginx针对不同的操作系统,有不同的事件模型A)标准事件模型Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或pollB)高效事件模型Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X 系统使用kqueue可能会造成内核崩溃。

很详细的Nginx配置说明

很详细的Nginx配置说明

很详细的Nginx配置说明Nginx是lgor Sysoev为俄罗斯访问量第⼆的rambler.ru站点设计开发的。

从2004年发布⾄今,凭借开源的⼒量,已经接近成熟与完善。

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。

⽀持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。

并且⽀持很多第三⽅的模块扩展。

Nginx的稳定性、功能集、⽰例配置⽂件和低系统资源的消耗让他后来居上,在全球活跃的⽹站中有12.18%的使⽤⽐率,⼤约为2220万个⽹站。

Nginx常⽤功能1、Http代理,反向代理:作为web服务器最常⽤的功能之⼀,尤其是反向代理。

这⾥我给来2张图,对正向代理与反响代理做个诠释,具体细节,⼤家可以翻阅下资料。

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。

Nginx可以根据不同的正则匹配,采取不同的转发策略,⽐如图⽚⽂件结尾的⾛⽂件服务器,动态页⾯⾛web服务器,只要你正则写的没问题,⼜有相对应的服务器解决⽅案,你就可以随⼼所欲的玩。

并且Nginx对返回结果进⾏错误页跳转,异常判断等。

如果被分发的服务器存在异常,他可以将请求重新转发给另外⼀台服务器,然后⾃动去除异常服务器。

2、负载均衡Nginx提供的负载均衡策略有2种:内置策略和扩展策略。

内置策略为轮询,加权轮询,Ip hash。

扩展策略,就天马⾏空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他⼀⼀找出来做下实现。

上3个图,理解这三种负载均衡算法的实现Ip hash算法,对客户端请求的ip进⾏hash操作,然后根据hash结果将同⼀个客户端ip的请求分发给同⼀台服务器进⾏处理,可以解决session不共享的问题。

3、web缓存Nginx可以对不同的⽂件做不同的缓存处理,配置灵活,并且⽀持FastCGI_Cache,主要⽤于对FastCGI的动态程序进⾏缓存。

Nginx配置文件nginx.conf详解

Nginx配置文件nginx.conf详解

Nginx配置⽂件nginx.conf详解Nginx 总的配置⽂件位置 /usr/local/nginx/conf/nginx.confnginx 正则匹配⼀.正则表达式匹配,其中:1. ~ 为区分⼤⼩写匹配2. ~* 为不区分⼤⼩写匹配3. !~和!~*分别为区分⼤⼩写不匹配及不区分⼤⼩写不匹配⼆.⽂件及⽬录匹配,其中:1. -f和!-f⽤来判断是否存在⽂件2. -d和!-d⽤来判断是否存在⽬录3. -e和!-e⽤来判断是否存在⽂件或⽬录4. -x和!-x⽤来判断⽂件是否可执⾏三.rewrite指令的最后⼀项参数为flag标记,flag标记有:1. last 相当于apache⾥⾯的[L]标记,表⽰rewrite。

2. break本条规则匹配完成后,终⽌匹配,不再匹配后⾯的规则。

3. redirect 返回302临时重定向,浏览器地址会显⽰跳转后的URL地址。

4. permanent 返回301永久重定向,浏览器地址会显⽰跳转后的URL地址。

使⽤last和break实现URI重写,浏览器地址栏不变。

使⽤alias指令必须⽤last标记;使⽤proxy_pass指令时,需要使⽤break标记。

Last标记在本条rewrite规则执⾏完毕后,会对其所在server{......}标签重新发起请求break标记则在本条规则匹配完成后,终⽌匹配。

四.NginxRewrite 规则相关指令 1.break指令 使⽤环境:server,location,if; 该指令的作⽤是完成当前的规则集,不再处理rewrite指令。

2.if指令 使⽤环境:server,location 该指令⽤于检查⼀个条件是否符合,如果条件符合,则执⾏⼤括号内的语句。

If指令不⽀持嵌套,不⽀持多个条件&&和||处理。

3.return指令 语法:return code ; 使⽤环境:server,location,if; 该指令⽤于结束规则的执⾏并返回状态码给客户端。

nginx的配置规则

nginx的配置规则

深入理解Nginx的配置规则在当今的互联网世界中,Nginx已经成为了一个不可或缺的角色。

作为一款高性能的HTTP和反向代理服务器,Nginx以其轻量级、高并发、稳定性和灵活性而广受赞誉。

然而,要充分发挥出Nginx的强大功能,就需要对它的配置规则有一个深入的理解。

本文将从基础概念出发,详细介绍Nginx的配置规则。

首先,我们需要理解的是Nginx的配置文件结构。

Nginx的配置文件通常位于/etc/nginx/nginx.conf,这个文件包含了全局配置、events块、http块等部分。

其中,全局配置部分定义了Nginx的基本运行参数,如工作进程数、错误日志路径等;events块用于设置网络连接相关的参数;http块则包含了与HTTP协议相关的所有配置,是Nginx配置的重点。

在http块中,我们可以看到一系列的server块,每个server块代表一个独立的虚拟主机。

每个server块内部又可以包含多个location块,用于处理特定的URL请求。

这种分层的配置结构使得Nginx的配置非常灵活,可以根据不同的需求来定制服务。

那么,具体来说,如何配置Nginx呢?以下是一些常见的配置示例:1. 设置监听端口:```listen 80;```这行代码表示Nginx将在80端口上监听HTTP请求。

2. 设置根目录:```root /usr/share/nginx/html;```这行代码指定了Nginx服务的根目录,所有的静态文件都将从这里提供。

3. 配置反向代理:```location / {proxy_pass localhost:8080;}```这行代码表示,当接收到任何以/开头的请求时,Nginx都会将请求转发到本地的8080端口。

4. URL重写:```location /images/ {rewrite ^/images/(.*)$ /img/$1 last;}```这行代码表示,当接收到/images/开头的请求时,Nginx会将URL中的/images/重写为/img/。

NGINX服务器配置与优化指南

NGINX服务器配置与优化指南

NGINX服务器配置与优化指南第1章 NGINX基础概念与安装 (3)1.1 NGINX简介 (3)1.2 安装NGINX (3)1.2.1 在Debian/Ubuntu系统上安装 (3)1.2.2 在Red Hat/CentOS系统上安装 (3)1.2.3 在macOS上安装 (3)1.3 配置文件结构介绍 (4)第2章基本配置与启动 (4)2.1 配置语法规则 (4)2.2 配置指令概述 (5)2.3 启动、停止与重启NGINX (5)第3章虚拟主机配置 (6)3.1 基于IP的虚拟主机 (6)3.2 基于端口的虚拟主机 (6)3.3 基于域名的虚拟主机 (7)第4章 Location匹配规则 (8)4.1 location指令用法 (8)4.2 正则表达式匹配 (8)4.3 常用匹配规则案例 (9)第5章文件处理与缓存 (10)5.1 静态文件处理 (10)5.1.1 静态文件路径配置 (10)5.1.2 文件类型处理 (10)5.1.3 文件压缩 (10)5.1.4 expires缓存 (10)5.2 文件缓存配置 (10)5.2.1 开启open_file_cache (10)5.2.2 开启open_file_cache_errors (10)5.2.3 开启proxy_cache (10)5.3 expires指令使用 (11)5.3.1 expires指令参数 (11)5.3.2 expires配置示例 (11)第6章反向代理与负载均衡 (11)6.1 反向代理原理与配置 (11)6.1.1 反向代理概述 (11)6.1.2 反向代理的工作原理 (11)6.1.3 NGINX反向代理配置 (11)6.2 负载均衡策略 (12)6.2.1 轮询(Round Robin) (12)6.2.2 最少连接(Least Connections) (12)6.2.3 IP哈希(IP Hash) (12)6.2.4 加权负载均衡 (12)6.3 负载均衡的高级配置 (13)6.3.1 健康检查 (13)6.3.2 负载均衡器故障转移 (13)6.3.3 会话保持 (13)6.3.4 动态负载均衡 (13)第7章 SSL/TLS配置与优化 (13)7.1 SSL/TLS基础概念 (13)7.2 证书与私钥配置 (14)7.3 SSL优化与安全增强 (14)第8章功能优化与压力测试 (15)8.1 功能优化策略 (15)8.1.1 系统层面优化 (15)8.1.2 NGINX配置优化 (15)8.1.3 缓存策略优化 (16)8.2 压力测试工具介绍 (16)8.2.1 Apache Bench (ab) (16)8.2.2 YSlow (16)8.2.3 JMeter (16)8.2.4 LoadRunner (16)8.3 功能调优案例分析 (16)第9章安全性与防护 (17)9.1 常见攻击类型与防护策略 (17)9.1.1 DDoS攻击 (17)9.1.2 SQL注入攻击 (17)9.1.3 XSS攻击 (17)9.2 配置安全头部 (18)9.2.1 HTTP Strict Transport Security(HSTS) (18)9.2.2 Content Security Policy(CSP) (18)9.2.3 XContentTypeOptions (18)9.2.4 XFrameOptions (18)9.3 限制请求速率与连接数 (18)9.3.1 限制请求速率 (18)9.3.2 限制连接数 (19)第10章监控与故障排查 (19)10.1 监控工具与指标 (19)10.1.1 监控工具 (19)10.1.2 关键指标 (19)10.2 日志分析 (20)10.2.1 日志类型 (20)10.2.2 分析方法 (20)10.3 常见故障排查方法与技巧 (20)第1章 NGINX基础概念与安装1.1 NGINX简介NGINX(发音为“EngineX”)是一个高功能的HTTP和反向代理服务器,同时也用于邮件(IMAP/POP3/SMTP)代理服务器。

Nginx-v1.6.2配置详解-CentOS6.5

Nginx-v1.6.2配置详解-CentOS6.5

一.准备工作系统:CentOS-6.5虚拟机:VMware111.工具1)gcc、gcc-c++、zlib、zlib-devel、openssl-1.0.1j.tar.gz、pcre-8.32.tar.gz、nginx-1.6.2.tar.gz、jdk-7u71-linux-x64.tar.gz、apache-tomcat-7.0.50.tar.gz2)推荐将需要安装的工具都放在一个文件夹中,解压缩后不要删除;2.安装安装前请将用户切换为root用户。

1)gcc、gcc-c++安装yum –y install gcc gcc-c++Tip: 判断是否已经安装gcc或gcc-c++命令:rpm –qa|grep gcc(gcc-c++)2)zlib、zlib-devel安装yum –y install zlib zlib-develTip: 判断是否安装命令同上3.pcre的安装解压缩:tar –zxvf pcre-8.36.tar.gz配置:./configure –prefix=/usr/local/pcre编译:make安装:make install默认安装在/usr/local/pcre4.openssl的安装解压缩:tar –zxvf openssl-1.0.1j.tar.gz配置:./config编译:make安装:make installTip:在make&make install时请耐心等待,openssl默认安装在/usr/local/ssl5.nginx的安装nginx安装前要先安装OpenSSL✓解压缩:tar –zxvf nginx-1.6.2.tar.gz✓配置:./configure--with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/zhao/openssl-1.0.1j --with-http_gzip_static_module --with-pcre=/home/zhao/pcre-8.36Tip:--with-http_stub_status_module :启动nginx Status功能,用来监控Nginx的当前状态--with-http_ssl_module:支持SSL--with-openssl=/home/zhao/openssl-1.0.1j:启动SSL(这里制定源码目录,而不是编译后的安装目录)--with-pcre=/home/zhao/pcre-8.36:启用正则表达式(这里制定源码目录,而不是编译后的安装目录)--with-http_gzip_static_module:启用静态压缩--with-http_memcached_module:启用memcache缓存--with-http_rewrite_module:启用支持URL重写(需要安装pcre,否则configure时报错)✓编译:(编译时间比较长,请耐心等待)make✓安装:make installnginx默认安装路径/usr/local/nginx,以下的配置示例都使用该地址。

Nginx实战篇 安装部署与配置全解析

Nginx实战篇 安装部署与配置全解析

Nginx实战篇安装部署与配置全解析目录1 写在正文之前 (3)2 部署步骤 (3)2.1 下载介质 (3)2.2 编译部署介质 (4)2.2.1 部署zlib库 (4)2.2.2 部署pcre库 (4)2.2.3 部署nginx (4)2.2.4 启动和停止nginx (5)2.3 配置nginx (5)2.3.1 配置gzip压缩 (6)2.3.2 高性能配置 (6)2.3.3 配置nginx状态监控 (7)2.3.4 反向代理实现动静结合(NgInx + Tomcat / WebLogic / WebSphere ) (7)2.3.5 配置虚拟主机 (8)2.3.6 配置静态文件超时时间 (9)2.3.7 配置日志格式与按天轮换 (9)2.4 其它配置 (10)2.4.1 禁止出错时泄露服务器的版本 (10)2.4.2 限制客户端POST提交的数据大小 (10)2.4.3 静态目录root和alias的区别 (11)2.4.4 4.限制并发数和下载速率 (11)2.4.5 指定nginx提供服务的用户: (11)2.4.6 指定错误页 (11)2.5 高级配置 (11)2.5.1 利用Nginx实现开源负载均衡的分发 (11)2.5.2 利用Nginx实现静态文件的权限控制 (12)1写在正文之前最近质保在计划做Portal的性能测试,考虑到在国家统计局项目前期规划到2000多并发的PV情况下面,静态文件的压力会超过10000。

根据对Nginx的介绍,Nginx的性能和Apache相比,会有100%的提升。

原因:得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。

目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。

所以计划对主流的Web Server进行对比性能测试,特引入Nginx进行配置,在测试环境中现场实战了一次,特将过程记录总结如下。

nginx常用配置文件详解

nginx常用配置文件详解

nginx常⽤配置⽂件详解1、主配置段常⽤参数user username 指定⽤于运⾏worker进程的⽤户,默认和在编译nginx是指定--user参数有关worker_processes auto worker进程的个数,通常应该为物理CPU核⼼数量减1或者减2,worker_processes auto;可以根据物理CPU⾃动设定error_log logs/error.log info; 错误⽇志⽂件及级别pid logs/nginx.pid; 指定nginx进程的PID⽂件路径worker_rlimit_nofile 65535; 指定每个worker进程能打开的最⼤⽂件描述符数量2、event配置段常⽤参数worker_connections 1024; 每个worker进程所能够响应的最⼤并发请求数量use [epoll | rgsig | select | poll]] 定义使⽤的事件模型,建议⽤epoll3、http配置段常⽤参数include path/to/file 包含其他扩展配置⽂件default_typeapplication/octet-stream; 响应类型log_format main 。

定义⽇志名字以及⽇格式化access_log logs/access.log main; 定义⽇志⽂件路径,格式sendfile on|off 启⽤sendfile功能,静态⽂件直接在内核中封装响应,⽽不是从内核空间到⽤户空间封装后,再发往内核空间.tcp_nopush on|off 仅在sendfile为on时有⽤, 其功能:尝试将多个报⽂⾸部压缩成⼀个发送tcp_nodelay on|off 对keepalive模式下的连接是否使⽤tcp_nodelay选项,默认关闭.其功能为:把多个⼩报⽂合并为⼀个报⽂,⼀起发送. 此机制可以提⾼带宽利⽤率,将发往同⼀个主机很⼩的TCP报⽂合并成⼀个,实际⽣产对于⽤户请求即使浪费带宽也不能合并请求keepalive_timeout 65; 设置keepalive连接的超时时长,0表⽰禁⽌长连接,默认65sgzip on|off 启⽤或禁⽤gzip压缩响应报⽂gzip_buffers number size; default 32位系统4k,64位系统8kgzip_comp_level LEVEL; 压缩⽐,1-9,默认为1gzip_disable regex ...; regex是为⽤于匹配客户端响应器类型的正则表达式,表⽰对何种浏览器禁⽌使⽤压缩功能gzip_min_length LENGTH; 触发压缩功能的响应报⽂的最⼩长度gzip_http_version 1.0 | 1.1; 设定启⽤压缩功能的最⼩版本gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etg | auth | any ...; 定义对客户端请求的具有何种请求属性的资源启⽤压缩功能,如expired表⽰:对由于使⽤expire⾸部⽽⽆法缓存的对象启⽤压缩功能gzip_types mime.type; 指明对那些类型的资源进⾏压缩server {} 定义⼀个虚拟主机listen 80; 监听地址server_name 主机名charset 字符集编码location [ = | ~ | ~* | ^~ ] url { ...} = : URI的精确匹配 ~ : 做正则表达式匹配,区分字符⼤⼩写 ~* : 做正则表达式匹配,不区分字符⼤⼩写 ^~ : URI的左半部分匹配,不区分字符⼤⼩写 允许根据⽤户请求的URI来匹配定义的各location,匹配到时, 此请求将被相应的location块中的配置所处理, ⽤于为需要⽤到专⽤配置的uri 提供特定配置. 当匹配多次时,其匹配优先级为:精确匹配=,^~,~或~*,不带符号的URL, 如果优先级都⼀样, 就匹配最精确的规则root 设置html⽂件资源的路径index 设置默认主页alias 定义⽂件别名。

  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函数中找到答案。

相关文档
最新文档