当前位置:文档之家› nginx配置解析详解(一)

nginx配置解析详解(一)

nginx配置解析详解(一)
nginx配置解析详解(一)

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_t

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

Windows下Nginx的安装与配置

Windows下Nginx的安装与配置 Windows下Nginx的安装与配置 Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web服务器和反向代理服务器及电子邮件IMAP/POP3/SMTP代理服务器。 Nginx是由俄罗斯的程序设计师Igor Sysoev 所开发,为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多时间了,Igor 将源代码以类BSD许可证的形式发布。 自Nginx 发布四年来,Nginx 已经因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。Nginx 超越Apache的高性能和稳定性,使得国内使用Nginx 作为Web 服务器的网站也越来越多。 目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;新近发现Nginx 技术在国内日趋火热,越来越多的网站开始应用部署Nginx。 一、首先去官网下载nginx1.0.11的Windows版本,官网下载: https://www.doczj.com/doc/331938025.html,/download/nginx-1.0.11.zip 下载到软件包后,解压nginx-nginx1.0.11.zip 包到你喜欢的根目录,并将目录名改为nginx。 然后,执行下列操作: cd nginx start nginx 这样,nginx 服务就启动了。打开任务管理器,查看nginx.exe 进程,有二个进程会显示,占用系统资源,那是相当的少。然后再打开浏览器,输入http://127.0.0.1/就可以看到nginx 的欢迎页面了,非常友好 nginx -s stop // 停止nginx nginx -s reload // 重新加载配置文件 nginx -s quit // 退出nginx 二、接下来就是配置nginx的conf文件了。下面是我的配置: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;

nginx负载均衡宕机配置

1.摘要 (1)结论 详细描述了nginx记录失效节点的6种状态(time out、connect refuse、500、502、503、504,后四项5XX需要配置proxy_next_upstream中的状态才可 以生效)、失效节点的触发条件和节点的恢复条件、所有节点失效后nginx会进 行恢复并进行重新监听。 (2)Nginx 负载均衡方式介绍 Nginx的负载均衡方式一共有4种:rr(轮询模式)、ip_hash、fair、url_hash。(3)Ngxin负载均衡和相关反向代理配置内容 Nginx负载均衡和与容错相关的反向代理的配置。 (4)获取后端流程 后端server的自动容错流程图。 (5)测试环境和测试结果 针对几种错误方式进行自动容错测试。 2.结论 (1)nginx 判断节点失效状态 Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不以HTTP错误状态进行判断失败,因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;除非添加了proxy_next_upstream指令设置 对404、502、503、504、500和time out等错误进行转到备机处理,在 next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录),综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态,而502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP 错误到fails中,当fails大于等于max_fails时,则该节点失效; (2)nginx 处理节点失效和恢复的触发条件 nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所 有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间 进行设置,当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点 状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都 失效后,该节点重新置为有效,重新探测;

nginx设置rewrite规则

Nginx 设置rewrite规则 Windows下环境为wamp ,在wamp 环境下,设置rewite规则时,很是简单,只需要打开Apache配置中的rewrite规则,项目中使用rewrite规则时只需创建.htaccess文件,在文件中编写规则,Apache会自动进行解析,但是在linux下则有些不一样。 Linux下环境若是lamp,则和wamp下是相同的,但当环境为lnmp时,需要注意进行如下配置方法: 根据所安装的环境情况,如果环境是lnmp集成环境,在配置rewrite规则时,因为集成环境,在安装完毕后,在安装的目录/usr/local/nginx/conf下,会生成一个文件“wordparss”,这个文件中是专门用于写rewrite规则所用,你可以在这个文件中书写rewrite规则,nginx 的rewrite规则与Apache的规则基本是相同的,只是在文件中书写的方法不同,wordpaess 问件中默认是有一个规则的,如: 利用location加载访问路径,“/”,指代由访问路径的根目录开始, 用if对加载的路径$request_filename 进行验证: 1 、-f 和!-f 用来判断文件是否存在 2、-d 和!-d 用来判断目录是否存在 3 、-e 和!-e 用来判断文件或目录是否存在 4、-x 和!-x 用来判断文件是否可执行 Flag标记: 1、last 相当于Apache里的[L]标记,表示完成rewrite 2、break 终止匹配, 不再匹配后面的规则 3、redirect 返回302临时重定向地址栏会显示跳转后的地址 4、permanent 返回301永久重定向地址栏会显示跳转后的地址 因为在lnmp集成环境下要配置虚拟域名是可以进行自动生成的,生成后会在/usr/local/nginx/conf/vhost 下生成一个以虚拟域名的名字的文件,如:lin_hp.its.conf,而所对应的rewrite规则最好在与域名相对应的配置文件中进行配置,这样不会说,如果有多个域名时,他们所对应的rewrite规则不同,在公共的wordpress文件中配置引起冲突,所配置的方法与在wprdpress文件中是相同的,如:

