nginx和tomcat集成后重定向引发的问题解决

nginx作为反向代理,监听端口非80端口比如使用88端口,tomcat监听的端口8080,这种情况下当发生302重定向的时候,tomcat默认会重定向到80端口,根本原因就是tomcat的repose的头部带的location的端口默认是80端口,这样nginx就会重定向到80端口导致系统无法访问。如果nginx监听的是80端口自然不会存在这样的问题。

知道问题的根本原因是头部的location不对导致的,那么处理办法就很简单了,这里有两种办法:

1.治标不治本的办法,配置nginx,修改location达到解决问题

proxy_redirect     http://host http://host:88;

2.从根本上解决问题,修改tomcat配置,配置代理的端口

在server.xml配置文件中http的connector节点加入了proxyPort="88"就可以了。

Tomcat在设计的时候是对这种代理服务器和Tomcat集成的情况做了考虑,80端口之所以没问题是因为port为空,浏览器会默认走80端口,如果nginx这代理服务器不是80这个端口应该需要配置proxyPort的属性的,这样就不会遇到这个问题。

MySQL 可以用localhost 连接,但不能用IP连接

1.打开cmd窗口,进入MySql安装的bin目录

2.执行命令登录数据库,之后会出现一行要你输入密码的

mysql -u root -p

3.执行以下命令分配新用户:

grant all privileges on *.* to ‘用户名’@’IP地址’ identified by ‘密码’;

4.执行完上述命令后用下面的命令刷新权限

flush privileges;

5.之后关闭mysql服务,然后启动mysql服务

敏捷开发之Scrum

什么是敏捷开发?

敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。

怎么理解呢?首先,我们要理解它不是一门技术,它是一种开发方法,也就是一种软件开发的流程,它会指导我们用规定的环节去一步一步完成项目的开发;而这种开发方式的主要驱动核心是人;它采用的是迭代式开发;

 

为什么说是以人为核心?

我们大部分人都学过瀑布开发模型,它是以文档为驱动的,为什么呢?因为在瀑布的整个开发过程中,要写大量的文档,把需求文档写出来后,开发人员都是 根据文档进行开发的,一切以文档为依据;而敏捷开发它只写有必要的文档,或尽量少写文档,敏捷开发注重的是人与人之间,面对面的交流,所以它强调以人为核 心。

 

什么是迭代?

迭代是指把一个复杂且开发周期很长的开发任务,分解为很多小周期可完成的任务,这样的一个周期就是一次迭代的过程;同时每一次迭代都可以生产或开发出一个可以交付的软件产品。

 

什么是Scrum?

Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作;把一个开发流程的名字取名为Scrum,你一定能想象出你的开发团队在开发一个项目时,大家像打橄榄球一样迅速、富有战斗激情、人人你争我抢地完成它,你一定会感到非常兴奋的。

而Scrum就是这样的一个开发流程,运用该流程,你就能看到你团队高效的工作。

scrum1

【Scrum开发流程中的三大角色】

产品负责人(Product Owner)

主要负责确定产品的功能和达到要求的标准,指定软件的发布日期和交付的内容,同时有权力接受或拒绝开发团队的工作成果。

 

流程管理员(Scrum Master)

主要负责整个Scrum流程在项目中的顺利实施和进行,以及清除挡在客户和开发工作之间的沟通障碍,使得客户可以直接驱动开发。

 

开发团队(Scrum Team)

主要负责软件产品在Scrum规定流程下进行开发工作,人数控制在5~10人左右,每个成员可能负责不同的技术方面,但要求每成员必须要有很强的自我管理能力,同时具有一定的表达能力;成员可以采用任何工作方式,只要能达到Sprint的目标。

 

下面,我们开始讲具体实施流程,但是在讲之前,我还要对一个英文单词进行讲解。

什么是Sprint?

Sprint是短距离赛跑的意思,这里面指的是一次迭代,而一次迭代的周期是1个月时间(即4个星期),也就是我们要把一次迭代的开发内容以最快的速度完成它,这个过程我们称它为Sprint。

 

