前言
这一次的总结内容范围比较广,主要对代码管理到系统发布、系统维护和其中中可能会出现的一些安全问题进行总结。
代码管理
工具和代码托管平台
在一个项目开始之前,首先要选择一款代码管理工具,目前流行是 GIT
和 SVN
,如果没有历史问题,建议都使用 GIT
进行代码管理。
选好了管理工具后,需要选择托管平台,目前国内有 码云
、Coding.net
等,国外有 GitHub
、GitLab
。需要注意的是代码仓库的私有性, GitHub
的私有项目是需要收费的。我个人喜欢把私有项目托管在 码云
,把公开项目托管在 GitHub
。
分支管理
新建一个仓库后,我往往喜欢新建一个 dev
分支作为开发, docs
分支用于存放文档、设计图,并把 master
分支空出来。在 dev
分支上完成一次版本开发后,再合并到 master
分支上去。所以 master
分支上存放的一直是可用的、稳定的版本。
在进行二次开发时,我喜欢从 dev
拉出新分支,用作二次开发,完成后再考虑合并回去。
一般什么情况下需要拉分支呢?
- 从需求的角度,版本次号不同,需要拉新分支。这是为了影响目前版本的系统。
- 子系统拆分。比如后台管理、Web门户、手机端平台是三个不同小组负责的,所以拉三个分支。
- 需要紧急修复的bug,拉一个bugfix分支。这是临时分支。
一次完整版本的发布,都需要保存为一个分支,用于进行回退操作。
提交原则
什么时候进行一次 git commit
?其实什么时候都可以,但是为了更好的管理,更方便回退操作,一次提交满足以下几点是比较好的:
- 区分度高。要么是完成了新功能开发,要么是修复了某一个bug,不能又完成了功能又修复了bug。
- 尽量完整。在完成新功能时,必须完成测试才进行提交,不提交半成品,修复bug也是如此。
在一次 commit 中,必须注明本次commit做了什么工作。
系统发布
目前云服务器盛行,腾讯云、阿里云都有学生机,一般都是1核 1G 1M + 40G云硬盘的配置。这样的配置下,尽量选择 linux
作为操作系统,可以榨到比较好的性能。
系统的发布步骤是:部署软件环境、部署代码、部署数据库、部署脚本文件、调试。
环境部署
如果是在实机上部署,那需要检查以下几点:
- 软件版本是否符合
- 软件所需要的支持库是否安装
- 系统是否兼容(win开发,发布在linux下会有些兼容问题,比如换行字符、系统分隔符)
具体来说,需要使用操作系统自带命令如 yum
、 apt-get
安装符合Web网站的软件如 php
、 nginx
、mysql
等,并检查这些软件的扩展功能是否打开。
如果是在虚机部署(比如使用Docker),则只需要部署好容器即可完成上述操作了。
代码部署
如果是托管在代码仓库里的,可以用 git
和 svn
命令进行部署。
如果没有托管,则需要压缩源代码,使用 rz
或 scp
等命令上传到服务器。
这里需要注意的是, npm
包、composer
包不要打包上去,而是在服务器上使用 npm install
和 composer install
命令进行安装。因为这些文件往往很多很大,使用命令安装比较快。
用户上传的资源也不要打包部署到服务器上。因为发布操作尽量部署纯净的源代码文件,尽量少一些数据文件。
数据库部署
使用 mysqldump
导出数据库表结构
,数据不导出的原因是为了保持发布的网站的纯净性,所以本地的测试数据就不要部署到线上系统了。
脚本文件部署
一些自己编写的系统辅助工具,比如用于检测服务器状态的脚本、用于转码视频文件的脚本服务,需要一起部署上去。
调试
先进行冒烟测试,再进行单元测试即可。
服务器安全
首先是隐藏错误信息,线上环境下产生的异常信息,一定不能显露给用户看到,并且需要把错误信息记录到日志中方便查阅。PHP中设置 error_reporting(0)
即可隐藏所有错误。
以下是一些经验性原则:
- 限制端口。只开放Web端口
80
、443
和 ssh对应的端口。 - 尽量禁用root远程登录。
ssh
、mysql
、redis
等软件尽量不使用默认端口22
、3306
、6379
等。- 服务器的所有使用者均分配独立账号,并根据分工建立不同的用户组。
以下是针对mysql的一些原则:
mysql
数据库的root禁止远程登录。mysql
开启bin log日志,用于恢复数据库。(也就是开启备份)- 不同的应用建立不同的mysql账号。
- 只给mysql账号以
select
、update
、delete
、insert
权限。 - 定期备份数据库到其他地方。