nginx配置解析详解(一)

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的处理。。。以此类推!。

Nginx反向代理服务器的工作原理

最近有打算研读nginx源代码,看到网上介绍nginx可以作为一个反向代理服务器完成负载均衡。所以搜罗了一些关于反向代理服务器的内容,整理综合。 一概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。 图1 反向代理服务器的基本原理 二反向代理服务器的工作原理 反向代理服务器通常有两种模型,它可以作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。 1,作内容服务器的替身 如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火

墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。 当客户机向提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器(参见图 2)。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。 这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。 图2 反向代理服务器作为内容服务器的替身 可以配置防火墙路由器,使其只允许特定端口上的特定服务器(在本例中为其所分配端口上的代理服务器)有权通过防火墙进行访问,而不允许其他任何机器进出。 2,作为内容服务器的负载均衡器 可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。 对于客户机发往真正服务器的请求,代理服务器起着中间调停者的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS 可

Nginx系列讲解

Nginx系列 一信号与配置 一、Nginx与信号 Nginx支持平滑重启,相比于Apache,修改了配置文件后可以不需要先停止程序,再重新启动。 1、启动 nginx –c nginx.conf 其中,-c nginx.conf可以省略不写。如果省略,则默认加载安装目录下的conf子目录中的nginx.conf。 2、停止 停止的方式有很多种,kill时传入不同的信号来结束或者平滑重启。Nginx的进程号记录在Pid文件中,Pid文件的位置可以在conf/nginx.conf中找到。如下图: 当然,也可以根据 ps –ef | grep nginx 来查找Nginx的进程号。我们可以通过kill命令来结束Nginx。 从容停止Nginx: kill –QUIT Nginx进程ID 或 kill – QUIT /usr/local/nginx/logs/nginx.pid 快速停止Nginx: kill –TERM Nginx进程ID 或

kill – TERM /usr/local/nginx/logs/nginx.pid 或 kill –INT Nginx进程ID 或 kill – INT /usr/local/nginx/logs/nginx.pid 强制停止Nginx: kill –9 Nginx进程ID 或 kill -9 /usr/local/nginx/logs/nginx.pid 或 pkill -9 nginx 3、重启 如果修改了Nginx的配置文件,想要重启Nginx。同样可以使用kill命令来传递信号。不过,在此之前,我强烈建议先检查并测试配置文件是否正确。 测试配置文件: nginx –t –c conf/nginx.conf 若提示unknow directive *** in conf/nginx.conf:55. Configuration file conf/nginx.conf test failed,则证明在第55行的***是非法的,需要修改。 若提示the configuration file conf/nginx.conf syntax is ok. Configuration file conf/nginx.conf test is successful,则证明配置文件测试通过,可以重启Nginx了。 平滑重启Nginx: kill –HUP Nginx进程ID 或

Nginx与PHP(FastCGI)的安装、配置与优化

Nginx与PHP(FastCGI)的安装、配置与优化 FastCGI的介绍和工作原理 首先简单的介绍下FastCGI: FastCGI是语言无关的、可伸缩结构的CGI开放扩展,其主要行为是将CGI解释器进行保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等。 FastCGI的工作原理是: (1)FastCGI进程管理器自身初始化,启动多个CGI解释器进程(多个php-cgi进程)并等待来自Web Server的连接。在文本中,采用PHP-FPM进程管理器启动多个php-cgi FastCGI进程。启动php-cgi FastCGI进程时,可以配置以TCP和UNIX套接字两种方式启动。 (2)当客户端请求达到Web服务器(Nginx)时,Web服务器将请求采用TCP协议或UNIX 套接字方式转发到FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器(子进程)。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。 (3)FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web服务器(Nginx)。当FastCGI子进程关闭连接时,请求便告知处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理的下一个连接。而在一般的普通CGI模式中,php-cgi在此便退出了。 PHP-FPM PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 https://www.doczj.com/doc/331938025.html,/downloads.php下载得到.PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

