Java进阶-21.Ngnix

一、代理的概念

1.正向代理

代理技术默认说的是正向代理技术。关于正向代理的概念如下: 正向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代 理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

 Java进阶-21.Ngnix_第1张图片

从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】。这就是正向代理的意义所在。而为什么要用代理服务器去代替访问方【用户A】去访问服务器B呢?这就要从代理服务器使用的意义说起。

使用正向代理服务器作用主要有以下几点:

1.访问本无法访问的服务器B

Java进阶-21.Ngnix_第2张图片

假设图中路由器从左到右命名为R1,R2,假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户 A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

2.加速访问服务器B

这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。

3.Cache作用

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。,如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据J,而不用千里迢迢的去服务器B下载数据了。

4.客户端访问授权

这方面的内容现今使用的还是比较多的,例如一些公司采用ISA SERVER做为正向代理服务器来授权用户是否有权限访问互联网。

Java进阶-21.Ngnix_第3张图片

防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服 务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢 弃。

5.隐藏访问者的行踪

Java进阶-21.Ngnix_第4张图片

可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。

总结:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内 容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

2.反向代理(reverse proxy)

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。 使用反向代理服务器的作用如下:

1.保护和隐藏原始资源服务器

Java进阶-21.Ngnix_第5张图片

用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。

2.负载均衡

Java进阶-21.Ngnix_第6张图片

当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。当然反向代理服务器像正向代理服务器一样拥有CACHE的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器B请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。

Java进阶-21.Ngnix_第7张图片

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在WINDOWS平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说NGINX不能做正向代理,其实是不对的。NGINX也可以做正向代理,不过用的人比较少了。

3.透明代理

如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。 透明代理实践的例子就是时下很多公司使用的行为管理软件。

Java进阶-21.Ngnix_第8张图片

用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。             

二、Nginx

互联网飞速发展的今天,大用户量高并发已经成为互联网的主体.怎样能让一个网站能够承载几万个或几十万个用户的持续访问呢?这是一些中小网站急需解决的问题。用单机tomcat搭建的网站,在比较理想的状态下能够承受的并发访问量在150到200左右。按照并发访问量占总用户数量的5%到10%这样计算,单点tomcat网站的用户人数在1500到4000左右。对于一个为全国范围提供服务的网站显然是不够用的,为了解决这个问题引入了负载均衡方法。负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并发过来的请求被平均分配到多个后台web服务器来处理,这样压力就被分解开来。

负载均衡服务器分为两种一种是通过硬件实现的负载均衡服务器,简称硬负载例如:f5。另一种是通过软件来实现的负载均衡,简称软负载:例如apache和nginx。硬负载和软负载相比前者作用的网络层次比较多可以作用到socket接口的数据链路层对发出的请求进行分组转发但是价格成本比较贵,而软负载作用的层次在http协议层之上可以对http请求进行分组转发并且因为是开源的所以几乎是0成本,并且阿里巴巴,京东等电商网站使用的都是Nginx服务器。

1.安装java

先卸载open-jdk:首先查看java版本,一般Linux内自带了java,需要先卸载。

查看java的版本:java –version

查看java的安装包:rpm -qa | grep java

卸载自带的java:

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

卸载后安装自己的java,解压后即可:tar -xvf jdk-7u71-linux-i586.tar.gz

配置环境变量:

vi /etc/profile, 在末尾行添加

       #set java environment

       JAVA_HOME=/usr/local/src/java/jdk1.7.0_71

       CLASSPATH=.:$JAVA_HOME/lib.tools.jar

       PATH=$JAVA_HOME/bin:$PATH

       export JAVA_HOME CLASSPATH PATH

source /etc/profile  使更改的配置立即生效,java -version  查看JDK版本信息,如果显示出1.7.0证明成功。

2.安装MySQL

可以使用网址进行下载,或者通过上传压缩包。

wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.22-1.el6.i686.rpm-bundle.tar

1)检测是否已经安装了mysql

rpm -qa | grep mysql  

如果已经安装了,将其卸载,如:

rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x86_64

2)安装mysql

tar -xvf MySQL-5.6.22-1.el6.i686.rpm-bundle.tar

3) 安装server

rpm -ivh MySQL-server-5.6.22-1.el6.i686.rpm

若出错:安装依赖:yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6

若需要升级libstdc++-4.4.7-4.el6.x86_64:yum  update libstdc++-4.4.7-4.el6.x86_64

