在阿里云CentOS6.7上安装docker

安装的时候,最好能参照此官方教程进行https://docs.docker.com/installation/centos/

升级内核

CentOS6.7的默认内核版本是2.6.32-431.23.3.el6.x86_64 可以通过uname -r命令查看

而docker要求的内核是至少3.10往上

可以参考此篇文章来进行内核升级使用yum快速升级CentOS 6.5内核到 3.10.28

虽然说的是CentOS6.5 但是也同样适用于CentOS6.7

升级完毕之后,重启电脑,执行uname -r命令,确定内核已经正确切换为3.10的

安装docker

安装比较简单

先使用 sudo yum update 来确保所有包是最新的

然后使用官方的curl -sSL https://get.docker.com/ | sh 进行docker的安装

启用和配置docker

如果你的运气不错的话,执行sudo service docker start就可以顺利启动docker。

尝试着跑一个hello-world的image,sudo docker run hello-world。如果一切正常。那后面就不需要看。

很不幸,看到这块的都是有问题了。

问题和解决方法

内网IP被占

如果执行docker -d看到的错误类似如下

INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] [graphdriver] using prior storage driver "devicemapper"
WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1
FATA[0000] Error starting daemon: Error initializing network controller: Error creating default "bridge" network: can't find an address range for interface "docker0"

那可以尝试一下我的一些操作

参考了http://www.baijinping.com/pages/2015/07/19/zai-a-li-yun-shang-yun-xing-dockerfu-wu.htmlhttp://www.cnblogs.com/MicroTeam/p/see-docker-run-in-debian-with-aliyun-ecs.html

编辑网络配置文件 vim /etc/sysconfig/network-scripts/route-eth0

注释掉有172.16.0.0的一行

# 172.16.0.0/12 via 10.116.111.247 dev eth0

执行命令route del -net 172.16.0.0 netmask 255.240.0.0 删除掉已经加载的路由信息

然后执行 /etc/init.d/network restart 重启network服务

最后再次启动docker service start docker 成功!

无法限制docker内存

当然,如果还是很不幸的,又有问题,在启动的时候提示

WARNING: WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

这是提示无法对docker进行内存限制。

可以修改/etc/grub.conf 在当前使用的内核的kernel项的最后加上cgroup_enable=memory swapaccount=1

reboot

然后 cat /proc/cmdline 就会发现,配置生效了

这下就真的没问题了。久违的hello, world

参考资料

Nginx 错误[emerg] “server” directive is not allowed here的可能情况

Nginx 错误[emerg] “server” directive is not allowed here的可能情况:检测的配置文件不对

  • 服务器环境:ubuntu 14.04, nginx/1.4.6

  • 执行命令:sudo nginx -t -c /etc/nginx/conf.d/default.conf

  • 命令目的:查看新修改的nginx是否有错误,避免上线导致服务器出错

执行结果:

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/conf.d/default.conf:1
nginx: configuration file /etc/nginx/conf.d/default.conf test failed

default.conf里面的内容:

server {
    listen                      80; 
    server_name                 localhostmanager.com www.shuizhongyueming.com;
    root                        /var/www/www.shuizhongyueming.com;

    location / { 
        index   index.html index.php;
    }   

    # 媒体资源文件
    # TODO: 用一个static.hostmanager.com 之类的域名放置
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
         expires      30d;
    }   

    # 前端代码
    # TODO: 用一个fe.hostmanager.com之类的域名放置
    location ~ .*.(js|css)$ {
         expires      1h; 
    }   
}

一开始以为是语法错误,可是复制了官方文档里面的一个简单PHP站点配置之后,还是报同样的错误,所以基本算排除了语法错误

上网Google的结果,大多说的是server的配置应该放在http里面

可是我的default.conf 是在/etc/nginx/nginx.conf 里面,在http模块下include的,不应该有任何的错误才对

最后自己根据网上这些答案猜测,是我进行语法检测的对象有问题。

要检测现有的修改过的Nginx配置是否有错误,不是单单检测那个修改过的扩展的.conf文件。而是不管任何时候,始终都是去检测主文件/etc/nginx/nginx.conf,只有这样,才能顺利的在对应的模块加载扩展的.conf文件。

这样一来保证了配置的前后语境的正确性,二来,这样才是真正的检测(完全和实际运行情况相符)

所以正确的检测修改的Nginx的语法是否错误的命令应该是:sudo nginx -t -c /etc/nginx/nginx.conf,然后一个欣喜的结果就会是:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

希望这个小的发现能帮助到大家。