使用Nginx搭建反向代理

引言:最近公司有台服务器遭受DDOS攻击,流量在70M以上,由于服务器硬件配置较高所以不需要DDOS硬件防火墙。但我们要知道,IDC机房是 肯定不允许这种流量一直处于这么高的,因为没法具体知道后面陆续攻击的流量会有多大,如果流量过大就会导致整个IDC网络瘫痪。我们都知道北方的数据中心和南方的数据中心从带宽出口上来讲南方多数机房完全有能力扛得住DDOS攻击,东莞的电信机房就不错。有朋友说过面对这种攻击可以在南方电信 在放一台服务器,然后做个反向代理;令我不解的是倘若再在南方放一台服务器,然后在南方电信服务器上做反向代理的话北方的用户访问速度肯定会很慢(南方机房多为电信单线,北京的多为双线或BGP线路)。好了,我们言归正传,不管用反向代理是怎么去实现,首先我们要解决的是如何搭建一台反向代理服务器,免得临时抱佛脚。 首先我们来看理解一下什么是反向代理,如下图:当客户机向站点发出请求时,请求将转到代理服务器,然后然后代理服务器将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户,对于访问服务器的用户来讲,此时的代理服务器对外就表现为一台服务器;我们还可以在反向代理服务器上加上一些策略,这样就对web服务器进行了一种安全保护,即使用户想入侵网站,也无法到达web服务器;反向代理服务器后端还可以放置多台 web服务器,从而可以减轻网站压力,起到集群作用 我们都知道Nginx是一款非常不错的程序,其最大的优点就是能承载高并发连接,这次我们就用Nginx来做一台反向代理服务器 环境描述:反向代理服务器为Linux系统,安装有Nginx;web服务器为windows 系统,装有IIS 目标:客户端在访问192.168.1.20的时候得到的内容必须是192.168.1.10这台web服务器上的内容

window下nginx配置