4)安装client

rpm -ivh MySQL-client-5.6.22-1.el6.i686

若出错安装依赖:yum -y install libncurses.so.5 libtinfo.so.5

5)启动mysql服务

service mysql start

6)使用root账号登录mysql

mysql -uroot -p

修改root密码:UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';

7) 系统启动时自动启动mysql服务

加入到系统服务:chkconfig --add mysql

自动启动:chkconfig mysql on

8)开启远程访问

登录:mysql -uroot –p123456

设置远程访问(使用root密码):grant all privileges on *.* to 'root' @'%' identified by '123456';

flush privileges;

防火墙打开3306端口(centos6)

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/init.d/iptables status

3.安装Nginx

nginx是C语言开发,建议在linux上运行。

安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。yum install -y pcre pcre-devel

注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。yum install -y zlib zlib-devel

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。yum install -y openssl openssl-devel

1)编译及安装

第一步:把nginx的源码包上传至linux服务器

第二步:解压源码包。 tar -zxf nginx-1.8.0.tar.gz

第三步:进入nginx-1.8.0文件夹。使用configure命令创建makefile。

第四步:参数设置如下:

./configure \

--prefix=/usr/local/nginx \

--pid-path=/var/run/nginx/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/temp/nginx/client \

--http-proxy-temp-path=/var/temp/nginx/proxy \

--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \

--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

--http-scgi-temp-path=/var/temp/nginx/scgi

注意:上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建tempnginx目录

第五步:make

第六步 make install

2)Nginx的启动及关闭

启动

在nginx目录下有一个sbin目录,sbin目录下有一个nginx可执行程序。

./nginx

关闭nginx

关闭命令:相当于找到nginx进程kill。

./nginx -s stop

退出命令

./nginx -s quit

等程序执行完毕后关闭,建议使用此命令。

动态加载配置文件

./nginx -s reload

可以不关闭nginx的情况下更新配置文件。

4.安装Tomcat

解压tomcat,进入 bin,启动Tomcat。
方式1:sh startup.sh
方式2:./startup.sh

开启端口号 8080

8080端口放行 :/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

将该设置添加到防火墙的规则中:/etc/rc.d/init.d/iptables save

查看日志文件:tail -f logs/catalina.out

在windows下,备份数据库:

mysqldump -uroot -p1234 store28 > g:/1.sql

导入到另外一个MySQL数据库:

先登录mysql,创建数据库 store28,进入store28:source /root/1.sql

将项目打包 war:在tomcat/webapps目录下 只要tomcat启动 war会自动解压

将store.war上传到虚拟机的root目录下,将store.war移动到tomcat/webapps下即可

5.用nginx在window上搭建一个集群


新建两个目录 tomcat1 tomcat2,修改tomcat2的端口 在tomcat1的端口上+10,配置文件server.xml。

解压nginx,修改nginx的 nginx.conf文件

在locatioin / 下添加了反向代理

proxy_pass 代理服务器

这只是代理一台服务器

代理集群

需要在http节点上添加一个

upstream servlet_yujia{
      server 127.0.0.1:8080;
      server 127.0.0.1:8090;
}

修改location /下的反向代理 

proxy_pass http://servlet_yujia

session共享问题

因为这种方式会导致每次发送到服务器的sessionid不一致,会丢失之前的操作。

解决方式1:只能在window下好使

web服务器解决(广播机制),tomcat下性能低

修改两个地方:

1.修改tomcat的server.xml 支持共享

将 引擎标签下的 

注释去掉

2.修改项目的配置文件 web.xml中添加一个节点

 

解决方式2:可以将session的id放入redis中

解决方式3:保证一个ip地址永远的访问一台web服务器,就不存在session共享问题了

在nginx的配置文件中,upstream中添加 ip_hash;

6.在linux搭建集群

解压nginx,先编译nginx

安装依赖包

yum install gcc-c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

执行编译

先进入 nginx的目录

执行./configure

4.安装nginx

执行 

make

make install

5.启动nginx

cd nginx目录下

配置文件 conf

启动nginx 

./nginx 

6.将端口号80 放行

 /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT

将该设置添加到防火墙的规则中

/etc/rc.d/init.d/iptables save

7.修改conf文件 和window下一样

你可能感兴趣的:(Java进阶-21.Ngnix)