小生博客: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

nginx系列:nginx反向缓存代理详解相关推荐

  1. Nginx系列1之部分模块详解

    1 内核模块: 名称: daemon 语法: daemon on |off 默认值: on 功能: 决定nginx 在前台执行还是后台守护进程执行的 ================== 名称: En ...

  2. Nginx之代理详解

    Nginx之代理详解 何为代理 要说清楚什么是反向代理,我们就需要先从最简单的C/S架构说起,C/S架构,也即是Client-Server的架构.而最简单的C/S架构,也即是以单个节点作为后端Serv ...

  3. linux nginx编译详解,Linux下nginx编译安装教程和编译参数详解

    这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备 1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码 代码如下:# ...

  4. kubernetes系列11—PV和PVC详解

    kubernetes系列11-PV和PVC详解 原文:kubernetes系列11-PV和PVC详解 本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 ...

  5. OKHTTP之缓存配置详解

    前言 在Android开发中我们经常要进行各种网络访问,比如查看各类新闻.查看各种图片.但有一种情形就是我们每次重复发送的网络请求其实返回的内容都是一样的.比如一个电影类APP,每一次向服务器申请某个 ...

  6. HTTP缓存机制详解

    HTTP缓存机制详解 一. 前言 二. 缓存的介绍 什么是缓存? 为什么要使用缓存? 1. 减少冗余的数据传输 2. 缓解带宽瓶颈 3. 破坏瞬间拥塞 4. 降低距离时延 三. 缓存有效性 命中和未命 ...

  7. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  8. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  9. flutter图片点击跳转_Flutter系列之Platform Channel使用详解

    PS:逐渐体会到关键少数原则的重要性,接下来就是付诸实践了,另外科创50ETF明天开始限额销售,可以适当关注或入手一点. 前面几篇文章介绍了 Navigator 组件.Flex 布局.图片加载.Wid ...

最新文章

  1. ​你知道计算机视觉与机器视觉区别何在?
  2. html5实现圆圈里带一个三角形,HTML5 Canvas圆圈里面的三角形变换动画
  3. Strtus2工作流程及原理
  4. 数据结构—— 基于二叉树的算术表达式求值
  5. asp.net repeater控件
  6. App开发定制的种类:企业需要开发哪种App?
  7. ios8升级ios12教程_iOS Hello World示例教程
  8. un-app网易云歌词滚动功能
  9. html网页主页制作,网页主页制作过程
  10. 具有相关关系的数据处理:线性混合模型与广义线性混合模型
  11. 前端数据可视化插件(四)关系图
  12. 软件促进两化深度融合 ——记2016中国软件和信息技术服务业发展高峰论坛
  13. JAVA 实现批量PDF 打印,线程池多线程执行(附完整代码)
  14. Oracle EBS R12 - ad patch/non-ad patch/admrgpch
  15. 什么是漏极开路【转】
  16. 霜降后,宝宝穿衣要做到三捂两不捂
  17. bat 命令如何启动远程PC上的一个程序?
  18. 墨言教育插画干货分享||日本插画为什么独树一帜,那么受欢迎
  19. c语言浮点变量是什么意思,C语言中说的浮点型是什么意思呢 C语言的浮点数是什么...
  20. 怎么在电脑上登陆多个微信

热门文章

  1. Android 开发者必知的开发资源
  2. 闲来无事,总结 Xcode常用快捷键
  3. 高德地图POI搜索,附近地图搜索,类似附近的人搜索
  4. Golang的反射reflect深入理解和示例
  5. 《Windows PowerShell实战指南(第2版)》——3.4 使用帮助找命令
  6. aidl实现进程间通信
  7. WCF学习之旅—WCF服务的WAS寄宿(十二)
  8. 关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心
  9. Linux下屏蔽Ctrl+Alt+Delete
  10. python 类中定义类_Python中的动态类定义