如何进行Scrum开发?

1、我们首先需要确定一个Product Backlog(按优先顺序排列的一个产品需求列表),这个是由Product Owner 负责的;

2、Scrum Team根据Product Backlog列表,做工作量的预估和安排;

3、有了Product Backlog列表,我们需要通过 Sprint Planning Meeting(Sprint计划会议) 来从中挑选出一个Story作为本次迭代完成的目标,这个目标的时间周期是1~4个星期,然后把这个Story进行细化,形成一个Sprint Backlog;

4、Sprint Backlog是由Scrum Team去完成的,每个成员根据Sprint Backlog再细化成更小的任务(细到每个任务的工作量在2天内能完成);

5、在Scrum Team完成计划会议上选出的Sprint Backlog过程中,需要进行 Daily Scrum Meeting(每日站立会议),每次会议控制在15分钟左右,每个人都必须发言,并且要向所有成员当面汇报你昨天完成了什么,并且向所有成员承诺你今天 要完成什么,同时遇到不能解决的问题也可以提出,每个人回答完成后,要走到黑板前更新自己的 Sprint burn down(Sprint燃尽图);

6、做到每日集成,也就是每天都要有一个可以成功编译、并且可以演示的版本;

 

7、当一个Story完成,也就是Sprint Backlog被完成,也就表示一次Sprint完成,这时,我们要进行 Srpint Review Meeting(演示会议),也称为评审会议,产品负责人和客户都要参加(最好本公司老板也参加),每一个Scrum Team的成员都要向他们演示自己完成的软件产品(这个会议非常重要,一定不能取消);

8、最后就是 Sprint Retrospective Meeting(回顾会议),也称为总结会议,以轮流发言方式进行,每个人都要发言,总结并讨论改进的地方,放入下一轮Sprint的产品需求中;

nginx负载均衡配置与tomcat+redis会话状态配置

nginx作为反向代理服务器可以用作负载均衡,可以用一台服务器作为负载均衡,上面安装nginx,另外用两台或者更多的服务器作为web应用服务器,上面安装相同的tomcat,nginx根据负载的相关策略将外网访问的请求分发到应用服务器上,每个请求都可能分发到不同的web应用服务器,所以需要处理一下tomcat的session问题,将所有的web应用服务器上tomcat的session统一存储在一个数据库里面比如redis,那么这里就需要一个数据库服务器,总体来要实现真正的负载均衡,至少需要4台服务器。

1.nginx负载均衡配置

nginx具体怎么安装前面有文章介绍。

负载均衡服务器ip:192.168.1.100

web应用服务器ip1:192.168.1.101

web应用服务器ip2:192.168.1.102

nginx.conf配置文件中配置

