新项目开发及运行环境配置-nodejs前台+java后台+postgresql数据库+nginx+tomcat+svn单向备份

前言

日前需要开新项目,那么,就要新建一个svn及网站运行环境了。于是有Lee该文章。
好了,看这篇文章的时候你可以先看看:
阶段巨献 - centos+php-fpm+mariaDB+svn+nodejs,配置linux的php和nodejs网站运行环境。
centos配置ocaml及unison进行双向文件同步搭建
【centos】配置postgresql数据库。
【java开发部署】利用svn及ocaml及unison进行javaweb网站部署

unison的配置

rsync同步文件

tomcat配置要点。

安装说明 
安装环境:CentOS-7.0.1406
安装方式:源码安装 
软件:apache-tomcat-7.0.29.tar.gz 
下载地址:http://tomcat.apache.org/download-70.cgi
安装前提 
系统必须已安装配置JDK6+,安装请参考:在CentOS-6.3中安装与配置JDK-7。
安装tomcat 
将apache-tomcat-7.0.29.tar.gz文件上传到/usr/local中执行以下操作:
代码如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
[root@admin local]# cd /usr/local  
[root@admin local]# wget http://apache.fayea.com/apache-mirror/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz  
[root@admin local]# tar -zxv -f apache-tomcat-7.0.29.tar.gz // 解压压缩包  
[root@admin local]# rm -rf apache-tomcat-7.0.29.tar.gz // 删除压缩包  
[root@admin local]# mv apache-tomcat-7.0.29 tomcat  
启动Tomcat
执行以下操作:
代码如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
[root@admin ~]# /usr/local/tomcat/bin/startup.sh //启动tomcat  
Using CATALINA_BASE: /usr/local/tomcat  
Using CATALINA_HOME: /usr/local/tomcat  
Using CATALINA_TMPDIR: /usr/local/tomcat/temp  
Using JRE_HOME: /usr/java/jdk1.7.0/jre  
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar  
出现以上信息说明已成功启动。
防火墙开放8080端口
增加8080端口到防火墙配置中,执行以下操作:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
[root@admin ~]# vi + /etc/sysconfig/iptables  
#增加以下代码
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
重启防火墙
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
[root@admin java]# service iptables restart  
检验Tomcat安装运行
通过以下地址查看tomcat是否运行正常:
http://192.168.15.231:8080/
看到tomcat系统界面,说明安装成功!
停止Tomcat
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片  
[root@admin ~]#  /usr/local/tomcat/bin/shutdown.sh   //停止tomcat  

第一步、配置svn中的nodejs项目骨架

创建nodejs的项目的步骤为:
1 创建代码仓库
2 设定钩子–post-commit达到自动同步到网站目录的效果
3 设定nginx的子网站配置文件,开放相关端口
4 测试是否成功

需要注意的是,使用的是nodejs的express框架,需要在app.js里面设定使用的端口。这里采用预先采用的端口为:3007

这里有相关设置:
这里写链接内容

相关命令

这里将项目名称暂定为blue-hat
sudo mkdir -p /var/svn/blue-hat
sudo svnadmin create /var/svn/blue-hat
sudo vim /var/svn/blue-hat/conf/svnserve.conf
sudo vim /var/svn/blue-hat/conf/passwd
sudo vim /var/svn/blue-hat/conf/authz
sudo systemctl restart svnserve

注意,请根据参考资料一步一步完成配置,这里不啰嗦了。接下来,给项目添加一个对应的web运行目录,该目录路径初步定为:/usr/local/webroot/blue-hat

/usr/local/webroot/blue-hat

mkdir -p /usr/local/webroot/blue-hat
svn checkout svn://localhost/blue-hat /usr/local/webroot/blue-hat --username testuser --password abc --non-interactive

添加post commit

cd /var/svn/blue-hat/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vi post-commit

这样修改

#!/bin/sh

# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"

WEB=/usr/local/webroot/blue-hat
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log


export LC_ALL=zh_CN.UTF-8

changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG

n=$'\n'
$SVN update $WEB  --username testuser --password abc --non-interactive #更新到我们的目标网站目录。

重启svn

接下来就是svn的上传下载了

注意,开发环境不需要配置nginx+express

配置postgres数据库

略,请自行用脚本进行配置

提醒,数据库的备份还原迁移都是必须要知道的。

配置java项目的svn

