nginx系列:nginx反向缓存代理详解
小生博客:http://xsboke.blog.51cto.com
如果有疑问,请点击此处,然后发表评论交流,作者会及时回复。
-------谢谢您的参考,如有疑问,欢迎交流
一、 代理和nginx相关概念
1. 代理类型
正向代理:代理局域网对internet的连接请求
反向代理:代理internet对局域网的连接请求
2. Nginx反向代理(reverseproxy)的作用
在一定程度上确保web服务器的安全(因为任何来自internet的请求都需要经过代理服务器)
通过缓存功能加速web访问
可以实现后端服务器的负载均衡
3. Nginx简介
1) 核心特点
支持跨平台
配置简单
使用非阻塞模型、高并发连接(官测5W,实际2-3W)
事件驱动:通信机制使用epoll模型(一个进程处理多个请求)
Master/worker结构:一个master进程,生成一个或多个woker进程
内存消耗小:进程开启数量影响内存占用,而nginx的一个进程可以处理多请求
内置健康检查功能
节省带宽:支持Gzip压缩
稳定性高
2) Nginx的master/worker结构详解
Master:维护worker队列
Worker:进行实际逻辑运算,并将结果返回给master
一个Master进程产生多个worker进程,然后每个worker进程处理多个请求,一个worker进程中断后,不会影响其他worker进程,并且master会重新启动新的worker进程
3) 阻塞和非阻塞模型的区别
阻塞模式:当读写事件没有准备好时,只能等待,当前线程将被挂起
非阻塞模式:事件马上返回,但是响应为事件还没准备好,过会再来,然后每隔一段时间就来检查一下事件,直到事件准备好,在这期间这个线程可以处理其他事情
4) Nginx使用的epoll非阻塞通信机制的特点
Epoll工作机制也称为:异步非阻塞事件处理机制
Epoll存在一个队列事件,所有未完成的事件,将被放到epoll事件队列中,非阻塞模式需要在每个未完成的事件之间进行切换,这样导致了cpu开销很大,而epoll模型的通信机制不会,epoll模型只是在请求之间进行切换,而且切换也是因为异步事件未准备好,而主动让出的,所以这里的切换不需要任何代价,这样nginx实现了高并发和轻量级(只需要几个进程即可)
二、 主要知识点简介
1. nginx-sticky-module模块
主要实现会话保持,后面会介绍配置项
其他实现会话保持的方法:ip_hash
2. Nginx实现LB的调度方案
RR:轮询(默认)
Ip_hash:请求按访问IP的hash结果分配,可以有效解决session共享问题
Least_conn:请求被发送到当前活跃连接最少的后端服务器上,会考虑weight的值
url_hash:按照url的hash结果分配请求,需要nginx的hash包nginx_upstream_hash支持
fair:依据页面大小和加载时间长短智能地进行负载均衡,需要第三方nginx模块upstream_fair支持
3. 负载均衡与健康检查
nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module 模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问
4. Nginx的proxy缓存
缓存也就是将js、css、image等静态文件从后端服务器缓存到nginx指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。
三、 nginx反向缓存代理服务器搭建
实验环境
1. 后端web服务器的配置
1) 为了实验模拟的更为真实,我们将两台后端服务器的域名改为一样的
2) 为了可以模拟负载均衡,我们为两个后端服务器配置相同文件名,内容不同的html文件
Web1(192.168.1.5)
Web2(192.168.1.6)
3) 分别在两台后端服务器上开启80端口例外
2. Nginx的安装
首先安装依赖包
Nginx的session和缓存清除功能都需要第三方模块的支持,在编译nginx的时候需要指定,所以我们首先解压第三方模块
然后创建nginx运行时需要的用户
解压nginx并且进行编译安装
nginx默认自带的 ngx_http_proxy_module 模块 和ngx_http_upstream_module模块实现后端服务器的健康检查
使用第三方模块nginx-sticky-module扩展模块实现Cookie会话黏贴(保持会话)
使用第三方模块ngx_cache_purge实现更强大的缓存清除功能
安装完成后的优化及其处理
Nginx不支持动态加载模块,但是第三方模块可以在nginx安装后再次添加,添加方法是:
解压模块文件
解压nginx文件
./configure --add-module=第三方模块压缩文件位置
然后make,但是不make install
最后将新的nginx主程序替换旧的nginx主程序
cp objs/nginx /usr/local/nginx1.10/sbin/nginx
查看nignx安装的模块
四、 修改nginx配置文件实现:反向代理+负载均衡+健康检查
1. 配置文件总览
图片不太清晰,下面我直接将配置粘贴了过来
user www www; worker_processes 2; worker_cpu_affinity 01 10; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; worker_rlimit_nofile 10240; pid logs/nginx.pid; events {use epoll;worker_connections 4096; } http {include mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"''"$upstream_cache_status"';access_log logs/access.log main;server_tokens off;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#Compression Settingsgzip on;gzip_comp_level 6;gzip_http_version 1.1;gzip_proxied any;gzip_min_length 1k;gzip_buffers 16 8k;gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;gzip_vary on;#end gzip# http_proxy Settingsclient_max_body_size 10m;client_body_buffer_size 128k;proxy_connect_timeout 75;proxy_send_timeout 75;proxy_read_timeout 75;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;proxy_buffering off;proxy_temp_path /usr/local/nginx1.10/proxy_temp;proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g;#load balance Settingsupstream backend {#sticky;server 192.168.1.5:80 weight=1 max_fails=2 fail_timeout=10s;server 192.168.1.6:80 weight=1 max_fails=2 fail_timeout=10s;}#virtual host Settingsserver {listen 80;server_name localhost;charset utf-8;location ~/purge(/.*) {allow 127.0.0.1;allow 192.168.1.0/24;deny all;proxy_cache_purge my-cache $host$1$is_args$args;}location / {index index.php index.html index.htm;proxy_pass http://backend;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_ignore_headers Set-Cookie;proxy_hide_header Set-Cookie;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {proxy_pass http://backend;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;proxy_cache my-cache;add_header Nginx-Cache $upstream_cache_status;proxy_cache_valid 200 304 301 302 8h;proxy_cache_valid 404 1m;proxy_cache_valid any 1d;proxy_cache_key $host$uri$is_args$args;expires 30d;}location /nginx_status {stub_status on;access_log off;allow 192.168.1.0/24;deny all;}} }
2. 分区解释:一
3. 分区解释:二
4. 分区解释:三
5. 分区解释:四
6. 分区解释:五
例:如果需要指定其他调度方法直接在这个配置区域中添加调度方法的配置项即可,如:使用IP_hash算法
7. 分区解释:六
8. 分区解释:七
要想修改代理服务器发送给后端服务器的头信息,实现后端服务器记录真实的客户机IP,只修改这里不行,还需要修改后端服务器的web配置文件
我使用的后端服务器是apache,下面是需要修改的参数,两台后端服务器都需要修改
9. 分区解释:八
10. 分区解释:九
五、 验证
1. 验证缓存
第一次访问
第二次访问
2. 验证缓存清除功能:清空在代理服务器上的缓存
3. 验证负载均衡功能
因为有会话保持和缓存功能,在此环境中体现不出负载均衡功能,所以先将这里两个参数注释掉不用
重启nginx使配置生效
第一次访问web页面
第二次访问web页面
4. 验证健康检查
首先关闭一台后端web服务器的web服务
验证
然后启动刚刚停掉的后端第一台web服务器的httpd服务
再次验证
5. 验证后端服务器日志记录的IP是否为真实客户端的IP
首先使用客户端访问web页面
然后在后端服务器上查看访问日志
转载于:https://blog.51cto.com/xsboke/1918681
相关文章:

编辑PDF文档,Word 2013可以是您的选择
题外话:记得刚进公司的时候,几乎所有的培训文档都是PDF、标准文档,公司使用的软件是Adobe Acrobat 5.0(不知道多少钱,呵呵),软件当然是购买正版的;去年,公司购买了新版本…

中国人工智能学会2020年度优秀科技成果出炉,百度文心ERNIE入选
11月14日,由中国人工智能学会(CAAI)主办的2020第十届中国智能产业高峰论坛(CIIS 2020)正式开幕,CAAI理事长戴琼海院士、何积丰院士、何友院士、王恩东院士、陆军院士等多位中外院士、专家齐聚嘉兴南湖&…

web标准,我们去向何方?一些想法...
web标准,我们去向何方?一些想法...作者:阿捷 2004-7-5 0:52:42原文作者:Veerle 原文出处:veerle.duoh.com 原文发表时间:2004年6月14日 译者注:本文是"你应该关注web标准的真正原因"…

事件源ES的优势
多年来,开发人员实现持久性使用传统的创建、读取、更新、删除(CRUD)模式。正如前面介绍的,如果采购模型实现持久性存储状态更改为历史事件捕获业务活动发生之前写的数据存储。这将事件存储机制,允许他们被聚合,或者放在一个组与逻辑边界。事件采购的模式之一,使并发、分布式系统…

你应该关注web标准的真正原因
你应该关注web标准的真正原因作者:阿捷 2004-7-4 2:28:39原文作者:Andrei Herasimchuk 原文出处:designbyfire.com 原文发表时间:2004年6月11日 译者前言:这是一篇让人震惊的文章。作者的分析深刻,文笔犀…
为什么我们需要开源的系统芯片?
作者 | bunnie译者 | 弯月,编辑 | 杨碧玉来源 | CSDN(ID:CSDNnews)现代的小型电子产品往往基于某个高度集成的芯片构建,这种芯片称为“系统芯片”(System on aChip,缩写:SoC…

InnoDB和MyISAM区别
MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤其那些针对并发性处理的机制。今天,我们先了解一下MySQL中数据表的分类,以及它们的一些简单性质。 …

图书管理系统5W1H
Who 图书管理员 When 图书管理员在图书馆借阅期间管理用户的借书还书,非借阅时间管理后台图书、管理用户信息 Where 借书台、办公室 What 一个图书管理系统,能实现图书的借书还书操作、管理后台图书信息、管理用户信息 Why 能够方便快捷的实现图…
程序员奶爸用树莓派制作婴儿监护仪:哭声自动通知,还能分析何时喂奶
作者 | Fabio Manganiello译者 | 弯月,责编 | 杨碧玉头图 | CSDN 下载自东方 IC来源 | CSDN(ID:CSDNnews)首先,告诉大家一个好消息,我当爸爸了!我不得不暂停一下我的项目来承担一些育儿的重任。…

python快速小教程
http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

web标准的投资回报
web标准的投资回报(ROI)作者:阿捷 2004-7-6 0:17:49原文作者:D. Keith Robinson 原文出处:asterisk 原文发表时间:2004年6月1日 用web标准开发能够带来实际利益,这一点还有人怀疑吗? 如果有,…

使用javascript让项目支持热插拔
2019独角兽企业重金招聘Python工程师标准>>> 突然想起之前做过的一个小项目,项目虽小,需求却不小,要求解析特定格式的字符串,并且特定格式并非一成不变,想要一套系统能够支持解析多变的规则且更改规则时不能…

设计模式:状态模式(State Pattern)
作者:Wang Juqiang 创建于:2012-07-16 出处:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于:2013-03-01 结构图 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 适用性…
拼命学的编程,你却可能错过一个亿!
先来看 2 则新闻:近日 AI 圈最火的新闻当属“AI独角兽依图科技上市”,“AI四小龙”先后开启了上市之路,继旷视科技、云从科技分别谋求港股、A股上市后,依图科技也加入了 IPO 队伍。国内 AI 科技公司的发展,也标志着国家…

web标准的商业价值
web标准的商业价值作者:阿捷 2004-7-3 0:37:26原文来自:adaptivepath.com 作者介绍:Jeffrey Veen是AdaptivePath.com的合伙人之一,专门研究网页设计新技术,你可以在他的个人站点veen.com上学到更多知识。 自从开始we…

OO真经——关于面向对象的哲学体系及科学体系的探讨(上)
http://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html 目录 Catelog 序言 Perface 真经第一章:世界 Waltanschauung 真经第二章:抽象 Abstraction 真经第三章:层次 Arrangement 真经第四章:继承 Inheritance 真经第五…

一次防CC***案例
本文来自 :http://baiying.blog.51cto.com/1068039/1113087 名词解释:摘自百度百科 名称起源 CC Challenge Collapsar,其前身名为Fatboy***,是利用不断对网站发送连接请求致使形成拒绝服务的目的, CC***是DDOS(分布…

滴滴联合比亚迪:首款定制网约车D1发布
11月16日,滴滴出行举办“滴滴开放日”,正式发布全球首款定制网约车D1。这款车基于滴滴平台上5.5亿乘客、上千万司机需求、百亿次出行数据,针对网约车出行场景,在车内人机交互、司乘体验、车联网等多方面进行定制化设计。作为第一款…

表格对决CSS--一场生死之战
表格对决CSS--一场生死之战作者:阿捷 2004-7-19 21:00:54原文作者:Sergio Villarreal 作者简介:墨西哥网页设计师,1993年接触网络,个人主页为Overcaffeinated.net 原文出处:sitepoint.com 原文发表时间&…

使用Docker-Docker for Web Developers(2)
1. 使用镜像 1.1 在Docker Hub上查找镜像 我们查找一下之前博客里面,推送到Docker Hub里面的bage88/docker-demo,能看到有2个仓库,第一个就是我们上次上传的镜像。点击“Details”进入到详细页面。 1.2 拉取镜像到本地机器 在我们本地虚拟机上…
赠书 | 图像分类问题建模方案探索实践
作者 | 中国农业银行 陆春晖责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国*文末有赠书福利背景图像分类,是计算机视觉领域的一个核心问题,顾名思义就是输入一张图像,根据内容将其划分到某一个特定的类别。与其他分类问题相比&a…

数据库开发个人总结(ADO.NET小结)
一.用SqlConnection连接SQL Server 1..加入命名空间using System.Data.SqlClient;2.连接数据库SqlConnection myConnection new SqlConnection();myConnection.ConnectionString "user idsa;passwordsinofindb;initial catalogtest;data source127.0.0.1;Con…

PHP 调用C的代码
用php调用C函数,常通过调用系统命令函数的方式来实现,其中主要有system()和exec()两种,还有一种是passthru(),这种方法没有尝试,暂不作讨论。 system()方法输出并返回最后一行的shell结果。 exec()不输出结果,返回最后…

态势“知”多少,点开就知道
2019独角兽企业重金招聘Python工程师标准>>> 态势感知,最核心的是“知” 关于“知” 典故不少 《孙子兵法》六千多字,“知”出现了79次,只有《势篇》与《行军篇》中没有“知”字。 史称两个半完人之一的王阳明 在经过五溺三变的曲…

17 种正则表达式
作者:http://blog.csdn.net/hivak47/archive/2004/10/31/161006.aspx"^/d$" //非负整数(正整数 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-/d)|(0))$" //非正整数(负整数 0)…
程序员如何乘风破浪?从数据库历史看技术人发展 | CSDN 高校俱乐部
2009 年我国数据库软件市场规模为 35.03 亿元,2017 年我国数据库软件市场规模增长至 120.00 亿元。8年时间内,我国数据库软件市场始终保持平稳增长,年均复合增长率为 17.5%,且增速呈现递增趋势。根据中研产业研究院估计࿰…

陶哲轩实分析 定理 13.3.5 :紧致度量空间上的连续函数一致连续
设 $(X,d_X)$ 和 $(Y,d_Y)$ 都是度量空间,假定 $(X,d_X)$ 是紧致的,如果 $f:X\to Y$ 是函数,那么 $f$ 是连续的当且仅当 $f$ 是一致连续的.证明:当 $f$ 是一致连续时,$f$ 显然是连续的.我们主要证明 $f$ 连续时一致连续.我们采用反证法,假若 $f$ 不是一致收敛的,意味着无论如何…

SQLServer------插入数据时出现IDENTITY_INSERT错误
详细错误信息: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 Student 中的标识列插入显式值。 原因: 表中存在某个字段是自动增长的标识符 解决方法: set IDENTITY_INSERT Student ON //设置为OFF时表示不能手动给拥有标识符的列插…

ASP.NET 制作让搜索引擎可以友好访问的链接
作者:http://www.donews.net/lealting/archive/2004/03/31/9759.aspx今天看了一篇文章,主要是讲,如何制作让搜索引擎可以友好访问的链接,大概的内容是这样的:很多的时候我们在进行查询的时候,总是会以这样的…
机器学习中的7种数据偏见
作者 | Hengtee Lim翻译 | Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国机器学习中的数据偏差是一种错误,其中数据集的某些元素比其他元素具有更大的权重和或表示。有偏见的数据集不能准确地表示模型的用例,从而导致结果…