书接上回说,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. wpf file embeded resource is readonly,Copy always will copy the file and its folder to the bin folder

    Wpf file embeded resource will compile the file into the assembly and it will be readonly and can no ...

  2. mybatis动态sql和分页

    mybatis动态sql foreach BookMapper.xml <select id="selectBooksIn" resultType="com.lin ...

  3. VUE基础实用技巧

    Vue以前听说过,有了解过一点.当时还在热衷于原生JavaScript去写一些方法的封装,不是为啥,就感觉这样很帅,后面多多少少接触了一些JQuery的用法,到现在为止,JavaScript原生封装的 ...

  4. sed文本处理

    1.基本概述 sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称* 为"模式空间"(pattern space) 接着用 ...

  5. 【Gradle】Gradle入门

    Gradle入门 配置Gradle环境 安装之前确保已经安装配置好Java环境,要求JDK6以上,并且在环境变量里配置了JAVA_HOME,查看Java版本可以在终端输入如下命令: java -ver ...

  6. netcore codefirst生成数据库命令

    1.程序通过nuget安装包 Microsoft.EntityFrameworkCore.Design 2.生成添加脚本 add-migration InitialCreate -Context AL ...

  7. (入门SpringBoot)SpringBoot项目事务(三)

    Spring声明式事务的使用:由@Transactional进行标注,可以使用在类和方法上.当标注在类上,类下面所有公共非静态的方法都将启用事务功能.接下来,运行事务注解标注的方法,Spring的事务 ...

  8. 讲解web服务所涉及到的重要知识点

    HTTP:超文本传输协议,默认为TCP的80端口.带有超级链接的文本,而这些链接成为超链接! loadrunner :专业级测试工具,模拟你的应用程序的真实,进行评测! HTML:超文本编辑语言. H ...

  9. Redis学习笔记(六、哨兵)

    目录: 基本概念 环境部署 哨兵原理 哨兵命令 基本概念: 1.什么是哨兵 我们先从字面意思来了解哨兵,哨兵是对执行警戒任务的士兵的统称:在redis中哨兵也是一样,他监控着redis服务器的状态. ...

  10. 初学Python几个小程序练习

    使用格式化输出的三种方式实现以下输出(name换成自己的名字,既得修改身高体重,不要厚颜无耻) name = 'ABDMLBM' height = 175 weight = 140 # "M ...