grunt-joycss的can’t find node-gd错误的解决方案

解决了在windows下面安装和使用joycss(或者grunt-joycss)时候报gd相关错误的问题

grunt-joycss或者独立的npm的joycss运行在windows下时,经常会报php gd库未安装,或者can’t find node-gd

这个时候npm install node-gd是注定失败的,因为就连作者本身都说了他没法实现在widows下面安装node-gd,而且问题本身不在这,因为joycss是可以调用php的gd库来实现拼图的。

开启php的gd的方法

joycss是通过cli的方式来调用php(也就是命令行的模式),这个和传统的浏览网页时,由apache来调用是不一样的。

把php加入环境变量

找到你安装的php,把php.exe所在文件夹的绝对路径,复制一份,放到计算机->属性->高级系统设置->环境变量->Path(底下的)里,注意用英文的分号(;)来区分别的路径。

这样做是为了能够在命令行里面调用php

查看配置文件地址

可以通过在CMD窗口里面输入 php --ini (php 5.3版本之后支持) 查看

Loaded configuration file: 就是apache调用的php的ini文件的地址

configuration file(php.ini) path: 这个是cli模式下在哪个文件夹下寻找php.ini文件(一般情况下这个目录是没有php.ini文件,这就是很多时候,明明修改了配置文件,但是在命令行下就是不生效的问题)

修改配置文件

  1. 首先是开启GD库

找到extension=php_gd2.dll,把它前面的分号去掉

  1. 修改extension_dir的地址

在某些集成套件的设定里面,extension_dir是相对路径的。

默认情况下,这样的extension_dir也是能正常的在apache调用的时候工作,因为只有一个配置文件,相对路径也没问题。

但是后面是需要把配置文件复制一份到刚刚上一步找到的configuration file(php.ini) path:目录下,所以extension_dir必须改成到ext文件夹的绝对路径,例如:d:/usr/local/php5/ext

  1. 复制配置文件

复制刚刚修改完毕的配置文件,粘贴到configuration file(php.ini) path:指定的目录,一般是:C:windows。然后重命名为php.ini(某些集成套件里面,配置文件可能默认的名字不是php.ini)

重启电脑

试过重启apache,但是对之前的修改貌似没有效果,暂时也不知道是重启哪个服务能让之前的修改生效。所以,重启电脑吧!(如果有别的更好的方法,也欢迎指正)

现在,好好享受joycss!

在提交应用时候遇到missing localized screenshots的经历

描述了在提交应用之后遇到missing localized screenshots错误的解决方案,以及如何取消已经提交的应用文件,然后重新上传

今天在经历数番折磨之后,终于成功的把应用提交到iTunes Connect上面了,看到状态变成“Upload Received”,终于送了一口气,可是没过一会儿,刷新页面一看,状态就变成红色的错误“missing localized screenshots”

按字面意思就是缺少截屏,但是我的3.5inch 和 4inch的图都上传了4张,没问题啊。上网检索了一番,发现可能的可能情况如下:

  • iPhone5的没上传
  • 写了device适配iPad,但是没上传iPad相关的截图

我在应用详情里面编辑截屏,往4inch里面再上传了一张截屏,然后保存。保存的时候,提示我iPad的截屏没有上传。这个时候我就奇怪了,因为我这个应用是打算只发布到iPhone的。

回到xcode里面一看,玩蛋,devices里面写的是universe。现在只能看看iPad下面能不能正常工作了,可惜不能。

现在的问题就变成了如何取消已经上传的应用并重新上传

第一步:取消应用

进入itunes connect -> Manage Your Apps -> 点击对应应用 -> View Details -> Version Information -> Binary Details -> 进入之后,右上角有一个Reject This Binary

点击之后,会要求表明再次上传的包是否有修改,是否加密,以及广告策略

完成之后就能继续上传

第二部:重新上传

在xcode里面,点击对应的target -> General -> Devices 选择iPhone。重新archive,上传即可。

参考文章:
http://miraclei.net/index.php/2013/01/app-store上传应用程序后执行取消操作/

http://stackoverflow.com/questions/12760709/missing-localized-screenshots-error-on-itunes

http://stackoverflow.com/questions/17259886/itunes-connect-complains-missing-localized-screenshot-despite-iphone-5-screens

mac下chrome浏览器的flash插件失效或者没有声音

最近因为工作的原因,开始使用mac进行开发。这也算是往头一回进行ios环境下的开发,也是着实遇到了一些问题。就比如chrome下的flash。

chrome是自带flash的,按理说,不管那个平台下面(手机端不算),flash都是能正常工作的,可是偏偏就是有问题了。

