书接上回说,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. Django之Django简介,开发环境搭建,项目应用创建

    软件及Django框架简介 软件框架 一个软件框架是由其中各个软件模块组成的: 每一个模块都有特定的功能: 模块与模块之间通过相互配合来完成软件的开发. 软件框架是针对某一类软件设计问题而产生的. M ...

  2. GALAXY OJ NOIP2019联合测试2-普及组

    概要: 今天比了个赛,还挺水,只不过不太理想. 题目: Problem : 韬韬抢苹果 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发 ...

  3. SpringBoot(五) SpringBoot整合mybatis

    一:项目结构: 二:pom文件如下: <parent> <groupId>org.springframework.boot</groupId> <artifa ...

  4. C++ this指针的理解和作用

    01 C++ 程序到 C 程序的翻译 要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class Car { public: int m_price; // 成员 ...

  5. Wireshark分析实战:某达速递登录帐号密码提取

    - 准备工作 首先,备好Wireshark,打开,在外网网卡上抓包. 其次,用浏览器访问http://www.yundaex.com/cn/index.php,并在手机上下载安装其APP,找到登录页面 ...

  6. Python函数使用

    Python函数用def指定函数名,可以指定输入参数,可以指定参数的默认值,也可以用return指定返回值.调用时除了默认的位置赋值,也可按关键字赋值. 一.函数不带参数.没有返回值 def hell ...

  7. [日常] 跨语言的POST请求问题的解决

    部门对外提供了一个HTTP的POST接口,但是对方公司的程序员使用C语言进行的调用,PHP这边一直无法获取到参数.遇到这种情况是因为对方没有完全按照HTTP协议中的POST发送数据.在HTTP头部分没 ...

  8. 如何在VIM中保存编辑的只读文件

    我们经常碰到这样的情景:在VIM中编辑了一个系统配置文件,当需要保存时才发现当前的用户对该文件没有写入的权限, 这时候怎么办呢? 当需要保存时,输入以下的命令: :w !sudo tee %

  9. nginx 图片访问404 (使用location中使用 root,alias的区别)

    问题描述: 在/data/code_img/文件下有很多验证码图片,想将他们展示出来 希望通过 http://127.0.0.1/img/1.png 这种形式访问到对应图片,刚开始nginx中配置如下 ...

  10. MASK-RCNN(1)

    MASK-RCNN是一个多用途的网络,可以用来做目标检测,实例分割或者人体姿态识别.主要结构如下. 简单的说,就是首先用Faster-RCNN获得ROI,再进行ROI Align,然后输出ROI的分类 ...