java架构之路-(nginx使用详解)nginx的反向代理和优化配置
书接上回说,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参数不能与 hash,ip_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的反向代理和优化配置的更多相关文章
- 项目详解4—haproxy 反向代理负载均衡
一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...
- [转]反向代理过程与Nginx特点详解
原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...
- nginx之旅(第一篇):nginx下载安装、nginx启动与关闭、nginx配置文件详解、nginx默认网站
一.nginx下载安装 版本nginx 1.15.5 系统环境centos7.5(本机ip192.168.199.228) 关闭selinux 和防火墙firewall 1.下载 wget http: ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
- Activiti架构分析及源码详解
目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...
- Nginx中文详解、配置部署及高并发优化
一.Nginx常用命令: 1. 启动 Nginx /usr/local/nginx/sbin/nginxpoechant@ubuntu:sudo ./sbin/nginx2. 停 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
随机推荐
- 湖南省web应用软件(中慧杯)
湖南省web应用软件 写这篇博客已经是比完赛的第四天了,我还记得那天下着小雨.我们早早的到了比赛的现场抽检机器,在比赛前一天我很是激动.我还记得我们从学校,去株洲的时候我们的领导来给我加油,特别是我的 ...
- python基础(22):模块、包
1. 模块 1.1 什么是模块 别人写好的函数.变量.方法放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模 ...
- 深入理解JVM,类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...
- 程序卡在 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时 ...
- WindowServer优化
Windows Server 2016 禁止自动更新 1. 打开cmd,输入sconfig,出现如下图: 2. 输入5回车,在输入m回车,完成关闭自动更新.
- Python类的定义、方法和属性使用
类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...
- HttpClient的使用今天遇到一个巨坑——HttpEntity内容取不出来
在使用HttpPost httpPost = new HttpPost(postUrl);的post请求后,拿到返回的response,response返回200成功. 到此没有任何问题. respo ...
- [20190531]建立job与commit.txt
[20190531]建立job与commit.txt --//昨天看链接:https://connor-mcdonald.com/2019/05/28/dbms_job-the-joy-of-tran ...
- rabbitmq多消费者
rabbitmq多消费者处理 当rabbitmq拥有多个消费者时,队列收到的消息将以轮询(round-robin)的分发方式发送给消费者.每条消息只会发送给订阅列表里的一个消费者.这种方式非常适合扩展 ...
- [日常] Redis中set集合的使用思考
公司部门同事有个需求,就是需要把当前另一个部门a中存储的数据全部导出来,自己当前业务b的数据全部导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除.这个我感觉可以 ...