话不多说,撸起键盘就是干!正所谓知其然知其所以然,个人总结了下Nginx运行原理和配置详解,便于理解和后续复盘。
Nginx运行原理
先来看这一张图。
![](https://img.haomeiwen.com/i1430582/f8fd2bcaae809ec4.png)
nginx启动后会有一个master进程和多个worker进程。master进程用来管理worker进程,一个worker进程处理一个请求,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 ,过多的worker数,只会导致进程来竞争cpu资源,从而带来不必要的上下文切换。
PHP WEB服务器目前最佳方式之一就是:Nginx + FastCGI(解决CGI并发重复fork问题) + PHP-FPM(管理PHP-CGI进程)。nginx是怎么做到把请求抛给PHP解释来处理的呢?这个过程又是怎么实现的呢?稍后我们来看一下参数配置。
代理,反向代理,负载均衡
代理,反向代理,负载均衡是Nginx常用功能。
Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。如果你和小马之前一样还是分不清代理和反向代理的区别,下面这个图对理解会有所帮助。
![](https://img.haomeiwen.com/i1430582/4089d3e90bd6676e.jpg)
它们的区别就是,前者知道我要找的人并知道地址在哪,代理服务器按这个地址代为请求一下然后把他说的话返回给我。后者就是,我知道我要找谁问话但不知道地址在哪,我也不想管,代理服务你自己去找,只要帮我返回他要说的话就可以了。
![](https://img.haomeiwen.com/i1430582/a7fff199b3f07edf.png)
负载均衡:其实也是反向代理的一种。负载均衡,热备等等其实都属于高可用范畴,Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash等等。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他做下实现。思考一个问题,IP hash真的能解决session共享的问题么?
配置参数
我们来简单看下两个配置示例。
![](https://img.haomeiwen.com/i1430582/e826fb05315cb982.png)
这个配置将请求转发转向mysvr 定义的服务器列表。注意proxy_pass配置。其实这块也是负载均衡的配置。如下:
![](https://img.haomeiwen.com/i1430582/9bd02a219b00e4c8.png)
在访问网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 tomcatsever1的地址,读取分发策略,配置tomcat1权重为3,所以nginx会将大部分请求发送给49服务器上的tomcat1,也就是8080端口;较少部分给tomcat2来实现有条件的负载均衡,当然这个条件就是服务器1、2的硬件指数处理请求能力。
负载均衡配置还有其他的相关参数,这是只是打个样,不赘述。
![](https://img.haomeiwen.com/i1430582/a8d26fe3cf5b818b.png)
可以认为fastcgi_pass这个配置非常关键,将Nginx + FastCGI + PHP-FPM串连。这个配置将PHP请求都交给 fastcgi_pass配置的PHP-FPM处理。location分别通过正则过滤和转发配置决定了各个请求URL将要转发交与的处理方式,location /表示默认请求,location ~\.php(.*)$ 表示PHP 脚本请求全部转发到 FastCGI处理。 使用FastCGI默认配置.。
![](https://img.haomeiwen.com/i1430582/266be8d9b1c9cc24.png)
以上配置指定了这些静态文件要nginx自己处理。
题外话
NGINX负载均衡可以用于很多服务负载均衡的实现,比如做Redis服务的负载均衡,配置upstream的IP列表再配置proxy_pass代理即可。那要实现负载均衡除了NGINX,还有哪些呢?
1)二层负载均衡(一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应);
2)三层负载均衡(一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应);
3)四层负载均衡(在三次负载均衡的基础上,用 ip+port 接收请求,再转发到对应的机器);
4)七层负载均衡(根据虚拟的url或是IP,主机名接收请求,再转向相应的处理服务器)。
这其中,最常见的是四层和七层负载均衡。思考一下,NGINX的负载均衡是属于哪一种?
![](https://img.haomeiwen.com/i1430582/cce7813b459a2e17.png)
网友评论