这里将项目名称暂定为blue-hat-server
sudo mkdir -p /var/svn/blue-hat-server
sudo svnadmin create /var/svn/blue-hat-server
sudo vim /var/svn/blue-hat-server/conf/svnserve.conf
sudo vim /var/svn/blue-hat-server/conf/passwd
sudo vim /var/svn/blue-hat-server/conf/authz
sudo systemctl restart svnserve

注意,这里不用配置post 钩子。因为源代码不可以直接执行的。

配置java项目的编译文件存放目录

请注意,java编译以后放到一个输出目录,然后输出svn目录,然后将编译好的文件更新到线上,重启tomcat服务器。

这里将项目名称暂定为blue-hat-build
sudo mkdir -p /var/svn/blue-hat-build
sudo svnadmin create /var/svn/blue-hat-build
sudo vim /var/svn/blue-hat-build/conf/svnserve.conf
sudo vim /var/svn/blue-hat-build/conf/passwd
sudo vim /var/svn/blue-hat-build/conf/authz
sudo systemctl restart svnserve

配置相关web 目录。

mkdir -p /usr/local/webroot/blue-hat-build
svn checkout svn://localhost/blue-hat-build /usr/local/webroot/blue-hat-build --username testuser --password abc --non-interactive
接下来我们要修改hook脚本的post commit, 
首先先将post-coomit.tmpl复制一份成为post-commit, 
svn每次更新完以后将会执行post-commit脚本 
然后给脚本执行权限,接下来将脚本内容添加进去–就是下面的脚本例子了。 
然后保存,再重启svn服务,然后测试是否成功。

cd /var/svn/blue-hat-build/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vi post-commit
#!/bin/sh

# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"

WEB=/usr/local/webroot/blue-hat-build
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log


export LC_ALL=zh_CN.UTF-8

changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG

n=$'\n'
$SVN update $WEB  --username testuser --password abc --non-interactive #更新到我们的目标网站目录。

注意,假如你想要同步到另一台svn,可以试试下面代码:

svnsync sync  --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx

svn备份

svn备份用在什么地方?
首先,你有多台svn服务器,其次,你的源代码比较重要,需要备份到其他地方。

假定现在的场景为:
一台本地开发svn服务器,dev-svn,一台线上svn服务器,online-svn,现在需要将dev-svn的某个项目,譬如,projectA备份到online-svn上面,好了,
下面是步骤:

—参考

SVN:利用svnsync定时单向备份同步版本库

1、在online-svn上面设定好存放的svn目录,好了,这步略过—因为文章大篇幅已经说过这步骤了,忘了就翻一翻

2、首次需要初始化项目

-- 请根据实际修改。
svnsync init https://192.168.1.222:9999/svn/svnMirror  file:///zfspool/svn/project --username svnMirror --password 123456  

语法是:svnsync init {备份库url} {源库url} 备份库的用户名 密码
注意本地url是三个斜杠的:///
其中9999是自定义的端口号,如果是默认的可以不用加。

这里写图片描述

-_- 咦又出问题了,查一下原因。。。

svn备份的方式有三种:
1svnadmin dump 
2)svnadmin hotcopy 
3)svnsync. 
优缺点分析
============== 
第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。 
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。 
个人建议在版本数比较小的情况下使用这种备份方式。 
第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份; 
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。 
缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。 
第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。 
优点是:当制作成2个镜像库的时候起到双机实时备份的作用; 

以上不是自己观点,下面真实记录我的svn sync实验过程
两台机器
server1: 192.168.1.224
server2: 192.168.1.225
都是centos6.5环境
首先在sever1上搭建好了一个svn,然后模拟提交了一些东西
然后在sever2上搭建了一个一模一样的svn,保持空的
现在的目的是将server1同步备份到server2
在server1上直接运行:
svnsync init svn://192.168.1.225/ svn://192.168.1.224/
即svnsync init 目标svn链接  源svn链接,执行同步之前的初始化
这一步失败了,报如下错误:
svnsync: Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
提示需要在hooks下面创建一个pre-revprop-change hook
简单解释下,hook类似于操作系统的勾子,svn会在收到一些操作请求的时候执行hooks目录下的对应的脚本,例如想要commit的时候做一些事情就可以在对应的脚本下面添加你要执行的命令,下一次在commit 的时候就会触发执行
一开始没明白,不知道应该在源机器上创建还是在目标机器上创建,其实是在目标机器上创建的
然后在目标机器上copy了一份pre-revprop-change.tmpl成pre-revprop-change
再次执行初始化命令
依然报错,这次的错误不一样了
svnsync: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.
大概就是同步的过程中刚刚创建的hook调用没有成功,然后尝试给pre-revprop-change添加可执行权限,依然失败
依然失败,依然失败,在stack overflow上看到有人提出的解决方法是把pre-revprop-change改成下面这个样子:
#!/bin/sh
exit 0
再次初始化,终于成功,提示先让你输入用户名密码,最后一步的输出如下:


