跨服务器迁移基于Docker的Gitlab

这两天将gitlab从内网迁移到了外网,以便更好的与外部合作伙伴及客户进行协作。

两台服务器都是 CentOS 7.2,Docker上运行的OMNIBUS版本的gitlab容器。迁移的步骤在网上有不少人记录,有的直接拷贝数据文件和配置文件的,有的是通过gitlab的备份命令来将数据备份,再用恢复命令的。由于这个容器版本的数据与配置都在/srv/gitlab文件夹下面,我就采取了第一种方式,步骤大约是这样的:

1,新服务器上安装Docker环境,配置一切,gitlab跑起来,只不过是一个新的站点而已,如何安装可以参考我这篇文章

2,关停旧服务器,然后将配置与数据文件拷贝到新服务器;

3,新服务器关停原容器,将拷贝过来的服务器配置到容器的数据与配置文件夹中去,然后开起来;

4,以上每一步都做到的话,其实就可以了。

但是实际上还是有点曲折,容易遇到坑,迁移的几个要点记录如下:

1,尽量保证新老服务器上的Docker版本一致,这是出于保险起见。不过本人操作过程中其实有不一致的情况,差了前后一个版本(新服务器的高一个版本,正好是操作的这两天出来的,当时没注意到。),没出问题,毕竟gitlab 容器本来就支持通过拉取latest的镜像来构建新版本gitlab,新版本第一次启动的时候会自动对数据进行migration。

2,新服务器上搭建环境的时候,注意看swap分区是否有创建,没有的话,需要创建,参见我这篇文章

3,从旧服务器拷贝文件到新服务器,要注意文件的权限,尤其是owner会变化,导致新服务器跑不起来。原因是gitlab那些数据文件实际上是容器内的postgreSQL、redis等多个组件各自读写的,具有不同的owner。但通过SFTP或者SCP等方式传到新服务器后,owner变成了操作传输动作的账号。这是一个挺大的坑,很多地方都没有明确提到这一点,也没有特别说明如何解决,后来在官方文档里面某一页的末尾处看到提到了一句,笼统的说遇到文件权限问题时候可以运行如下命令:

sudo docker exec gitlab update-permissions
sudo docker restart gitlab

确实执行之后,问题就解决了。

顺便说一下,当时遇到这个文件权限问题的时候,症状是gitlab容器不停的重启,也没法命令行连进去执行命令。通过查看gitlab日志文件夹,发现reconfigure和sshd两个文件夹有日志产出。其中reconfigure文件夹里面的日志,有提到文件操作权限出错的问题。可惜具体报错信息没有记录下来。

升级PHP7.1后微信支付SDK遇到的一个bug

把PHP版本从5.3.3升级到7.1之后(操作系统版本CentOS 6.8, Apache 2.4),Web应用出现微信支付不能确认的问题。

查看日志,发现微信支付回调程序报错:

undefined index : HTTP_RAW_POST_DATA

网上搜索了一下,知道了答案。在我们所引用的微信商户API的支付SDK(v3版本,下载下来的文件名为WxpayAPI_php_v3.zip)中,WxPay.Api.php 的notify方法中有如下赋值调用:

//获取通知的数据
//$xml = $GLOBALS[‘HTTP_RAW_POST_DATA’];

