手把手教你实现nginx反向代理服务器

1.反向代理

代理服务器根据其代理对象的不同,可以分为正向代理服务器与反向代理服务器。这里
的“正”与“反”均是站在客户端角度来说的。
要明白反向代理,就得知道什么是正向代理.

2.正向代理服务器

正向代理是对客户端的代理。客户端 C 想要从服务端 S 获取资源,但由于某些原因不能,直接访问服务端,而是通过另外一台主机 P 向服务端发送请求。当服务端处理完毕请求后,将响应发送给主机 P,主机 P 在接收到来自服务端的响应后,将响应又转给了客户端 C。此时的主机 P,就称为客户端 C 的正向代理服务器。
客户端在使用正向代理服务器时是知道其要访问的目标服务器的地址等信息的。正向代理服务器是为服务用户(客户端)而架设的主机,与服务端无关,对服务器端透明。

  • 正向代理架构图
    在这里插入图片描述
  • 正向代理的常见应用–翻 墙在这里插入图片描述
  • 正向代理应用–缓存
    Maven的Nexus私服就是一个典型的用于"缓存"功能的正向代理服务器
    在这里插入图片描述
3.什么是反向代理服务器

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。用户并不知道访问的资源究竟在哪台服务器上.
在这里插入图片描述

4.反向代理的应用之负载均衡

在这里插入图片描述
负载均衡(Load Balancing):就是将对请求的处理分摊到多个操作单元上进行。这个均衡是指在大批量访问前提下的一种基本均衡,并非是绝对的平均。对于 Web 工程中的负载均衡,就是将相同的 Web 应用部署到多个不同的 Web 服务器上,形成多个 Web 应用服务器。当请求到来时,由负载均衡服务器负责将请求按照事先设定好的比例向 Web 应用服务器进行分发,从而增加系统的整体吞吐量。
负载均衡可以通过负载均衡软件实现,也可通过硬件负载均衡器实现。
(1 ) 硬件负载均衡
硬件负载均衡器的性能稳定,且有生产厂商作为专业的服务团队。但其成本很高,一台硬件负载均衡器的价格一般都在十几万到几十万,甚至上百万。知名的负载均衡器有 F5、Array、深信服、梭子鱼等。
在这里插入图片描述
(2 ) 软件负载均衡
软件负载均衡成本几乎为零,基本都是开源软件。例如:LVS、HAProxy、Nginx 等。

例如:该机群包含一台 Nginx 服务器,两台 Web服务器(node2和node3)。
修改nginx.conf文件