在网上看了下解决方式:

第一步:在新标签页打开chrome://plugins/

打开chrome组件的方式

第二步:点击右上角的“详细信息”按钮

点击详细信息按钮

第三步:停用

查看Adobe Flash Player对应的下面是不是有两个或者多个组件,如果有,则停用,只保留一个(如果只有一个,那就先通过Safari去安装一个flash,再重复第三步)。

一般最后不要保留chrome自带的那个flash——类型为PPAPI(进程外插件)的,问题很可能就出在那上面。

停用PPAPI的Flash插件

完成以上三步之后,重启浏览器或者刷新一下刚刚打开的含有flash的页面,应该就能正常工作了。如果不可以,那就试着启用之前禁用的,禁用之前启用的,切换一下试试。要是再不行,那就没法了。

参考文章:
http://www.howtogeek.com/tips/how-to-fix-flash-videos-having-no-sound-in-chrome-on-mac-os-x/
http://helpx.adobe.com/flash-player/kb/enable-system-flash-player-google-chrome.html

windows modules installer占用过多磁盘读写和CPU的解决方案

解决windows8下面windows modules installer占用过多内存的问题

用windwos8/8.1的时候,虽然电脑很新,性能也还算不错,可总是经常用了一会儿之后,突然的变得非常的卡。

今天又是这样,才开机一个小时左右的,又卡的不得了。决心解决这个问题。

打开任务管理器,看了下进程。发现有个叫windows modules installer的占用了很多的磁盘读写和CPU,弄的电脑的磁盘读写时满满的100%,而CPU也被占据了20%之多。

上网查了下,这个进程主要是进行windows更新。而且也有很多人的window8有着同样的问题。

具体产生这个问题的原因就没看了,但是找到了两种解决方式:

第一种是野路子:http://social.technet.microsoft.com/Forums/windows/zh-CN/2f46738f-75fa-4e48-ba60-79f473aac6f6/windows-modules-installer-worker-is-making-my-computer-hang

在回帖的最后,倒数第三条,有人说了个法子:关闭自动更新。不自动更新,那个进程也就不会被启动了。

第二种是官方的:

据官方说法,安装了这个更新就能解决这个问题和顺带的其他很多很多问题。官方的贴子地址是:http://support.microsoft.com/kb/2771431/en-us上面说到,这个更新对Windows 8 和 Windows Server 2012都是有效的,安装之后可以解决:

A Windows 8-based or Windows Server 2012-based computer experiences high CPU usage when it runs a Windows Update applicability scan. Additionally, the applicability scan takes longer than expected.

我偷懒了,用的第一种方式。很有效,关闭自动更新之后,那个进程立马就没了。然后我又建了个Google日历,隔一个星期提醒我开启自动更新一次。

如果有人不想定期开启自动更新,那可以尝试着用第二种方法,也欢迎反馈一下,让后来者都安心

无法找到来自源 Zend Loader 的事件 ID 5 的描述

讲了针对错误——无法找到来自源 Zend Loader 的事件 ID 5 的描述,的一些解决方法和思路

今天在查看windows日志中的应用程序日志时,发现如下错误:

无法找到来自源 Zend Loader 的事件 ID 5 的描述。本地计算机上未安装引发此事件的组件,或者安装已损坏。可以安装或修复本地计算机上的组件。

如果该事件产生于另一台计算机,则必须在该事件中保存显示信息。

以下是包含在事件中的信息: 

C:WINDOWSTEMPZendLoader.MemoryBase@SYSTEM@3391924446 拒绝访问。

系统:windows 8.1
web环境:nginx/1.5.3 PHP/5.3.27

依旧是先Google了一下,在这篇文章里找到了解决方式

看了不是很理解,找了其中的几个关键词:php.ini,upload_tmp_dir,C:WINDOWSTemp,Network Service,IIS_WPG,ZendOptimizer.MemoryBase@SYSTEM和ZendOptimizer.MemoryBase@NETWORK SERVICE。

大体的意思是:在php.ini中upload_tmp_dir的值为C:WINDOWSTemp的时候,在确保ZendOptimizer.MemoryBase@SYSTEM和ZendOptimizer.MemoryBase@NETWORK SERVICE两个文件存在的时候(没有则新建一个命名相同的空文件),给Temp文件夹添加Network Service和IIS_WPG的写入权限,就能解决问题。

然后我根据这个思路,开始着手根据我自己的环境和配置,尝试着解决问题。