因为这种取值方式在php5.6之后有可能取不到值(在php7之后的版本中已经弃用),故改为下句:
$xml = isset($GLOBALS[‘HTTP_RAW_POST_DATA’]) ? $GLOBALS[‘HTTP_RAW_POST_DATA’] : file_get_contents(“php://input”);

问题得到有效解决。参考如下链接:

https://secure.php.net/manual/zh/reserved.variables.httprawpostdata.php

http://stackoverflow.com/questions/9553168/undefined-variable-http-raw-post-data

同时,网上也有文章指出该SDK的其它一些错误,可参考:

http://www.cnblogs.com/xxoome/p/5705583.html

安装测试osTicket

从github 上clone 了osTicket v1.10 ,在本地Windows 10环境下安装。是Nginx + php-cgi的开发环境。

配置好php站点后在浏览器中打开。结果第一步安装就报错:

core: Unknown or invalid schema signature xxxxxxxx……….

根据网上文章(参考:https://github.com/osTicket/osTicket/issues/511),知道是换行符的问题,重新从github下载了zip文件,覆盖了原来的代码,然后重新开始安装,一切正常。

CentOS6.8 下升级php5.3.3 到php7.1

阿里云的ECS,从centos 6.5 镜像安装的,后来升到了6.8。PHP版本一直太低,PHP 5.3.3,对laravel也不支持,ThinkPHP5也不支持,就想干脆升到PHP 7.1吧。

其实没什么,就是先要启用remi源。然后卸载5.3.3, yum remove php* ,然后安装php71及一堆相关配件。

中间曾经虚惊一场,安装完后重启httpd,发现php文件没有被解析,直接输出了PHP代码。当时估计是php插件没安装全,当时有篇帖子里面有一个安装脚本,于是直接copy过来安装了一遍。然后就好了。

是周日晚上操作的,子夜开始操作,凌晨三点半左右才弄好睡觉。可惜当时没记录下来具体漏掉没安装的是哪个包,现在回忆也想不起来了。

恢复并重新配置SiteServer构建的网站

在亚马逊美国机房的某网站(操作系统 Windows 2008 R2,SQL Server 2008数据库,SiteServer CMS)连不上了,检查发现操作系统自动做了恢复操作,磁盘都回滚到以前的状态了。由于没有做快照,没法恢复到最近的状态。还好手上有早一些的文件和数据库,应该可以勉强恢复一个版本出来。

义工师兄新建了windows实例,复制了文件,恢复了数据库,遇到好几个问题,逐步解决,记录如下:

1,数据库的登录账号,SQL Server数据库必须支持windows认证+sqlServer认证两种形式;且恢复出来的数据库里面的原用户必须删除重建;账号信息应该与web.config里面记录的一致。本次我们还遇到一个比较妖的问题,服务器上装了两个不同版本的数据库引擎,一个对应 127.0.0.1,一个对应 (local),如果程序中配置得不对,就会报错。

2,要保证程序文件都完整,我们遇到缺少文件的情况,后基本补全,补全的过程要注意路径正确,解压缩要注意路径层次正确。

3,网站首页就报500错误,在IIS中查看网站的”模块”设置,发现提示:“不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的…”,经查,是因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改,需要运行如下命令行解决:

appcmd unlock config -section:system.webServer/hanlers
appcmd unlock config -section:system.webServer/modules
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

以上运行完毕,首页可以显示内容了。

参见:

http://blog.csdn.net/pianpianboy/article/details/40536891

关于new Date()以及时区的问题

最近发现一个小知识点:

在使用<input type=’date’ id=’time_begin’>的时候,因为是日期型,所以是没有时分秒的。这时候,如果在Javascript里面将该值使用new Date(string)转换为Date类型,会根据你当前所在的时区自动加上时间。如以下代码:

var strTime = $("#timebegin").val();
var time_begin = strTime =='' ? null : new Date(strTime);
alert(time_begin);

举例说,我在上海,input框里面选择了2016年10月17日,这时候new Date出来的值,如果alert出来看,会发现是 2016-10-17 08:00:00 (GMT +8:00)。

要解决这个问题只要在字符串后面加上” 00:00:00″就可以了。注意日期与时间之间要有空格。这时候就不会自动加上时区的偏移量了。代码如下:

var strTime = $("#timebegin").val() + " 00:00:00";
var time_begin = strTime =='' ? null : new Date(strTime);
alert(time_begin);

CentOS7上面安装Nginx

可以运行如下脚本:

安装nginx
echo ‘[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1’ > /etc/yum.repos.d/nginx.repo
yum -y install nginx
chkconfig nginx on
service nginx start

解释:

第一步,加源;
第二步安装;
第三步,设为开机自动启动;
第四步,现在就启动

阿里云的CentOS主机增加swap文件

在安装gitlab过程中,老是连不上,后来在unicorn的stderr日志看到说unable to allocate memory。于是研究内存问题。这才发现之前一直忽略的问题:阿里云的CentOS主机默认没有设置swap。于是找了方法,设置如下:

利用swap文件的方式增加虚拟的swap空间,不过执行性能会较实际swap分区稍差。
首先,以root身份连接到服务器
选择一个目录,如/var,进入
# cd /var/
创建swap文件,执行dd命令,增加一个1G的swap文件,根据Redhat公司的建议,swap分区最适合的大小是物理内存的1-2倍
# dd if=/dev/zero of=swapfile bs=1024 count=2048000
这条命令是从硬盘里分出一个2G大小的空间,挂在swapfile上
接着再把这个分区变成swap分区
# /sbin/mkswap swapfile
并使其成为有效状态
# /sbin/swapon swapfile
检查是否正确
# free -m
或者
# /sbin/swapon -s
可看到swap分区和大小以及使用情况

最后需要修改/etc/fstab 文件,使其可以随服务器重启时自动启动swap分区
# echo “/var/swapfile swap swap defaults 0 0” >>/etc/fstab
至此,已全部完成添加swap分区。

[转]2016年你应该学习的语言和框架

2016年你应该学习的语音和框架注:原文链接不详,侵删。2015年,软件开发界发生了很多变化。有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本。下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你在2016年花时间精力去学习的新事物的一些建议。大趋势在过去的几年里,有一个越来越明显的趋势是web应用的商业逻辑逐步从后端转移到了前端,然后后端变得只需要处理简单的数据API。这就让前端开发框架的选择变得尤为重要了。另外一个重要的改变是2015年发布的 Edge 浏览器。这是IE的替代品,拥有全新的界面和更好的性能。跟IE不一样的是它同样采用了跟 FireFox 和 Chrome 一样的快速发布策略。这让JavaScript 开发者社区能够以周为单位获得最新版JavaScript 和 Web标准特性支持而不是像过去一样需要等很多年。语言和平台Python 3.5 在今年发布了,带来了很多新特性 比如 Asyncio,为你带来了类似 node.js 的事件机制,还有type hints。 鉴于Python 3 终于真正地火起来了我们强烈建议你替换掉 Python 2。几乎所有的库都已经支持 Python 3 了,所以现在是一个升级历史遗留代码的好时机。PHP 7 是一个重要的新版本,这个版本修复了很多问题并且带来了新特性和性能提升(看看概览) 。 PHP 7 大约比 PHP 5.6 快2倍, 这对一些大型项目还有WordPress 和 Drupal之类的CMS系统影响很大。 我们强烈推荐 PHP之道,已经更新到最新的PHP7版本。 如果你需要更快的速度并且不介意换一个解释引擎的话,可以试试Facebook在用的 HHVM。JavaScript 也以ES2015 标准 (大家通常叫做 ES6)的形式发布了更新。 为我们带来了激动人心的新功能。 感谢大多数浏览器版本的快速更新, 对 ES2015 的支持已经非常棒了,并且还有 Babel.js 这样的工具可以让你的新代码跑在低版本浏览器上。Node.js 在这一年变化很多,开发者社区曾经分裂成 Node.js 和 io.js,然后又再度合并。 经历过这些之后的结局就是我们得到了一个有很多代码贡献者积极维护的项目,并且拥有了两个版本的 Node : 一个稳定的LTS (长期支持) 版本,这个版本注重稳定性,比较适合长期项目和大公司,和一个非长期支持但是最快实现新特征的版本。Swift 2 在今年初发布了。 这是 Apple 出品的旨在简化 iOS 和 OS X 开发的现代编程语言。 几周前, Swift 正式开源并已经兼容 Linux。这意味着你可以用它来编写服务端应用了。Go 1.5 在几个月前发布了, 并带来了重大的架构调整。 在 2015 年它变得越来越流行并被早期创业项目和开源项目所采纳。这门语言是 非常简单的,所以花一个周末你就能学会。TypeScript 是一个可编译成 JavaScript 的静态类型语言 。这是由微软开发的,所以跟Visual Studio 和开源的 Visual Studio Code editors 完美地集成了。它很快就要大红大紫了,因为即将到来的 Angular 2 就是用它写的。静态类型对大型团队的大型项目特别有用,所以如果你正在大型团队中做大型项目,或者仅仅出于好奇,你也应该尝试一下 TypeScript 。如果为了好玩儿,你也可以试试某种函数式编程语言比如 Haskell 或者 Clojure。也有有趣的高性能语言比如 Rust 和 Elixir。如果你在找一份程序员的工作的话, 职业开发语言比如Java (在第8版中有一些很好的新特性) 和 C# (感谢 Visual Studio Code 和 .net core 实现了跨平台开发和运行) 都值得你在2016年投入时间。挑一个或几个学习: Python 3, Go, PHP 7, ES2015, Node.js, Swift, TypeScriptJavaScript 框架JavaScript框架是web开发技术栈中非常重要的一部分,所以我们单独拿一小节来说这个。今年有两个新标准—— Service Workers 和 Web Assembly,基本改变了现代 Web APP的开发方式。还有一些我们觉得你在2016年应该保持关注的框架新版本发布。Angular.js 已经成为了大型企业首选的 JavaScript 框架。 这个框架即将发布下一个大版本的消息相信大家已经听过一段时间了, 在今年初的时候 Angular 2 发布了开发者预览版。 相对 Angular 1 而言是一次颠覆性的重构,而对我们而言带来了巨大的改进。一旦正式发布就很有可能成为企业应用开发框架的首选,所以 Angular 2 的开发经验将会是你简历里很好的一个加分项。我们建议再等几个月直到最终版正式发布之后才用于生产,不过你不妨现在就读一读他们的 快速上手指南。React 在2015年里持续升温并且持续升级,越来越多的新项目采用它开发。 几个月前他们发布了新的开发工具 。 Facebook 还发布了用于开发支持 Android 和 iOS 平台原生应用的 React Native 框架,这个框架使用了原生界面配合运行在后台的JavaScript线程实现基于React开发原生应用。 可以参考我们今年发表的React初级教程 。Polymer 1.0 是在5月份发布的。 这是第一个稳定且可用于生产的版本. Polymer 主要是基于 Web Components 标准, 这是一份将 HTML, JS 和 CSS 打包成独立组件并便于快速引用的标准。目前只有 Chrome 和 Opera 支持 Web Components标准,但是 Polymer 搞定了浏览器兼容性问题。Ember.js 也发布了一个新版本。 Ember 2 带来了模块化功能、废弃了一些旧特性并提升了性能。 Ember 遵循语义化版本并且开发团队尽可能保证大家能够平滑升级。如果你需要一个稳定且易于升级的框架的话,Ember是个不错的选择。挑一个或几个学习: Angular 2, React, Ember.js, Polymer, Web Components, Service Workers前端Bootstrap 在过去的一年里变得更加流行了,正在成为Web开发的标配。 使用SASS 并支持 flexbox 的第四版将在几个月之后发布,官方保证可以从V3平滑升级 (不会像2年前从 v2 升级到 v3 那样 ), 所以尽管放心,你学的第3版的相关知识照样会适用于第4版。Foundation 是另一个可替代Bootstrap的前端框架。 第6版在年初的时候发布了,这个版本主要侧重于模块化,你可以根据需要定制自己需要的部分以便缩短加载时间。MDL 是一个Google官方发布的用于开发material design web app 的框架。 这个框架在今年初发布并和Polymer目标相似,但是更容易上手。我们曾经写过一篇 精彩的 MDL 与 Bootstrap 差异总结。CSS预处理器也在持续改良。LESS 和 SASS 是当下最流行的两个,大部分功能都差不多。但是,最新的 Bootstrap 4 都已经转向了 SASS,所以2016年要学的CSS预处理器中 SASS 获得了一些优势。当然了,也还有更新的 PostCSS 工具值得留意,但是我们强烈建议先掌握了预处理器再来学这个。挑一个或几个学习: Bootstrap, MDL, Foundation, SASS, LESS, PostCSS后端这几年的Web开发有一个非常明显的趋势。越来越多的应用逻辑转移到了前端,然后后端仅仅是API。然而传统的后端生成页面的应用依然还有生存空间,所以我们觉得学一个经典的全站框架依然是非常重要的。关键取决于你更喜欢那种语言,可选择的非常多。用PHP你可以选 Symfony, Zend, Laravel (还有 Lumen, 这是新一代专注于API开发的框架), Slim 等。用Python 有 Django 和 Flask 。用 Ruby 有Rails 和Sinatra。用Java有 Play 和 Spark。用Node.js你可以选择 Express, Hapi 和 Sails.js ,还有 Go 语言的Revel。AWS Lambda去年就已经发布了,但是这个概念到现在才稳定并能用于生产。这是一种可无限扩展的完全取代传统后端服务器的云服务。你可以根据API被访问时的特定条件或者路由来定义不同的响应方法。这意味着你可以完全不用管服务器。另一个趋势是静态站点生成器比如 Jekyll 和 Octopress(这里有一个完整的同类清单)。这类工具的主要功能是把一堆文本和图片文件渲染成一个完整的静态网站。那些以前通常自己搭一个Wordpress博客程序的开发者现在更喜欢事先生成并直接上传一个静态网站。这样会更加安全(没有后端服务器也不需要数据库)并且性能非常好。结合 MaxCDN 或 CloudFlare之类的CDN服务可以让用户就近访问,明显减少等待时间。挑一个学习: 传统的全栈后端框架, AWS Lambda, 一种静态生成器内容管理系统(CMS)我们主要介绍两种最流行的 CMS系统。都是用PHP写的并且易于部署和上手。他们都因为PHP7的发布获得了明显的速度提升。最近几年 WordPress 已经变得早就不仅仅是个博客程序了。它是一个成熟的 CMS/框架,配合插件可以做任何一种网站。高质量的 WordPress 皮肤是一个巨大的市场,很多自由职业者以 WordPress 相关开发为生。配合类似 WP-API 之类的项目你可以把Wordpress变成一组 REST API 。Drupal 8 在今年发布了。这是一次侧重现代开发最佳实践的重构。使用了 Symfony 2 组件、 Composer 包管理器 和 Twig 模板引擎。成千上万的网站在使用 Drupal,它确实是以内容为主的门户网站的一个很好的选择。数据库这一年Web开发社区对 NoSQL 数据库失去了一些热情,重新回到了关系型数据库比如 Postgres 和 MySQL 身边。这方面著名的例外是 RethinkDB 和 Redis ,他们都很火,我强烈建议你在2016年都试试。MySQL 是最火并且大部分主机供应商都支持的开源数据库。在5.7版里,MySQL 也提供了JSON columns来存储非关系型数据。如果你刚开始接触后端开发,你可能正在找连接到服务器已安装的数据库的方法。很可能是旧版本的,所以你没办法尝试 JSON 类型数据。MySQL已经包含在了很流行的 XAMPP 或 MAMP 之类的软件包里,所以上手很容易。挑一个学习: Redis, RethinkDB, MySQL/MariaDB, PostgreSQL移动应用移动平台一直在进步并且智能机的硬件配置现在跟低端笔记本的性能差不多了。这对于 hybrid 移动开发框架来说是个好消息,基于web技术开发的移动应用将得到更加顺滑、更像原生的体验了。我们曾经写过一篇不错的 Hybrid应用开发框架概览 你或许会感兴趣。最火的 Ionic 框架 和 Meteor 都在最近发布了1.0版本且都适合做移动应用开发。Facebook 开源的 React Native,可以在后台JavaScript进程里运行 React 组件并更新原生的UI界面,让你可以用几乎同一套代码同时写 iOS和Android应用。挑一个学习: Ionic, React Native, Meteor编辑器和开发工具Atom在今年发布了1.0。它是一款使用web技术开发的免费且功能强大的代码编辑器。它背后有一个很多大开发者社区(译者注:github)提供了很多扩展包。它提供好用的自动完成并集成了代码重构和校验工具。差点忘了它还有很多漂亮的皮肤可以选择,并且你可以自己写 CoffeeScript 和 CSS 来定制自己喜欢的皮肤。Facebook 已经这么干了,并且发布了名为 Nuclide 的编辑器。微软在今年年初发布的 Visual Studio Code 给了大家一个惊喜。这是一款支持多种语言并兼容 Windows, Linux 和 OS X 平台的轻量级IDE。它提供了强大的智能代码检查并集成了 ASP.Net 和 Node.js 的调试工具。NPM,Node.js的包管理器,火得一塌糊涂并已经成为了前端和node开发者的标准包管理器。这是帮你的项目管理 JavaScript 依赖最简单的方法并且上手很容易。目前哪怕是一个人开发也有必要用 Git。它的分布式模型让你可以把任何一个文件夹变成一个版本控制仓库,然后你可以把这个仓库发布到 Bitbucket 或 Github,同步到其他电脑上。如果你还没用过 Git,我们强烈建议你把它加入你2016年需要学习的清单里面。挑一个学习: Atom, Visual Studio Code, NPM, Git搞物联网树莓派基金会提前给我们送来了圣诞礼物,Raspberry PI Zero 一种只卖 5 美金的高性能电脑发布了。它搭载了Linux,所以你可以把它变成一台服务器,一个家用自动化装置,一面智能镜子,或者把它集成到别的电器里面打造一个你梦寐以求的能联网控制的咖啡机。2016年是你应该拥有树莓派的一年。