http {
    upstream tomcat {
         server 192.168.1.101:8080;
         server 192.168.1.102:8080;
    }

...

    server {
	listen       80;
        server_name  localhost;
...

        location / {
                proxy_pass http://tomcat;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
...
}

重启nginx之后,可以访问地址192.168.1.100就能看到tomcat的欢迎页面,刷新页面会在两个web服务器间切换。

2.tomcat+redis会话状态配置

多个tomcat之间共享session,这样不管用户的请求发送到哪台服务器,用户的登陆状态都不会丢失了。

redis的tomcat session管理下载地址:https://github.com/jcoleman/tomcat-redis-session-manager

这个需要下载master分支的源代码下来然后编译,这个分支是tomcat7以上的版本,编译的依赖文件pom.xml如下

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.5.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-catalina</artifactId>
			<version>7.0.27</version>
		</dependency>

编译完成之后将jar和依赖的两个jar包复制到tomcat的lib目录下:

image

jedis就是redis的开发库了,前面文章有介绍.假设redis安装在服务器192.163.168.1.99上,tomcat的配置文件context.xml中配置

<Context>


<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="192.168.1.99"
         port="6379"
         database="0"
         maxInactiveInterval="60"/>

...

</Context>

重启tomcat那么配置就成功了。

总结

以上讲到的是基本的配置,nginx负载均衡上可以根据web应用服务器的硬件能力分配不同的负载策略以充分利用硬件资源,另外nginx可以配置静态文件的缓存功能,这样就不必每个请求都需要后台web服务器处理,静态文件直接由nginx从缓存中获取提高相应速度,缓存部分后续将继续研究。

作为后台的web应用,一定需要注意session的问题,用户的每个请求都会根据策略分发到不同的节点上,还有一些定时任务的处理,在单机的情况下很多定时任务都是放在web容器里面定时处理,在这种负载均衡的情况下一定要避免重复执行,或者将定时任务放到独立的一个服务器上执行。

最后负载均衡做起来之后,更新的时候可以停掉一台web服务器更新应用,另外一台照样提供服务,更新完一台服务器之后再更新另外一台服务器,整个系统看上去是没有停止的,这样就可以做到不间断服务的效果。

linux下安装redis

从官网下载最新版本的redis,http://redis.io/download

安装

1.解压

tar zxf redis-3.0.6.tar.gz

2.进入加压目录,安装

cd redis-3.0.6
make PREFIX=/usr/local/redis install #安装到指定目录中

需要将配置文件从原文件目录复制到目标路径

cp ./redis.conf /etc/redis/6379.conf

配置文件以端口命名,以便可以安装多个redis实例,启动脚本容易区分

修改配置文件里面的配置其中的一行:daemonize yes ,默认是no不在后台运行,想要作为linux服务在开机的时候启动,这里必须配置为yes.

3.配置系统启动服务

cp ./utils/redis_init_script /etc/rc.d/init.d/redis
chkconfig --add redis

添加服务的时候会报错,先把启动脚本修改一下

修改内容如下:

#!/bin/sh 
#chkconfig: 2345 80 90 
# Simple Redis init.d script conceived to work on Linux systems 
# as it does use of the /proc filesystem. 
   
REDISPORT=6379 
EXEC=/usr/local/redis/bin/redis-server 
CLIEXEC=/usr/local/redis/bin/redis-cli 
   
PIDFILE=/var/run/redis_${REDISPORT}.pid 
CONF="/etc/redis/${REDISPORT}.conf"

注意这个脚本里面启动命令后面要加上&以便系统在后台执行

$EXEC $CONF &

4.配置自动启动

chkconfig redis on

客户端

查看数据的客户端,可以看看国人开发的redisclient

下载地址:https://github.com/caoxinyu/RedisClient

客户端是java开发,运行命令

java -jar redisclient-win32.x86_64.2.0.jar

查看数据效果如下:

image

开发库

redis的开发库支持绝大多数语言,官方列表:http://redis.io/clients

java有很多,用的相对广泛的依赖库比如jedis,maven依赖如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.2</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

如何开启MySQL的远程帐号

1.首先以 root 帐户登陆 MySQL

在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,然后cd 进入MySQL 的 bin 目录下,然后输入下面的命令。
MySQL -uroot -p123456                 (123456 为 root 用户的密码。)

2.如何开启MySQL的远程帐号-2

创建远程登陆用户并授权
 > grant all PRIVILEGES on test_db.* to root@’192.168.1.101′  identified by ‘123456’;

上面的语句表示将 test_db 数据库的所有权限授权给 root 这个用户,允许 root 用户在 192.168.1.101 这个 IP 进行远程登陆,并设置 root 用户的密码为 123456 。

下面逐一分析所有的参数:

all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如select,insert,update,delete,create,drop 等,具体权限间用“,”半角逗号分隔。

test_db.* 表示上面的权限是针对于哪个表的,test_db指的是数据库,后面的 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”。

root 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。

192.168.1.101   表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。

123456 为用户的密码。

 

3.如何开启MySQL的远程帐号

执行了上面的语句后,再执行下面的语句,方可立即生效。
        > flush privileges;