后来经过验证,确实需要可执行权限,改了之后还是失败的原因是hooks执行的结果是失败的,确实执行了
这一步成功之后,下一步同步就直接成功了:
svnsync sync svn://192.168.1.225/


执行这个命令会把没有同步的版本都同步过去
然后为了让server1每次有更新之后都自动同步到server2,可以在server1的commit的hooks最后加上执行一下同步的命令:
svnsync sync svn://192.168.1.225/
这样就完美实现了实时备份,而且在server1出现问题的时候随时都可以直接切换到server2哟


最后有一点要注意的是,我尝试备份到一个不为空的svn,也就是目标svn已经存在要备份的repos的时候,是会失败的,因此,只能备份到一个空的svn

最后还有一个非常重要的要注意的问题就是,如果在直接在目标在做了修改的话,那么后面就没有办法同步了,都会失败,所以,禁止在备份svn上直接做任何操作,这里的花建议专门写一个脚本,在post-commit勾子里面调用,通过脚本来同步,然后判断一下是否同步成功,如果同步失败了需要及时处理,比如可以给相关人员发邮件通知及时处理,防止同步失败了导致server1一旦宕机之后突然发现server2早就没有同步了就晚了。
在SVN中,修改了代码要提交时写好注释是个好习惯,但很多人往往忽略了这一点,所以可以通过设置‍pre-commit钩子来强制要求提交代码时要写注释。在Windows下找到你建立版本库的文件夹中的‍hooks文件夹,新建一个名为‍pre-commit.bat的文件,文件内容如下:
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1
这样就实现了SVN强制注释的功能。
有时我们需要修改注释,这就要设置‍pre-revprop-change钩子了,还是在hooks文件夹中,新建一个名为‍pre-revprop-change.bat的文件,文件内容如下:
setlocal
set REPOS=%1
set REV=%2
set USER=%3
set PROPNAME=%4
set ACTION=%5
if not "%ACTION%"=="M" goto refuse
if not "%PROPNAME%"=="svn:log" goto refuse
goto OK
:refuse
echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2
endlocal
exit 1
:OK
endlocal
exit 0
这样修改注释的功能也完成了

以上内容来自网络,我在配置svn和apache集成的时候发现默认是不能修改日志信息的,用了第二段代码就OK了,系统默认的范例是unix下的,不能直接使用!

好了,按照上面的做法:

在online-svn上面,添加pre-revprop-change可执行文件,以下步骤:

cd /var/svn/你的备份库名称/hooks
vim pre-revprop-change
添加下面内容:

#!/bin/sh
exit 0

好了,保存一下,然后
chmod +x pre-revprop-change
ok。

再执行:

svnsync init https://192.168.1.222:9999/svn/svnMirror  file:///zfspool/svn/project --username svnMirror --password 123456  

这里写图片描述

…..只复制了,版本0。当然,很多时候都是几万的版本,所以,第一次备份很重要:

svnsync sync https://192.168.1.222:9999/svn/svnMirror  

新项目开发及运行环境配置-nodejs前台+java后台+postgresql数据库+nginx+tomcat+svn单向备份_第1张图片

好了,等它传完就可以了。
再等的时候我们来做些脚本,譬如,每次dev-svn上面有更新,那么就同步一下到online-svn。

提问时间:在svn上面如何用钩子同步到其他文件夹?不会的请翻翻之前的配置。

下面说步骤:
在dev-svn上面,你的projectA下面加一个钩子。

cd /var/svn/projectA/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
vim post-commit
然后把 post-commit 中,最后两行替换为
svnsync sync  --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx

即,内容如下:

#!/bin/sh

# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"

WEB=/usr/local/webroot/blue-hat-build
SVN=/usr/bin/svn
LOG=/usr/local/webroot/auto_svn.log


export LC_ALL=zh_CN.UTF-8

changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
echo "now the changed is:$changed">>$LOG

n=$'\n'
svnsync sync  --non-interactive svn://目标ip:(端口号)/source_svnbak --username xxx --password xxx
sudo systemctl restart svnserve

好了,试试是不是实际上会更新。

你可能感兴趣的:(设计架构,研发模式及运维)