首先,我的php.ini中,关于upload_tmp_dir这块如下:

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 32M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

我的upload_tmp_dir 是被注释掉的,但是file_uploads 是开启的,所以upload_tmp_dir 用的是默认的值。然后在这篇文章中找到如下一句话:

The reason for this is, the uploaded file will inherit the permissions of the directory specified in the directive upload_tmp_dir of php.ini.  If this directive isn't set, the default of C:WindowsTemp is used.

所以我的upload_tmp_dir 在默认值的情况下用的是 C:WindowsTemp

在我的Temp文件夹下是有文件ZendLoader.MemoryBase@SYSTEM@3391924446的,这一点和文章里面说的不太一样,可是我的错误信息里面明确是指定这个文件的,所以暂时不需要添加那两个空文件。

然后就是给Temp文件夹添加权限了,首先得知道Network Service和IIS_WPG分别代表什么?

看MSDN上面的,可以知道Network Service是一个被服务控制管理器(service control manager)使用的本地账号,用来在网络中代表这台计算机。

这篇文章里面找到的针对IIS_WPG的定义是:

There was also a group called IIS_WPG, which was used as a container for all the application pool identities. During IIS setup, all the appropriate resources on the system were granted the correct user rights for the IIS_WPG group so that an administrator only needed to add their identity to that group when they created a new application pool account.

大致的意思是给所有IIS应用管理权限的一个组。

可问题是,我用的不是IIS,所以得找到和Nginx相关的账号.可是看了下,貌似nginx和IIS不一样,它是一个服务,是运行在本地系统账户下的一个服务。所以我不知道该怎么办了。先给Temp账户添加了Network Service的写入权限。然后清空日志,看看明天重启的时候报什么错吧

============== 后续更新 =====================

2013年10月24日

今天开机一段时间之后,查看应用程序日志,没有发现此错误

2013年10月25日

今天开机之后,查看应用程序日志,问题再次出现,分为两种问题状态:

C:WINDOWSTEMPZendLoader.MemoryBase@SYSTEM@3391924446
拒绝访问。

Unable to write base address
拒绝访问。

服务器没有在要求的超时时间内向 DCOM 注册

服务器没有在要求的超时时间内向 DCOM 注册,可能的问题时network service没有足够的启动和激活权限

今天查看系统日志发现有如下两个问题:

  1. 服务器 {F9717507-6651-4EDB-BFF7-AE615179BCCF} 没有在要求的超时时间内向 DCOM 注册。
  2.  Provider 
  3.  
  4.    [ Name]  Microsoft-Windows-DistributedCOM 
  5.    [ Guid]  {1B562E86-B7AA-4131-BADC-B6F3A001407E} 
  6.    [ EventSourceName]  DCOM 
  7.  
  8.   - EventID 10010 
  9.  
  10.    [ Qualifiers]  0 
  11.  
  12.    Version 0 
  13.  
  14.    Level 2 
服务器 {EA022610-0748-4C24-B229-6C507EBDFDBB} 没有在要求的超时时间内向 DCOM 注册。
Provider 

   [ Name]  Microsoft-Windows-DistributedCOM 
   [ Guid]  {1B562E86-B7AA-4131-BADC-B6F3A001407E} 
   [ EventSourceName]  DCOM 
 
  - EventID 10010 

   [ Qualifiers]  0 
 
   Version 0 
 
   Level 2 

在网上找到有个人跟我系统差不多同时也是遇到同样问题的,链接如下:
http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/error-microsoft-windows-distributedcom-id10010/481acdc3-3402-40ac-af9a-330908fd5754

具体的方式是通过给 Network Service 角色添加相应的权限,步骤如下:
A. 在“运行”里面输入命令dcomcnfg
B. 双击“组件服务”->双击“计算机”
C. 右键点击“我的电脑”,选择“属性”
D. 点击“COM安全”菜单项
E. 在“启动和激活权限”的区域内,点击“编辑默认值”
F. 点击“添加” ,在“输入对象名称来选择”下方区域内输入“Network Service” ,可点击右侧的“检查名称”来规范正确的输入,之后点击“确定”
G. 确保选中了“NETWORK SERVICE”,点击下方的复选框,保证如下权限的“允许”是选中的:
H. 本地启动
I. 远程启动
J. 本地激活
K. 远程激活
L. “确定”->“确定”

下面的链接是微软官方对Event ID 10010的说明
http://technet.microsoft.com/en-us/library/cc774175(WS.10).aspx

机器就按上述的设置了,具体的效果等随后一段时间看看是否还会有上述问题发生,来确定设置是否有效