Nginx反向代理缓存服务器构建

代理服务器介绍

代理服务可简单的分为正向代理和反向代理:
  • 正向代理: 用于代理内部网络对 Internet 的连接请求(如 VPN/NAT),客户端指定代理服务器,并
    将本来要直接发送给目标 Web 服务器的 HTTP 请求先发送到代理服务器上, 然后由代理服务
    器去访问 Web 服务器, 并将 Web 服务器的 Response 回传给客户端:
  • 反向代理: 与正向代理相反,如果局域网向 Internet 提供资源,并让 Internet 上的其他用户可以
    访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服
    务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器,并将 Response 回传给
    Internet 上请求连接的客户端:
正向代理
  • A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
    我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求
反向代理
  • 大家都有过这样的经历,拨打10086 客服电话,一个地区的 10086 客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086 的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已
    那么这里的 10086 总机号码就是我们说的反向代理。客户不知道真正提供服务的人是谁
    反向代理隐藏了真实的服务端,当我们访问 www.baidu.com 的时候,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实计算的服务器那里去。Nginx 就是性能非常好的反向代理服务器,它可以用来做负载均衡。

反向代理的作用
①保护网站安全:任何来自 Internet 的请求都必须先经过代理服务器
Nginx反向代理缓存服务器构建_第1张图片
②通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的某些静态资源,减轻真实 Web 服务器的负载压力
Nginx反向代理缓存服务器构建_第2张图片
③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力
Nginx反向代理缓存服务器构建_第3张图片

常见的反向代理之间的区别

  • Lvs优点: 工作在四层仅作分发的左右,抗负载能力强,承载并发量高
    缺点: 自身布支持正则处理,不能做动静分离
  • Haproxy优点:haproxy可以同时工作在4层和7层,支持会话保持和cookie引导,支持url测试后端的服务器,专业的代理服务器
    缺点: 处理数据相比nginx比较慢,消耗较多带宽
  • Nginx优点:
    1、nginx工作在七层,可以针对http应用做一些分流的策略,比如针对域名、目录结构,他的正则比haproxy更加强大和灵活
    2、nginx对网络的依赖非常小,理论上能ping同就能进行负载功能,这个也是他的优势所在
    3、nginx的安装和配置比较简单,测试起来比较方便
    4、可以承载搞得负载压力且稳定,一般能支撑超过几万次的并发量
    5、nginx可以通过端口检测到服务器内部的故障
    缺点:nignx 不支持url来检测后端服务器状态,nginx的session的保持,cookie的引导能力相对欠缺

Nginx介绍:

Nginx是一款轻量级的网页服务器、反向反向代理服务器、以及邮件代理服务器(大企业会自己搭建),因为它的稳定性、丰富的功能集、示例配置文件和地系统资源的消耗
淘宝使用的nginx是二次开发的nginx 名叫tengine,基本上中大型企业都会选择nginx
在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线 等多家网站使用 Nginx 作为 Web 服务器或反向代理服务器。

Nginx核心特点:

(1)跨平台:Nginx 可以在大多数 OS 编译运行,而且也有 Windows 的版本;
(2)配置异常简单:非常容易上手。
(3)非阻塞、高并发连接:官方测试能够支撑 5 万并发连接,万并发连接数。(这得益于 Nginx 使用了最新的 epoll 模型);
(4)事件驱动:通信机制采用 epoll 模型,支持更大的并发连接
(5)Master/Worker 结构:一个 master 进程,生成一个或多个 worker 进程。
(6)内存消耗小:处理大并发的请求内存消耗非常小。在 3 万并发连接下,开启的 10 个Nginx 进程才消耗 150M 内存(15M*10=150M)。
(7)内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问
(8)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header
(9)稳定性高:用于反向代理,宕机的概率微乎其微

搭建Nginx反向代理服务器

实验环境

主机名 操作系统 IP地址
nginx Centos7.4 192.168.83.3
Apache1 Centos7.4 192.168.83.4
Apache2 Centos7.4 192.168.83.5

实验拓扑图
Nginx反向代理缓存服务器构建_第4张图片

测试服务器安装apache

两台操作相同
[root@apache1 ~]# yum -y install httpd
[root@apache1 ~]# vim /var/www/html/index.htm
添加: 192.168.83.4 另外一台内容为192.168.83.5 方便区分效果
[root@apache1 ~]# systemctl start httpd

安装Nginx

上传安装包 nginx-1.14.0.tar.gz ngx_cache_purge-2.3.tar.gz nginx-sticky-module.gz

tar zxf nginx-1.10.2.tar.gz
tar zxf ngx_cache_purge-2.3.tar.gz
unzip nginx-sticky-module.gz

在这里插入图片描述
编译实验所需模块

