写在前边
最近一直在做毕业设计,基于Nginx的高可用大并发微信电子商城系统设计与实现,由于项目是在线上负载均衡,且开发是在本地Windows环境下,需要把项目分别上传到两个服务器。
ftp的话,每次有点改动都要拉整个文件夹覆盖,太慢了。
git的话,我的github只有公共空间,有了上次博客上传到github被黑的教训以后,我再也不敢把带有关键服务账户和密码的项目上传到github了
所以,综合比较还是svn比较合适。
我的服务器环境为CentOS 7 1708 64位
安装subversion
SVN全名Subversion,即版本控制系统。SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。作为一个开源的版本控制系统,Subversion管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository)中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本,或是浏览文件的变动历史。Subversion是一个通用的系统,可用来管理任何类型的文件,其中包括了程序源码。1
yum install -y subversion
ps: 这里特别说明一下,linux下svn服务端和客户端都是这个
开启svn服务
创建仓库
我们这里在 /var/www/
下建立一个名为 svn
的仓库(repository),以后所有代码都放在这个下面,创建成功后在svn
下面多了几个文件夹。1
2
3
4
5$ mkdir /var/www/svn
$ cd /var/www/svn
$ svnadmin create /var/www/svn
$ ls
conf db format hooks locks README.txt
conf
文件夹存放配置文件的,我们来看一下
1
2
3
4
5
6
7 $ tree conf/
conf/
├── authz #权限控制文件
├── passwd #帐号密码文件
└── svnserve.conf #SVN服务配置文件
0 directories, 3 files
仓库创建完成
注意:
- 或许你需要先安装
tree
,输入命令yum install -y tree
- 或者
ls conf/
得到authz passwd svnserve.conf
配置svn服务
配置passwd
1 | $ vim conf/passwd |
上面的例子中我们创建了2个用户,一个svn,一个svnre
配置authz
1 | $ vim conf/authz |
配置svnserve.conf
找到如下五项,取消前边的注释并设置1
2
3
4
5
6
7$ vim conf/svnserve.conf
anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = passwd #使用哪个文件作为账号文件
authz-db = authz #使用哪个文件作为权限文件
realm = /var/www/svn/ # 认证空间名,版本库所在目录
注意:
- 如果你的目录和我的不一致,最后一行的realm要记得改成你的svn目录
- 一定要记得取消注释,注释时切记前面不要留有空格
SVN服务的启动和停止
1 | $ svnserve -d -r /var/www/svn //-d 表示守护进程, -r 表示在后台执行,默认端口为3690 |
如果你启动了多个svnserve,想停止其中一个1
2
3
4
5
6$ ps -ef | grep svnserve
root 4148 1 0 Dec12 ? 00:00:00 svnserve -d -r /var/www/svn/a/
root 8995 1 0 Dec09 ? 00:00:00 svnserve -d -r /var/www/svn/b/ --listen-port 3691
root 14855 1 0 Dec19 ? 00:00:00 svnserve -d -r /var/www/svn/c/ --listen-port 3692
root 27538 27343 0 09:39 pts/0 00:00:00 grep --color=auto svnserve
$ kill 8995 //停止3692端口的svnserve
客户端连接
windows中使用TortoiseSVN连接,输入地址 svn://你的IP 即可,不出意外输入用户名和密码就能连接成功了。
默认端口3690,如果你修改了端口,那么要记得加上端口号。
注意
如果无法连接,可能是你的防火墙没有开放端口,CentOS 7 默认使用firewall作为防火墙,Firewall使用总结1
2
3
4$ firewall-cmd --zone=public --add-port=3690/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
success
$ firewall-cmd --reload
success
如果是云服务器,请在防火墙开放端口后,进入控制台,在实例安全组中配置开放端口
SVN客户端命令使用
将文件checkout到本地目录
1 | svn checkout svn_path local_path |
往版本库添加新的文件
1 | svn add file |
添加完成以后需要提交到版本库。
将改动的文件提交到版本库
1 | svn commit -m '注释内容' [-N] [--no-unlock] PATH |
加锁/解锁
1 | svn lock -m '加锁注释内容' [--force] PATH |
更新版本
在修改文件之前,一定要先更新版本库,再修改文件,然后提交。
如果提交的时候提示过期,是因为冲突,需要先update,修改文件,然后清楚 svn resolved ,最后再提交commit。
1 | svn update -r m PATH |
查看文件或者目录状态
1 | svn status PATH |
删除文件
1 | svn delete PATH -m '注释内容' |
查看日志
1 | svn log PATH |
查看文件详细信息
1 | svn info PATH |
比较文件及目录差异
1 | svn diff PATH |
将两个版本之间的差异合并到当前文件
1 | //将m版本和n版本合并到当前文件 |
SVN 帮助
1 | svn help |
在版本仓库中添加文件夹
1 | //在svn版本仓库中添加文件夹 |
代码库URL变更
1 | svn switch (sw): 更新工作副本至不同的URL。 |
解决冲突
1 | svn resolved: 移除工作副本的目录或文件的“冲突”状态。 |
一点tips
如果使用svn管理web项目,建议切换到web服务的用户去使用客户端命令
PHP中大部分流行的框架在Linux都需要web服务用户对cache
文件夹拥有权限。
查看web服务用户
- apache查看
1
2
3
4
5$ ps -aux | grep httpd
www 1813 0.0 2.5 809032 26276 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1814 0.0 2.7 809076 28412 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1815 0.0 2.4 809032 24468 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1816 0.0 2.5 809040 26396 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
那么apache
服务的用户就是www
从apache
配置文件中也可以看到1
2
3
4
5$ cat /etc/httpd/conf/httpd.conf
...
User www
Group www
...
- nginx查看
1
2$ ps -aux | grep nginx
nginx 4400 0.0 0.1 47164 2516 ? S Dec12 0:02 nginx: worker process
那么nginx
服务的用户就是nginx
从nginx
配置文件中也可以看到1
2
3
4$ cat /etc/nginx/nginx.conf
...
user nginx
...
配置web用户
以apache
为例
先保证www
可以使用su
1
2
3
4
5$ vim /etc/passwd
找到
www:x:1000:1000::/home/www:/sbin/nologin
修改为
www:x:1000:1000::/home/www:/bin/bash
使www
可以使用sudo
1
2
3
4
5
6
7
8
9$ visudo
找到
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
在下面添加一行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
www ALL=(root) ALL
然后就可以使用sudo -u www svn up
,输入svn帐号和密码就可以了