原来一直以为nginx只能在Linux下搭建,最近查了些资料才恍然大悟,Windows下其实也可以跑nginx。当你的网站访问量越来越高的时候,一台服务器已经没有办法承受流量压力,后果可想而知,怎么办呢?那就增加几台服务器来做负载吧。但当下的硬件设施又是贵得离谱,比如F5,所以这种情况下,免费的nginx成了我们不错的选择,nginx目前好多门户网站与大访问量的网站都在使用做为HTTP服务器,所以nginx是相当优秀的…… 实验环境:(2台服务器) 第一台: 系统:Win2003 nginx:nginx/Windows-0.8.32 IP:192.168.0.51 环境:本地 第二台: 系统:Win2003 IP:192.168.0.52 环境:远程 说明: 本次测试,软件nginx放在本地(192.168.0.51),也就是说放在域名绑定的那台服务器,这台服务器的IIS不能使用80端口,因为等一下nginx软件要使用80这个端口。(为了方便,我将本机的hosts文件添加了我要测试的域名192.168.0.51 https://www.doczj.com/doc/331938025.html,) 下载nginx的地址如下: nginx下载:https://www.doczj.com/doc/331938025.html,/ 下载解压到C:\,把目录名改成nginx 一切准备就绪,开始实验: No.1: 在本地(192.168.0.51)这台服务器IIS创建一个网站,使用端口为808,如下图:

IIS 网站绑定设置图 No.2: 在远程192.168.0.52的IIS创建一个网站,使用端口为80,如下图: No.3: 好了,以上已经设置好两台服务器的IIS了,下面配置nginx软件来实现网站负载均衡,打开如下文件: C:\nginx\conf\nginx.conf 1、找到内容server { 在它的上面加入如下内容:

linux下Nginx+tomcat整合的安装与配置

linux下Nginx+tomcat整合的安装与配置 目的:搭建Nginx与tomcat整合,用Nginx代替apache 步骤: 一、安装Tomcat和JDK 1、上传apache-tomcat-6.0.18.tar.gz和jdk-6u12-linux-i586.bin至/usr/local 2、执行如下命令安装tomcat: 查看 打印? 1. 2.#cd /usr/local 3.#tar zxvf apache-tomcat-6.0.18.tar.gz 解压完成后将apache-tomcat-6.0.18重命名为tomcat 3、执行如下命令安装JDK: 查看 打印? 1. 2.#./jdk-6u12-linux-i586.bin 4、配置环境变量: 编辑/etc下的profile文件,加上如下内容: 查看 打印? 1. 2.JAVA_HOME="/usr/local/jdk1.6.0_12" 3.CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib" 4.PATH=".:$PATH:$JAVA_HOME/bin " 5. 6.CATALINA_HOME="/usr/local/tomcat" 7.export JAVA_HOME CATALINA_HOME 5、启动tomcat并输入http://localhost:8080,如果看到猫的页面即tomcat和jdk安装成功 6、新建文件目录/home/www为网站存放目录,设置server.xml文件,在Host name="localhost"处将appBase=的指向路径改为/home/www/web

Nginx高级配置

Nginx高级配置 1. Nginx连接后端的方式:反向代理(proxy_pass)、直连 fastcgi(fastcgi_pass) 例子: fastcgi_pass backend1; proxy_pass http://backend2; location块中配置此项,表示用反向代理或直连fastcgi的方式连接后端服务,其中backend1、backend2为upstream配置,其中配置下游的ip&port列表和调度参数,见下文。 注意:fastcgi_pass与proxy_pass是互斥配置,不能同时生效。 2. Nginx调度与负载均衡配置(upstream 配置) 1) 轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器。weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,weight默认值为1。 例如: upstreambakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; } 2) ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如: upstreambakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 3) hash 每个请求按访问$hash_seed的hash结果分配。 例如: upstreambakend { hash $hash_seed; server 192.168.0.14:88; server 192.168.0.15:80;

NGinx分布式部署测试实例图解

https://www.doczj.com/doc/331938025.html,+Mvc+NGinx+IIS分布式部署和负载平衡实例图解 目的:在IIS中创建四个相同的网站,浏览器访问同一个地址,通过NGinx转到不同的IIS 网站。 测试条件: Windows 7 X64旗舰版+Visual Studio 2017专业版 1、创建https://www.doczj.com/doc/331938025.html, +Mvc WebApplication 在VS运行后的页面效果如下:

2、发布网站 3、IIS中部署四个网站 创建三个应用程序池,端口分别为: 8001、8002、8003,8004分别对应四个网站。 为区分三个网站,把Index.cshtml文件中的“Nginx测试程序”这行字分别改为:Nginx测试程序--------1 Nginx测试程序--------2 Nginx测试程序--------3 Nginx测试程序--------4 如下图: 部署四个网站后,打开页面效果如下:

到此,说明四个网站部署后单独访问都没有问题。下面开始部署NGInx的负载平衡。

4、NGInx的安装 4.1、下载nginx-1.1 5.1 下载后解压到D:\nginx文件夹,解压后的文件夹如下: 4.2、修改配置文件nginx.conf nginx.conf文件位于D:\nginx\conf目录下,nginx.conf默认内容如下。用记事本打开文件,nginx.conf文件的内容如下: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" '

Nginx-1.0.15负载均衡安装配置

nginx-1.0.15负载均衡安装配置 OS:ubuntu 1、取得软件 pcre-8.30.zip nginx-1.0.15.tar.gz apt-get install gcclibpcre*zlib 2、安装rewrite的支持库pcre unzip pcre-8.30.zip cd pcre-8.30 ./configure make make install 3、配置nginx.conf cat /usr/local/nginx/conf/nginx.conf | grep -Ev '(#|^$)' worker_processes 1; events { worker_connections 1024; } http { includemime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream https://www.doczj.com/doc/331938025.html, { server 10.0.0.252:8080; server 10.0.0.253:8080; server 10.0.0.105:8080; } server { listen 80; server_name https://www.doczj.com/doc/331938025.html,; location ~ ^/$ { rewrite ^/(.*) /jboss/ break; proxy_pass https://www.doczj.com/doc/331938025.html,; } } }

4、启动nginx服务 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

在Linux虚拟机中搭建Nginx服务器以及SSL、反向代理和负载均衡的实现

在Linux虚拟机中搭建Nginx服务器以及SSL、反向代理和负载均衡的实现 目录 一、虚拟机下网络的网络配置 (2)

1、Bridged模式 (2) 2、NAT 模式 (3) 3、host-only 模式: (4) 4、作业环境网络拓扑图 (4) 二、Nginx的安装与配置 (5) 1、Nginx简介 (5) 2、安装前的环境准备 (5) 3、下载安装 (6) 4、控制Nginx服务 (6) 5、配置nginx (7) 6、负载测试 (9) 三、基于OpenSSL部署https网站 (9) 1、OpenSSL以及SSL/TLS协议简介: (9) 2、Linux下配置https (10) 3、SSL/TSL协议分析 (12) 四、用Nginx实现负载均衡和反向代理 (15) 1、反向代理的实现 (15) 2、负载均衡 (18) 一、虚拟机下网络的网络配置 1、Bridged模式 在桥接模式下,VMware虚拟机里的系统就像是局域网中的一台独立的主机,它可以访问同一个网段内任何一台机器,即可以相互ping通。

在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,就可以手工配置它的IP,DNS服务器,网关等信息,以实现通过局域网的网关或通过交换机访问外网。 图1 本地物理网卡和虚拟网卡通过虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位。 Vmware默认给虚拟系统提供了一个虚拟网卡(linux下默认为eth0设备),虚拟系统通过该网卡与外部通信。图中虚拟交换机由vmware提供,其默认设备名为VMnet0。如图1所示。 2、NAT 模式 NAT 即Network Address Translation 缩写,即网络地址转换,由NAT服务完成,在vmware里默认为VMnet8虚拟交换机,它将虚拟系统的IP地址转换成宿主机的IP地址,从而借用宿主机访问其他主机。使用NAT模式,也可以让虚拟系统通过宿主机器所在的网络来访问公网。 在这种模式下,虚拟系统是不能被LAN内其他PC访问的(宿主机可以,稍后讲),只能虚拟机以宿主机的名义访问LAN内的计算机。默认情况下NAT模式的虚拟系统的TCP/IP 配置信息由VMnet8(NAT)虚拟网络的DHCP服务器提供,因此采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。 图2 VMware Network Adepter VMnet8虚拟网卡的作用就是为主机和虚拟机的通信提供一个接口,即使主机关闭该网卡,虚拟机仍然可以连接到Internet,但是主机和虚拟机之间就不能互访了,还有访问局域网内的其他计算机,也是通过NAT服务实现。如图2所示

Nginx+PHP+MySQL详细配置(图)

Nginx是一个高性能的HTTP和反向代理服务器,同时还是IMAP/POP3/SMTP代理服务器,该程序由俄罗斯Rambler.ru 站点开发,Nginx因为性能稳定、低系统资源消耗而闻名,近几年Nginx在国内已经成炙热化状态,比如像腾讯、网易、51CTO、迅雷、当当网、51、人人网等诸多大型网站都已经使用Nginx来做Web服务器,所以我们要学会运用Nginx还是非常有必要的,下面我们一起来看一下Nginx是如何在Linux平台上搭建的 安装前首先使用yum命令安装、升级所需的程序库 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel ssse2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers 一、安装MySQLssss 目前web服务器已经很少有跑静态页面的,如果要跑动态网站那当然就离不开数据库,虽然在以前文章中有写MySQL是怎么安装的,但是感觉好久没装MySQL,现在只把步骤贴出来,就不做过多的讲解了 #useradd mysql #tar zxvf mysql-5.0.40.tar.gz #cd mysql-5.0.40 #./configure --prefix=/usr/local/mysql #make && make install #/usr/local/mysql/bin/mysql_install_db --user=mysql //初始化MySQL数据库 #chown -R mysql /usr/local/mysql/var #/usr/local/mysql/bin/mysqld_safe & //启动MySQL #/usr/local/mysql/bin/mysqladmin -u root password 123456 //设置MySQL密码 #cp support-files/https://www.doczj.com/doc/331938025.html,f /etc/https://www.doczj.com/doc/331938025.html,f #echo "/usr/local/mysql/bin/mysqld_safe &" >>/etc/rc.local

nginx配置方案

WEB服务器安装方案 平台搭建环境: CentOS5.2 32/x86_64 GNU/Linux (32/64操作系统均通过,推荐使用64位操作系统) 一、系统安装 1. 系统分区建议 /boot 256M swap 2GB / 20GB /usr 40GB (用于安装软件) /data 剩余所有空间. 二、编译安装基本环境 1. 安装准备 1.1 系统约定 软件源代码包存放位置 /usr/local/src 源码包编译安装位置(prefix) /usr/local/software_ name 脚本以及维护程序存放位置 /usr/local/sbin MySQL 数据库位置 /data/mysql/(可按情况设置) 网站根目录/data/www/htdocs(可按情况设置) 网站日志根目录/data/www/logs(可按情况设置) Nginx运行账户www 1.2创建网站账号及相关存放目录 /usr/sbin/groupadd www /usr/sbin/useradd -g www www mkdir -p /data/www/html mkdir -p /data/www/log chown -R www:www /data/www/html chown -R www:www /data/www/log 1.3系统环境部署及调整 # tail -n100 /var/log/messages (检查有无系统级错误信息) # dmesg (检查硬件设备是否有错误信息) # ifconfig(检查网卡设置是否正确) # ping 192.168.95.1 (检查网络是否正常) install_software_name.sh //存放编译参数脚本习惯将所有编译脚本存放在install_software_name.sh便于升级和更新软件. 1.4定时校正服务器时钟,定时与中国国家授时中心授时服务器同步 #crontab -e

【Nginx服务器的编译安装与配置】 安装配置服务器失败

【Nginx服务器的编译安装与配置】安装配置服务器失败 Nginx 是一个很强大的轻量级、高性能Web和反向代理服务器,由俄罗斯人开发而成。它具有很多非常优越的特性:在高连接并发的情况下,Nginx是Apache服务器不错的替代品。而且还可以作为负载均衡服务器,代码用C语言完成,运行效率非常高,还可以做邮件代理服务器。下面是小编跟大家分享的是Nginx服务器的编译安装与配置,欢迎大家来阅读学习~ Nginx服务器的编译安装与配置 工具/原料 Linux服务器或虚拟机一台(这里使用的CentOS6.5) Nginx源码包(这里使用1.44的版本,下载链接:H://pan.baidu/s/1qWoe2te 密码:fqji) 方法/步骤 1要编译安装Nginx,首先我们要安装依赖包pcre-devel 和zlib-devel: # yum install pcre-devel zlib-devel -y 程序默认是使用nobody 身份运行的,我们建议使用nginx 用户来运行,首先添加Nginx组和用户,不创建家目录,不允许登陆系统 # groupadd nginx # useradd -M -s /sbin/nologin -g nginx nginx

2准备工作完成后就是下载编译安装Nginx了,可以从我提供的网盘下载,也可以去Nginx的官网下载。 首先解压源码包: # tar xf nginx-1.4.4.tar.gz 然后cd 到解压后的目录就可以执行./configure 了 # cd nginx-1.4.4 指定安装目录和运行时用的属主和属组,并启用状态监控模块等 # ./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-H_ssl_module \ --with-H_flv_module \

Nginx+Tomcat配置

Nginx+Tomcat配置 为什么使用Nginx? Apache ?经典的Web服务器 ?除了慢没有别的缺点了 ?Apache2对fcgi支持并不好 ?非常好用的proxy和proxy_ajp(很多人用它作为tomcat的前端) ?不支持epoll(这年头,epoll几乎是性能的必备) Nginx ?速度快,占用资源少 ?杀手级的proxy和rewrite ?非常不错的静态文件能力 ?最适合作为整个网站的前端服务(将php、svn等不同请求发送往后端apache) ?其他功能马马虎虎 代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而被人们广泛使用了。 大多数人选择它主要考虑到的是它的高并发和负载均衡。 安装Nginx 1. tar zxvf nginx0.8.36.tar.gz 2、编译安装nginx cd nginx-0.7.44 ./configure --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/nginx 执行后,可能会提示 ./configure: error: the HTTP rewrite module requires the PCRE library.这个错误,是缺少pcre 包,可用yum install pcre pcre-devlel来解决 3、make && make install 4、nginx安装成功后的安装目录为/usr/local/nginx 5.编辑配置文件nginx.conf

[全]Nginx配置文件上下文结构

Nginx配置文件上下文结构 1.Nginx配置文件上下文结构个Nginx的功能模块包含 系列的命令(cmd)以及与命令对应的处理函数(cmd→handler)。而Nginx 根据配置文件中的配 置指令就知道对应到哪个模块的哪个命令,然后调用命令对应的处理函数来处理。 一个Nginx配置文件包含若干配置项,每个配置项由配置指令和指令参数两部分组成,3个简单的Nginx配置项 Nginx配置文件中的配置指令如果包含空格,就需要用单引号或双引号引起来。指令参数如果 是由简单的字符串构成的,简单配置项就需要以分号结束;指令参数如果是复杂的多行字符串, 配置项就需要用花括号“{}”括起来。 Nginx配置项的具体功能与其所处的作用域(上下文、配置块)是强相关的。Nginx指令的作 用域配置块大致有5种,它们之间的层次关系。

5种Nginx指令的作用和它们之间的层次关系一个标准的Nginx配置文件的上下文结构如 下:

... #main全局配置块,例如工作进程数 events { #events事件处理模式配置块,例如IO读写模式、连接数等... } http #HTTP协议配置块 { ... #HTTP协议的全局配置块

server #server虚拟服务器配置块 一 { ... #server全局块location [PATTERN] #location路由规则配置块一 { ... } location [PATTERN] #location路由规则配置块二 { ... } } server #server虚拟服务器配置块二 { ...

Nginx安装学习使用详细记录

前言: 选择Nginx的优点: Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。 Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。 1.1 执行安装 1.tar -xvf nginx-1.4. 2.tar.gz 2.cd nginx-1.4.2 3../configure --prefix=/usr/nginx --with-http_stub_status_module --with-debug --with -http_realip_module --with-http_ssl_module 4. 5. 6.[root@localhost nginx-1.4.2]# make install 7....... 8.test-d \'/usr/nginx/logs\'|| mkdir -p \'/usr/nginx/logs\' 9.test-d \'/usr/nginx/logs\'|| mkdir -p \'/usr/nginx/logs\' 10.test-d \'/usr/nginx/html\'|| cp -R html \'/usr/nginx\' 11.test-d \'/usr/nginx/logs\'|| mkdir -p \'/usr/nginx/logs\' 1.2 查看进程数 进程数是与top出来的cpu数量是一样的。在/usr/local/nginx/conf/nginx.conf配置文件里面的worker_processes参数。 worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。据实践表明,nginx的这个参数在一般情况下开4个或8个就可以了,再往上开的话优化不太大。据另一种说法是,nginx开启太多的进程,会影响主进程调度,所以占用的cpu会增高。 1.[root@lb-net-2 ~]# ps -eaf|grep nginx 2.root 2221 1382 0 18:06 pts/0 00:00:00 grep nginx 3.root 16260 1 0 Jun18 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx 4.nobody 16261 16260 0 Jun18 ? 00:01:26 nginx: worker process 5.nobody 16262 16260 0 Jun18 ? 00:01:32 nginx: worker process 6.nobody 16263 16260 0 Jun18 ? 00:01:25 nginx: worker process 7.nobody 16264 16260 0 Jun18 ? 00:01:33 nginx: worker process 8.nobody 16265 16260 0 Jun18 ? 00:01:32 nginx: worker process 9.nobody 16266 16260 0 Jun18 ? 00:01:24 nginx: worker process 10.nobody 16267 16260 0 Jun18 ? 00:01:32 nginx: worker process 11.nobody 16268 16260 0 Jun18 ? 00:01:23 nginx: worker process

相关主题
文本预览
相关文档 最新文档