书接上回说,nginx我们学会了简单的配置。那么我今天来聊一下,我们ngxin的一些优化配置(我不是很懂,不敢谈高级配置)。我先来看一下nginx的好处和正向代理。

nginx的好处

1、可以高并发连接,官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。他的NIO模式上个博客提到过,这里不再赘述了。

2、内存消耗少,Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。

如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。

3、成本低廉,开源软件,不需要任何成本。

4、配置文件非常简单,网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。

5、支持Rewrite重写,能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。

6、内置的健康检查功能如果,NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。(这个后面会给予详细的配置和说明)

7、节省带宽,支持GZIP压缩,可以添加浏览器本地缓存的Header头。

8、稳定性高,用于反向代理,宕机的概率微乎其微。

9、支持热部署,Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。

说完了好处,我们来谈谈正向代理和反向代理的区别。

其实这个玩意挺不好解释的,但是一定注意几点,他俩在nginx的配置是一样的。并且不要说nginx服务器和目标服务器不在一起就是反向代理。

我们以中间商赚差价为例。

我们要去市场买肉(客户端)。这里有有一个肉联厂(真正的服务端)。我们心知肚明吧的知道菜市场肉贩子的肉是从肉联厂进货的。(肉贩子是代理端)。

我们从肉贩子手里买了肉。可以忽略这句话(这不废话吗,下面反正代理也是这样的)。关键差别在于肉联厂只知道把肉给了肉贩子,并不知道谁真正买走了他的肉,这就是正向代理。

一般用于爬虫和VPN。

还是买肉的例子。

我们要去市场买肉(客户端)。这里有有一个肉联厂(真正的服务端)。我们从肉贩子手里买了肉。关键差别在于我们并不知道肉贩子的肉是从哪个肉联厂购进的肉。(肉贩子是代理端)。

这就是反向代理,可能他们三个都认识,但是并不能确认买卖关系。

一般用于负载均衡。

我们先来看一下如何来设置负载均衡。

反正代理的负责均衡一般是轮询,权重(百分比),IP_hash,URL_hash,最小访问等算法。

反向代理相关参数:

  proxy_pass:#服务名称(地址)

  proxy_redirect on/off:#是否重定向

  proxy_set_header Host $host:#传Header参数至后端服务

  proxy_set_header X-Forwared-For $remote_addr:#传Header参数至后端服务

  proxy_connent_timeout 90 # 连接代理服务器超时时间

  proxy_send_timeout 90 #请求发送最大时间,默认单位秒

  proxy_read_timeout 90 # 读取请求最大时间,默认单位秒

更多参数配置参考官网,地址http://nginx.org/en/docs/http/ngx_http_proxy_module.html。里面超详细的。

我先来配置一个最简单的反向代理。

upstream和server是同级别的,不要放置在server内部。

如果内部加入weight参数,则表示权重寻址.

表示访问两次8002,访问一次8001。循环下去。

如果其中一个服务宕机了,这时nginx会不在分发请求到那个服务上,当服务恢复,nginx会自动监控到服务启动了,会再次发送服务到该服务。

这里说两个配置,fail_timeout和slow_start。fail_timeout表示服务请求超过多长时间,就认为该服气宕机了,slow_start表示继续监控该服务多长时间,如果正常则认为服务已恢复正常。

配置如图:

注意slow_start参数不能与 haship_hash随机 负载平衡方法一起使用,官网是这样说的,但是我这一直说slow_start是无效参数。

   backup为备用服务,就是我们当前有任何一台服务器处于正常状态,请求不会分发到backup服务器上。除非所有服务器全部宕机,请求才会分发到backup上。

max_conns:允许最大连接数。

可以调节的参数还有很多,我们可以去官网查看,下面我来说一下简单的优化配置。

当我们要做大并发时,我们优先的想到的就是缓存,我们应该把静态的文件缓存下来,其实我想象中的架构可以是这样的....

这样我们可以做到请求的分发,然后把静态的JS,CSS文件分离出来,不至于让这些静态的文件占用我们的网络带宽,那么我们来看一下nginx是如何做缓存的吧。

用管理员启动,你会看到你访问以后会留下文件夹,里面是一个看不懂的文件,是一份缓存文件,我们简单说一下上面的配置都是什么意思。

