MongoDB的特点

主要特点

  • MongoDB面向文档存储,操作起来比较简单和容易
  • 你可以在MongoDB记录中设置任何属性的索引(如:FirstName=”Sameer”,Address=”8 Gandhi Road”)来实现更快的排序
  • 你可以通过本地或网络创建数据镜像,这使得MongoDB有更强的扩展性
  • 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片
  • Mongo支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数据
  • MongoDB使用的update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段
  • MongoDB中的Map/reduce主要是用来对数据进行批量处理和聚合操作
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理
  • Map函数和Reduce函数是使用Javascript所编写,并可以通过db.runCommand或mapreduce命令来执行
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
  • MongoDB支持各种编程语言:ruby,python,java,c++,php,c#等多种语言
  • MongoDB安装简单

RDBMS vs NoSQL

RDBMS

  • 高度组织化结构数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键-值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • CAP定理
  • 高性能,高可用性和可伸缩性

NoSQL优缺点

优点

  • 高可扩展性
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据
  • 没有复杂的关系

缺点

  • 没有标准化
  • 有限的查询功能(到目前为止)
  • 最终一致是不直观的程序

vsftpd安装和使用

刚才想安装一个博客相关的插件,结果提示需要使用到ftp进行文件的安装,才想到我服务器没有搭建ftp服务,于是有了这篇文章。这一篇是新写的,不是从以前的云笔记迁移过来的。

首先判断你服务器上是否安装了vsftpd

rmp -q vsftpd

如果提示你没有安装,则使用以下命令安装

yum -y install vsftpd

安装完成之后就启动vsftpd服务

service vsftpd start

到vsftpd的主配置文件里面, /etc/vsftpd/vsftpd.conf

把这个改为NO 默认是YES (改为NO 就是禁止匿名用户登录,不需要注释)

把ftp用户限制在自己的家目录,否则太危险了

默认是注释掉的,把#号去掉 然后重启vsftpd

创建ftp用户,创建的时候ftp用户家目录根据自己要求指定,比如我的是/usr/share/nginx/html目录。

useradd -s /sbin/nologin -d /usr/share/nginx/html  wanlianbo

(注:wanlianbo这个用户只能连接ftp无法登录系统,默认家目录是在/usr/share/nginx/html 文件夹下面)

给wanlianbo这个用户设置密码

passwd wanlianbo

给这个用户加上之前设定的家目录写的权限,不然无法上传文件

chmod o+w /usr/share/nginx/html

重启vsftpd服务,并且下次自动启动

service vsftpd restart

chkconfig vsftpd on

检查防火墙是否开启,开启需要关闭防火墙

service iptables status

service iptables stop

然后用软件来链接ftp测试一下

我使用的是firefox的一个插件FireFTP,可以在Extension里搜索安装,然后在自定义里把图标显示在菜单栏里。

点击打开后,创建一个连接目标,如下图:

把需要连接的目标机器ip和刚才创建的ftp用户名和密码填入,自己取一个连接名称点击OK即可。如下图:

选中刚才创建的连接,点击connect:

连接时,下面的控制台会输出信息,成功后,就能看到给用户设定的家目录下的文件了:

linux学习之cygwin

个人建议:
如果你在完全使用linux之前,觉得不太适应;
或者在windows里安装虚拟机然后再安装Linux觉得麻烦,也可能机器性能不够好(现在基本已经可以排除这个原因了);
那么,这个软件非常适合你,我在彻底转到linux之前,就是使用的这个软件,直到有一天,我觉得使用这个还不如使用Linux方便的时候,就把电脑系统换成了Ubuntu,当时简直是无缝对接,从此再也没有换回windows.
Get that Linux feeling – on Windows
http://www.cygwin.com
安装之后,下次如果要安装其他的插件,还是使用该setup.exe安装

jquery $.ajax异步上传文件

解决方案:利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个”表单”.比起普通的ajax, 使用FormData的最大优点就是我们可以异步上传一个二进制文件.

下面以导入excel文件为例,怎么把这个excel文件异步提交

1》  html代码

