///////--------------- linux搭建SVN服务器 并且实现项目自动同步 本教程使用的是 阿里云 centerOs 7.1 ---------------/////////////////
0.ssh登录linux服务器
ssh root@你的服务器ip(ps:接着会让你输入密码,密码不显示,直接输完 enter 就行了)
1.安装svn服务器端
yum install subversion
2.进入目录,准备创建svn目录
cd /usr/local/
3.创建一个svn目录
mkdir svn
4.修改目录权限为777
chmod -R 777 svn
5.创建一个svn版本仓库first(first可以随便起名字)
svnadmin create /usr/local/svn/first
6.进入first版本仓库下的配置文件目录
cd first/conf
7.编辑svnserve.conf配置文件
vim svnserve.conf (基本常识:vim 编辑文件 进如按E编辑 编辑好后 按esc 后:W 保存 :q退出)
//配置版本库信息和用户文件和用户密码文件的路径、版本库路径
anon-access = none //默认是只读read
auth-access = write //认证后有写入权限
password-db = passwd //帐号密码配置文件
authz-db = authz //权限配置文件
realm = first //改成自己的版本库 生效范围
8.编辑authz权限文件
vim authz
//文件,创建svn组和组用户的权限
[group]
first = ddl,shl //创建一个first的组,并制定两个用户ddl和shl
[/] //制定根目录下的权限
@first = rw //first组用户权限为读写
* = r //其他用户只有读权限
9.编辑passwd权限文件
vim passwd
//创建或修改用户密码
[users]
ddl = 123456 //用户名 = 密码
shl = 123456 //用户名 = 密码
10.设置SVN服务开机自启动
1. 在root目录加入svn.sh
touch /root/svn.sh
2. 让后在svn.sh写入内容
vim /root/svn.sh
////----写入的内容----////
#!/bin/bash
/usr/bin/svnserve -d -r /usr/local/svn/cnmiaosu
////----写入的内容----////
3. svn.sh该脚本添加可执行权限(非常重要)
chmod +x svn.sh
4. 加入自动运行
1.vim /etc/rc.d/rc.local
在末尾添加脚本的路径:
/root/svn.sh (按esc 后:W 保存 :q退出)
2.最后 给 /etc/rc.d/rc.local 加入执行权限,因为在centos7中,/etc/rc.d/rc.local文件的权限被降低了,开机的时候执行在自己的脚本是不能起动一些服务的,执行下面的命令可以文件标记为可执行的文件
chmod +x /etc/rc.d/rc.local (非常重要)
11.使用post-commit实现自动部署,实现本地提交svn后,自动同步服务器中项目
1.打开hooks文件夹
cd /usr/local/svn/hooks
2.复制post-commit.tmpl 文件为 post-commit
cp post-commit.tmpl post-commit
3.打开post-commit文件
vim post-commit
4.文件内容清空内容,修改为以下代码:
#!/bin/sh
export LANG=en_US.UTF-8
/usr/bin/svn update --username ddl --password 123456 /www/web/myweb
注意: /usr/bin/svn 是svn的路径,不是项目路径,应该都是一样的;
--username ddl --password 123456 svn账户和密码
/www/web/myweb 项目路径(需要实时同步的项目)
5.修改post-commit的可执行权限
chmod 755 post-commit
6.在上面我见了一个svn版本库为first,但是这只是版本库,并没有项目,那么我们需要在版本库里面新建项目(也就是建立一个文件夹)
这里推荐使用 windows 下面的 TortoiseSVN 客户端,打开版本库后右键 建立一个 《myweb》 项目文件夹,然后把所有的项目文件 拖入到 该文件夹内 上传svn服务器;
注意:为什么不推荐用linux方式上传项目到svn服务器中,因为linux上传一个个文件上传很麻烦,所以推荐 TortoiseSVN 客户端 上传
7.在服务器进入项目目录/www/web/myweb checkout 整个项目。
注意此处不要checkout文件夹,正确代码应该是这样:
svn checkout svn://{您的服务器地址}:{端口号}/myweb . //注意目录后面还有一个点
12.常见错误,我遇到的
1.255错误:post-commit没有给执行权限 或者 头部没有执行用sh执行,就是没有#!/bin/sh
2.提示跳过目录:服务器目录没有checkout代码,记得一定要先checkout一次,才能同步(!,每次新建项目都需要)
3.什么提示也没有:这种情况出现在用工具commit的时候,成功了,但是就是没有同步,建议你到linux下,使用./post-commit手动执行看报什么错误。如果乱码,请将文件内编码格式修改为GBK
4.提示**** is a direcitory:/usr/bin/svn你把这个搞错了,他不是一个目录,是svn的路径
12.需要注意的问题;
1.SVN版本库起动方式,现在svn下面有 first、test 两个版本库
1:单版本库起动 svnserve -d -r /usr/local/svnRepo/first
2:多版本库起动 svnserve -d -r /usr/local/svnRepo
2.如果使用的是阿里云服务器需要在《安全策略》中加入 3690 端口
3.如果使用的是wdcp面板,需要在防火墙中加入 3690 端口
///////--------------- 常用:svn命令 ---------------/////////////////
lsof -i :3690 查看svn是否启动
ps aux |grep 'svn' 查找所有svn启动的进程
kill -9 2505 杀死2505这个查找到的svn进程
svnserve -d -r /usr/local/svn/first 启动svn
netstat -anp|grep svnserve 查看一下SVN信息
svnserve --version 查看一下SVN版本
svn checkout svn://120.55.59.185/cmf_cnmiaosu_com . 检出数据
///////--------------- Mac下使用iTerm2让SSH记录远程服务器账号和密码 ---------------/////////////////
第一步:打开Finder,在菜单栏找到『前往』→ 『前往文件夹...』,输入:~/.ssh/ 然后回车
第二步:新建一个文件,命名为example吧,里面写入内容:
[code]
set user 服务器账号
set host 服务器IP
set password 服务器密码
spawn ssh $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof
[/code]
第三步:到官方http://www.iterm2.com/下载并打开iTerm2,菜单栏找到『Profiles』→『Open Profiles...』,打开面板上,点击右下角『Edit Profiles...』
第四步:在打开面板,左边应该是选中默认default,右边找到Command,默认应该是Login shell,选中Command,里面输入:expect ~/.ssh/example
第五步,下次打开iTerm2,是不是默认就登录上服务器了?极大提升效率。
///////--------------- Nginx下使Thinkphp URL模式支持PATHINFO和REWRITE ---------------/////////////////
第一步:找到location ~ \.php { ,把$去掉,并在里面加上这两句
fastcgi_split_path_info ^(.+\.php)(.*)$; #增加
fastcgi_param PATH_INFO $fastcgi_path_info; #增加
即:
location ~ \.php { #去掉$
root html
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(.*)$; #添加
fastcgi_param PATH_INFO $fastcgi_path_info; #添加
}
第二步:支持REWRITE去掉index.php
找到location / { 在里面加上
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?s=$1 last;
break;
}
即:
location / {
root html
index index.html index.htm index.php;
if (!-e $request_filename) { #添加
rewrite ^/(.*)$ /index.php?s=$1 last; #添加
break; #添加
} #添加
}
第三步:如果thinkphp不是部署在网站根目录下,即需要把
rewrite ^/(.*)$ /index.php?s=$1 last;
改成
rewrite ^/子目录/(.*)$ /子目录/index.php?s=$1 last;
第四步:如果根目录下有多个项目的话,可以写多个rewrite:
if (!-e $request_filename) {
rewrite ^/项目1/(.*)$ /项目1/index.php?s=$1 last;
rewrite ^/项目2/(.*)$ /项目2/index.php?s=$1 last;
rewrite ^/项目3/(.*)$ /项目3/index.php?s=$1 last;
break;
}