proxy_cache_path声明配置块,第一个参数是路径,要和你启动的账号权限保持一致啊。不然没法写入的,levels是保存的目录等级,我们看到最后生产的文件是一个MD5的文件。1:2就是说明一级目录取文件名的最后一位数,2代理下级目录是文件名的2-3位的名字。

keys_zone=名称:文件大小,要和下面proxy_cache的名字保持一致。incative是保存的天数。max_sizes是保存的最大单位。location内部的分别是proxy_cache缓存名称,proxy_cache_key以url来MD5进行计算。如果匹配直接取缓存。

proxy_cachr_valid代表状态码为200 304时进行保存,保存12小时。

优化扩展:

我们说过,我们可以启动多个work进程,每个work都是运行在一个单独的cpu上,但是他们的访问cpu完全是随机的,可能发生cpu争抢消耗时间,我们可以采用绑定CPU的方式来解决这个问题。

参数work_cpu_affinity 0001 0010 0100 1000;这样的配置使我们启动了四个work,就是用1来占位绑定cpu。

尽量避免使用IP_hash来做配置,IP_hash只能分发到同一个外网地址的请求,很多用路由交换机代理的内网IP,并不使用IP_hash算法,会造成单服务器大量请求,不能达到均衡的目的。

nginx我们今天就聊到这里,还有很多深入的优化,官网写的很详细,大家可以自己去尝试。java开发范围的,这些我觉得差不多可以了。可以慢慢深入研究。

最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(nginx使用详解)nginx的反向代理和优化配置的更多相关文章

  1. 项目详解4—haproxy 反向代理负载均衡

    一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...

  2. [转]反向代理过程与Nginx特点详解

    原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...

  3. nginx之旅(第一篇):nginx下载安装、nginx启动与关闭、nginx配置文件详解、nginx默认网站

    一.nginx下载安装 版本nginx 1.15.5 系统环境centos7.5(本机ip192.168.199.228) 关闭selinux 和防火墙firewall 1.下载 wget http: ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  6. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  7. Nginx中文详解、配置部署及高并发优化

      一.Nginx常用命令: 1. 启动 Nginx          /usr/local/nginx/sbin/nginxpoechant@ubuntu:sudo ./sbin/nginx2. 停 ...

  8. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  9. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

随机推荐

  1. 湖南省web应用软件(中慧杯)

    湖南省web应用软件 写这篇博客已经是比完赛的第四天了,我还记得那天下着小雨.我们早早的到了比赛的现场抽检机器,在比赛前一天我很是激动.我还记得我们从学校,去株洲的时候我们的领导来给我加油,特别是我的 ...

  2. python基础(22):模块、包

    1. 模块 1.1 什么是模块 别人写好的函数.变量.方法放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模 ...

  3. 深入理解JVM,类加载器

    虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...

  4. 程序卡在 while(SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_TXE) == RESET) 处

    stm32 SPI1,发现程序卡在 while(SPI_I2S_GetFlagStatus(W5500_SPI, SPI_I2S_FLAG_TXE) == RESET); 解决方式: 1.检查RCC时 ...

  5. WindowServer优化

    Windows Server 2016 禁止自动更新 1. 打开cmd,输入sconfig,出现如下图: 2. 输入5回车,在输入m回车,完成关闭自动更新.

  6. Python类的定义、方法和属性使用

    类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...

  7. HttpClient的使用今天遇到一个巨坑——HttpEntity内容取不出来

    在使用HttpPost httpPost = new HttpPost(postUrl);的post请求后,拿到返回的response,response返回200成功. 到此没有任何问题. respo ...

  8. [20190531]建立job与commit.txt

    [20190531]建立job与commit.txt --//昨天看链接:https://connor-mcdonald.com/2019/05/28/dbms_job-the-joy-of-tran ...

  9. rabbitmq多消费者

    rabbitmq多消费者处理 当rabbitmq拥有多个消费者时,队列收到的消息将以轮询(round-robin)的分发方式发送给消费者.每条消息只会发送给订阅列表里的一个消费者.这种方式非常适合扩展 ...

  10. [日常] Redis中set集合的使用思考

    公司部门同事有个需求,就是需要把当前另一个部门a中存储的数据全部导出来,自己当前业务b的数据全部导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除.这个我感觉可以 ...