<form method=’post’ target=”uploadframe” enctype=”multipart/form-data” id=”import_form” class=”tableform”>
<div class=”division”>
<table border=”0″ cellspacing=”0″ class=”gridlist” cellpadding=”0″>
<tr>
<td style=’width:100px;height:30px;’>导入文件:</td>
<td style=’text-align:left;’> <input type=’file’ name=’import_file’ id=’ImportType’/></td>
</tr>
</table>
</div>
<div class=”table-action”>
<{button label=$___desktop=”导入”|t:’desktop’ id=”ImportBtn” type=”button”}>
</div>
<div style=”text-align:center;overflow-y:auto;” class=’tips’>

</div>
</form>

<script type=”text/javascript” src=”/public/app/webpos/statics/pc/js/jquery-1.9.1.js”></script>
<script>
jQuery(document).ready(function(){
jQuery(“#ImportBtn”).click(function(){
var domForm = jQuery(‘#import_form’)[0];
//将form对象直接作为参数 new FormData对象
var formData = new FormData(domForm);
jQuery.ajax({
url:’/index.php/shopadmin/index.php?app=b2c&ctl=admin_purchase_price&act=import_price’,
type: “POST”,
dataType:”json”,
data: formData,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // / 告诉jQuery不要去设置Content-Type请求头
//这是关键 获取原生的xhr对象 做以前做的所有事情

beforeSend:function(){
console.log("正在进行,请稍候");
},

xhr: function(){
var xhr = jQuery.ajaxSettings.xhr();
xhr.upload.onload = function (){
}
xhr.upload.onprogress = function (ev) {

if(ev.lengthComputable) {
var percent = 100 * ev.loaded/ev.total;
}
}
return xhr;
},
success:function(data){

jQuery(‘.tips’).html(data.msg);
}
});

});

 

配置nginx + php + php-fpm 出现File not found的错误

nginx php File not found 错误

使用php-fpm解析PHP,”No input file specified”,”File not found”是令nginx新手头疼的常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php- fpm返回给nginx的默认404错误提示。

比如我的网站doucument_root下没有test.php,访问这个文件时通过抓包可以看到返回的内容。

HTTP/1.1 404 Not Found
Date: Fri, 21 Dec 2012 08:15:28 GMT
Content-Type: text/html
Proxy-Connection: close
Server: nginx/1.2.5
X-Powered-By: PHP/5.4.7
Via: 1.1 c3300 (NetCache NetApp/6.0.7)
Content-Length: 16

File not found.

 

很多人不想用户直接看到这个默认的404错误信息,想自定义404错误.

给出解决办法前我们来先分析下如何避免出现这类404错误,然后再说真的遇到这种情况(比如用户输入一个错误不存在的路径)时该怎么办,才能显示自定义的404错误页。

一、错误的路径被发送到php-fpm进程

出现这类错误,十个有九个是后端fastcgi进程收到错误路径(SCRIPT_FILENAME),而后端fastcgi收到错误路径的原因大都是配置错误。

常见的nginx.conf的配置如下:

 

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  

    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }

    location /images {
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

这个配置中有很多不合理的地方,其中一个明显的问题就是root指令被放到了location / 块。

如果root指令被定义在location块中那么该root指令只能对其所在的location生效。其它locaiont中没有root指令,像 location /images块不会匹配任何请求,需要在每个请求中重复配置root指令来解决这个问题。因此我们需要把root指令放在server块,这样各个 location就会继承父server块定义的$document_root,如果某个location需要定义一个不同 的$document_root,则可以在location单独定义一个root指令。

另一个问题就是fastCGI参数SCRIPT_FILENAME 是写死的。

如果修改了root指令的值或者移动文件到别的目录,php-fpm会返回“No input file specified”错误,因为SCRIPT_FILENAME在配置中是写死的并没有随着$doucument_root变化而变化,我们可以修改 SCRIPT_FILENAME配置如下:

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

 

所以我们不能忘记在server块中配置root指令,不然$document_root的值为空,只会传$fastcgi_script_name到php-fpm,这样就会导致“No input file specified”错误。

 

二、请求的文件真的不存在

当nginx收到一个不在的.php文件的请求时,因为nginx只会检查$uri是否是.php结尾,不会对文件是否存在进行判断,.php结尾 的请求nginx会直接发给php-fpm处理。php-fpm处理时找不到文件就会返回“No input file specified”带着“404 Not Found”头。

解决办法

我们在nginx拦截不存在的文件,请求并返回自定义404错误

使用 try_files 捕捉不存在的urls并返回错误。

location ~ .php$ {
 try_files $uri =404;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME ....
 ...................................
 ...................................
}

上面的配置会检查.php文件是否存在,如果不存在,会返回404页面。

archlinux突然没有声音了

看到了下面的这篇文章,和我的电脑的情况一样,有缘啊,但最后发现是自己静音了。。。。。
自己的机子是联想Y410p,之前安装完arch系统一直不能播放声音(桌面环境用的是i3-wm),自己又不懂得设置,今天对电脑进行配置,顺带把声音的问题解决了。
ALSA参照arch官网,wiki传送门
高级 Linux 声音体系(Advanced Linux Sound Architecture,ALSA)是Linux中提供声音设备驱动的内核组件,用来代替原来的开放声音系统(Open Sound System,OSSv3)。除了声音设备驱动,ALSA还包含一个用户空间的函数库,以方便开发者通过高级API使用驱动功能,而不必直接与内核驱动交互。
Arch 默认的内核已经通过一套模块提供了 ALSA,不必特别安装。
udev会在系统启动时自动检测硬件,并加载相应的声音设备驱动模块。这时,你的声卡已经可以工作了,只是所有声道默认都被设置成静音了。
解除各声道的静音
目前版本的 ALSA 安装后,所有声道默认是静音的,必须手动解除。
使用 alsamixer 的 ncurses 界面,配置十分简单:
$ alsamixer
此外,还可以在命令行下使用 amixer:
$ amixer sset Master unmute
在 alsamixer 中,下方标有 MM 的声道是静音的,而标有 00 的通道已经启用。
使用 ← 和 → 方向键,选中 Master 和 PCM 声道。按下 m 键解除静音。使用 ↑ 方向键增加音量,直到增益值为0。该值显示在左上方 Item: 字段后。过高的增益值会导致声音失真。
要想得到完整的 5.1 或 7.1 环绕立体声,还得解除 Front、Surround、Center、LFE (subwoofer) 和 Side 这些声道的静音(上述名称是 Intel HD Audio 声卡使用的声道名,可能因设备不同而有所差异)。注意,仅有这些设置,系统不会自动将立体声源(多数音乐)提升(upmix)成环绕立体声。如果需要这些功能,请阅读#Upmixing/Downmixing。
要启用麦克风,切换至 Capture 选项卡,按下 F4,按下 空格 启用其中一个声道即可。
按下 Esc 键退出 alsamixer。
问题是这样的
使用alsamixer设置之后还是没有声音的,就使用第二种方法,出现error:
amixer: Unable to find simple control ‘Master’,0
表示不能设置,或是找不到声卡设备,我还以为安装完没有声卡驱动。
用命令获取声卡的声卡ID和设备ID
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: PCH [HDA Intel PCH], device 0: ALC282 Analog [ALC282 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: PCH [HDA Intel PCH], device 1: ALC282 Digital [ALC282 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0
声卡信息应该是没有问题的。
在amixer配置音频
scontrols ” show all mixer simple controls
$ amixer scontrols Simple mixer control ‘IEC958’,0Simple mixer control ‘IEC958’,1Simple mixer control ‘IEC958’,2
然而并没有“Master”,这种情况应该是默认声卡不对。
-c,–card N ” select the card
$ amixer -c 1 scontrols Simple mixer control ‘Master’,0Simple mixer control ‘Headphone’,0Simple mixer control ‘Speaker’,0Simple mixer control ‘PCM’,0Simple mixer control ‘Mic’,0Simple mixer control ‘Mic Boost’,0Simple mixer control ‘IEC958’,0Simple mixer control ‘IEC958 Default PCM’,0Simple mixer control ‘Beep’,0Simple mixer control ‘Capture’,0Simple mixer control ‘Auto-Mute Mode’,0Simple mixer control ‘Internal Mic Boost’,0
问题就出现在默认声卡不对,解决问题的办法就是修改默认声卡。
在刚才 aplay -l 里面选择声卡1,设备ID为0的声卡
把下列配置添加到系统级别的 /etc/asound.conf 或用户级别的 ~/.asoundrc 文件。如果文件不存在,可以手动创建。其中的各个ID,请根据实际情况调整:
defaults.pcm.card 1 defaults.pcm.device 0 defaults.ctl.card 1
pcm选项决定用来播放音频的设备,而ctl选项决定那个声卡能够由控制工具(如 alsamixer)使用。
上述配置在重启音频程序(如 mplayer)后立即生效。
题外话:
在i3-wm还要自己配声音,我也是醉了,强大如gnome的都给配置好了。

CI框架下使用缓存

$this->load->driver(‘cache’);

$this->cache->memcached->is_supported();
或着
$this->cache->redis->is_supported();
问题:
要使用redis里独有的方法如 lpush 和 rpop 实现队列,那么
$this->cache->redis->lpush(‘mylist’, ‘name’);
或着
$this->cache->reids->rpop(‘mylist’);
会报错。
解决方法,可以在Cache.php中增加相应的方法,但对应的文件Cache_redis.php文件里也要增加对应的方法;
1.目录结构
2.Cache.php文件
3.Cache_redis.php文件

nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

前言

nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式。两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。

配置指南

TCP配置方式

TCP通信配置起来很简单,三步即可搞定

第一步,编辑 /etc/nginx/conf.d/你的站点配置文件(如果使用的默认配置文件,修改/etc/nginx/sites-available/default)

将fastcgi_pass参数修改为127.0.0.1:9000,像这样:

第二步,编辑php-fpm配置文件 /etc/php5/fpm/pool.d/www.conf

将listen参数修改为127.0.0.1:9000,像这样:

第三步,重启php-fpm,重启nginx

unix socket配置方式

unix socket其实严格意义上应该叫unix domain socket,它是*nix系统进程间通信(IPC)的一种被广泛采用方式,以文件(一般是.sock)作为socket的唯一标识(描述符),需要通信的两个进程引用同一个socket描述符文件就可以建立通道进行通信了。

配置需要五步

第一步,决定你的socket描述符文件的存储位置。

可以放在系统的任意位置,如果想要更快的通信速度,可以放在/dev/shm下面,这个目录是所谓的tmpfs,是RAM可以直接使用的区域,所以,读写速度都会很快。

决定了文件位置,就要修改文件的权限了,要让nginx和php-fpm对它都有读写的权限,可以这样:

 第二步,修改php-fpm配置文件/etc/php5/fpm/pool.d/www.conf

将listen参数修改为/dev/shm/fpm-cgi.sock,像这样:

将listen.backlog参数改为-1,内存积压无限大,默认是128,并发高了之后就会报错

第三步,修改nginx站点配置文件

将fastcgi_pass参数修改为unix:/dev/shm/fpm-cgi.sock,像这样:

第四步,修改/etc/sysctl.conf 文件,提高内核级别的并发连接数(这个系统级的配置文件我也不是特别熟悉,参考的是这篇博客:《Php-fpm TcpSocket vs UnixSocket》)

第五步, 重启nginx和php-fpm服务(最好先重启php-fpm再重启nginx)

两种通信方式的分析和总结

从原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。

当然还是从原理上来说,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,多少可以保证通信的正确性和完整性。

当然以上主要是半懂不懂的理论分析加主观臆测,具体的差别还是要通过测试数据来说话,以后有空,会进行这方面的测试。从网上别人博客的测试数据,我的理论分析差不多是对的。至于你选择哪种方式,我只能说“鱼和熊掌不可兼得也”,通过高超的运维和配置技巧,在性能和稳定性上做一个平衡吧。

 

说说我的选择

其实,如果nginx做要做负载均衡的话,根本也不要考虑unix socket的方式了,只能采用TCP的方式。现在我的小站没有那么高的并发量,所以就用unix socket了,以后如果有了高并发业务,再进行一些参数调整即可应付,如果真要是无法支撑,那只能做负载均衡了,到时候自然会选择TCP方式。