upstream rss{
        server 192.168.20.102;
        server 192.168.20.103;
    }
    server {
       listen  80;
       server_name www.wucw.com;
       access_log   logs/myfmt.log  myfmt;
       location / {
           root /mnt;
           autoindex on;
       }
       location /toms {
           proxy_pass http://rss/;
       }

重启nginx,请求测试:http://www.wucw.com/toms,发现已经实现了负载均衡。(中小企业一般使用该方式)
也可以通过在Nginx服务器上配置hosts本地域名解析:

[root@nginx1 conf]# vim /etc/hosts

192.168.20.101 node1
192.168.20.102 node2  xxx
192.168.20.103 node3  xxx
192.168.20.104 node4

修改nginx.conf配置文件,添加如下配置

       location /cats {
           proxy_pass http://xxx/;
       }

重启nginx,测试:http://www.wucw.com/cats
一样能够实现负载均衡的目的(大型企业使用该方式,一般还会搭建一个DNS域名解析服务器,只需要修改DNS域名解析服务器就ok了)。
Nginx会用到域名解析,如果一个域名解析出多个ip地址,会在这些ip地址之间做负载均衡。

5.反向代理应用之session共享

在这里插入图片描述
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术.
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid时,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的.但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现.
首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

5.1session一致性解决方案
  • session复制
    tomcat 本身带有复制session的功能。(基本不用)
  • 共享session
    需要专门管理session的软件,
    memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session.
    在这里插入图片描述
5.2安装memcached
  • node2和node3上安装jdk和tomcat
[root@nginx1 apps]# rpm -ivh jdk-7u80-linux-x64.rpm
[root@nginx1 apps]# find / -name '*java*'
#可以看出/usr/java/jdk1.7.0_80/

配置环境变量

[root@node1 jdk1.7.0_80]# vim /etc/profile

加入以下两行代码:

export JAVA_HOME=/usr/java/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin

让文件生效:

[root@nginx1 apps]# source /etc/profile
[root@nginx1 apps]# jps
13894 Jps  #说明jdk安装配置成功

解压apache-tomcat-7.0.69.tar.gz
修改ROOT/index.jsp,dG全删后,添加:

from 192.168.20.102 session=<%=session.getId()%>

另外一台同样的安装配置操作。
然后分别访问node2和node3都可以正常,刷新session也不会变。
修改nginx.conf

    upstream rss {
        server 192.168.20.102:8080;
        server 192.168.20.103:8080;
}

访问测试http://www.wucw.com/toms,刷新session一直改变。

  • nginx1上安装memcached
    1、安装libevent
    a)yum install libevent -y
    2、安装memcached
    a)yum install memcached -y
    3、启动memcached
    memcached -d -m 128m -p 11211 -l 192.168.20.95 -u root -P /tmp/
    -d:后台启动服务
    -m:缓存大小
    -p:端口
    -l:IP
    -P:服务器启动后的系统进程ID,存储的文件
    -u:服务器启动是以哪个用户名作为管理用户
  • 配置session共享
    1、拷贝jar到tomcat的lib下,jar包见附件
    2、配置tomcat,每个tomcat里面的context.xml中加入
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	memcachedNodes="n1:192.168.20.95:11211" 
    sticky="false" 
    lockingMode="auto"
    sessionBackupAsync="false"
	requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
/>
</Context>

tomcat添加jar包和配置信息之后需要重启

1.6 反向代理应用之动静分离

在这里插入图片描述
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
动静分离从目前实现方式大致分为两种:

  • 纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
  • 动态和静态文件混合在一起发布,通过nginx分开。通过location指定不同的后缀名实现不同的请求转发。
    动静分离具体实现
    1.index.jsp修改
    node2
<link rel="stylesheet" type="text/css" href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">
from 192.168.20.92 <br/> 
 session=<%=session.getId()%></font>

node3

<link rel="stylesheet" type="text/css" href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">
from 192.168.20.103 <br/> 
session=<%=session.getId()%></font>

2.从nginx1克隆nginx2,修改/etc/udev/ rules.d/70-persistent-net.rules

[root@nginx2 rules.d]# pwd
/etc/udev/rules.d
[root@nginx2 rules.d]# vim 70-persistent-net.rules

将原来的eth0一行删掉(dd),并将eth0,改为eth1
3.在nginx2服务器上创建目录 /data/image和/data/css,然后将logo.jpg和index.css上传到对应的目录
[root@nginx2 rules.d]# mkdir -p /data/image /data/css
4.并修改nginx2服务器上的nginx.conf配置文件

 [root@nginx2 rules.d]# vim /opt/nginx/conf/nginx.conf
    server {
       listen  80;
       server_name 192.168.20.96;
       location / {
           root /mnt;
           autoindex on;
       }
       location /image {
           root /data;
       }
       location /css {
           root /data;
       }
    }

5.修改nginx1服务器上的nginx.conf配置文件

    server {
       listen  80;
       server_name www.wucw.com;
       location / {
           proxy_pass http://rss/;
       }
       location /image/ {
           proxy_pass http://192.168.20.96;
       }
       location /css/ {
           proxy_pass http://192.168.20.96;
       }
    }

然后重新加载nginx
6.浏览器测试http://www.wucw.com
总结:
正向/反向就是对客户端是否透明,透明就是正向,否则就是反向;通俗的话就是客户端是否知道目标服务器的ip地址.

发布了262 篇原创文章 · 获赞 491 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/qq_42859864/article/details/104762375