[root@nginx ~]# groupadd nginx
[root@nginx ~]# useradd nginx -g nginx -s /sbin/nologin
[root@www nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --user=nginx --group=nginx --with-http_stub_status_module
–with-http_realip_module --with-http_ssl_module
–with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=…/ngx_cache_purge-2.3 --with-http_flv_module --add-module=…/nginx-sticky-module
[root@nginx nginx-1.10.2]# make && make install

参数解释:
–with-http_stub_status_module ##开启stub_status监控模块,查看nginx状态信息
–with-http_realip_module##获取客户端的真实IP地址(X-Real或X-Forwarded-For)
–with-http_ssl_module ##开启ssl加密模块,支持https
–with-http_gzip_static_module ##开启gzip压缩模块
–http-client-body-temp-path ##设定http客户端请求的临时文件路径
–http-proxy-temp-path ##设定代理临时文件存放路径
–http-fastcgi-temp-path##设定fastcgi文件存放路径
–with-pcre##启用pcre库
–with-http_flv_module ##开启对flv视频的伪流支持

nginx的路径优化和编写脚本启动

[root@www ~]# vi /etc/init.d/nginx 内容如下:
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx1.14/sbin/nginx"
PIDF="/usr/local/nginx1.10/logs/nginx.pid"
case "$1" in
 start)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service already running."
 else
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then 
 $PROG
 echo "Nginx service start success."
 else
 $PROG -t
 fi
 fi
 ;;
 stop)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 kill -s QUIT $(cat $PIDF)
 echo "Nginx service stop success." 
 else
 echo "Nginx service already stop"
 fi
 ;;
 restart)
 $0 stop
 $0 start
 ;;
 status)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service is running."
 else
 echo "Nginx is stop."
 fi
 ;; 
 reload)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then
 kill -s HUP $(cat $PIDF)
 echo "reload Nginx config success."
 else
 $PROG -t
 fi
 else
 echo "Nginx service is not run." 
 fi 
 ;;
 *)
 echo "Usage: $0 {start|stop|restart|reload}"
 exit 1
esac
[root@nginx ~]# chmod +x /etc/init.d/nginx 
[root@nginx ~]# chkconfig --add   nginx
[root@nginx ~]# chkconfig nginx 

[root@nginx ~]# ln -s /usr/local/nginx/1.14/sbin/nginx /usr/local/sbin/
[root@nginx ~]# nginx -t
[root@nginx ~]# mkdir -p /var/tmp/nginx/client/
[root@nginx ~]# chown -R nginx /var/tmp/nginx/client/
[root@www ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3977/nginx: master

配置nginx反向代理

编辑nginx主配置文件  vim /usr/local/nginx/1.14/conf/nginx.conf
在http字段中添加
upstream  backend {
   sticky;
   server  192.168.83.4:80 weight=1 max_fails=2 fail_timeout=10s;
 server  192.168.83.5:80 weight=1 max_fails=2 fail_timeout=10s; 
   }
 参数解释:
weight : 轮询权值也是可以用在 ip_hash 的,默认值为 1
max_fails :允许请求失败的次数,默认为 1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout : 有两层含义,一是在 10s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,10s 时间内不分配请求到这台服务器。

修改server字段内容,注释掉下面内容,在其下面添加
#        location  / {          
#           root   html; 
#          index  index.html index.htm; 
#     }
		location / {
			proxy_pass http://backend;
		}

重启nginx验证
Nginx反向代理缓存服务器构建_第5张图片
配置nginx反向代理缓存后端web服务器页面数据

修改nginx配置文件,在原有基础上修改和添加
http {
 	#$upstream_cache_status 记录缓存命中率
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;
proxy_buffering on; #代理的时候,开启或关闭缓冲后端服务器的响应
proxy_temp_path /usr/local/nginx1.14/proxy_temp;   ##缓存临时路径
 proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m  ##设置缓存目录
inactive=600m max_size=2g;
 server {
 listen 80;
 server_name localhost;
 root html;
 index index.php index.html index.htm;
 #ngx_cache_purge 实现缓存清除
 location ~/purge(/.*) {
 allow 127.0.0.1;
 allow 192.168.83.0/24;   ##允许83网段通过web页面清除缓存
 deny all;
 proxy_cache_purge my-cache $host$1$is_args$args;
 }
 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;
 }

$upstream_cache_status 包含以下几种状态

  • MISS 未命中,请求被传送到后端
  • HIT 缓存命中
  • EXPIRED 缓存已经过期请求被传送到后端
  • UPDATING 正在更新缓存,将使用旧的应答
  • STALE 后端将得到过期的应答

配置完成后重启nginx访问

第一次访问缓存状态Miss,在刷新变为HIT
Nginx反向代理缓存服务器构建_第6张图片
在这里插入图片描述
通过web浏览器清除缓存
Nginx反向代理缓存服务器构建_第7张图片

你可能感兴趣的:(http)