分类目录归档:随笔

我写下这篇随笔,并刻印在了心上。
I wrote down this essay and put it in my mind.

Linux 使用grep 查找文件bom头

呵呵,做PHP开发的,是不是经常会用utf-8编码呢?用了utf-8编码,是不是经常有各种奇怪的错误呢?是不是总是再说,utf-8的坏话呢。

其实这不是utf-8的错,是你用的记事本的问题吧,换个编辑器就好了,另外,觉得,尽可能不要在记事本里面编辑utf-8的文件了。

出问题的是记事本在文件加了bom头标记,想知道上面是bom头就自己百度好了吧。

下面说下,这么找到有bom头的文件,Linux系统下的,执行下面命令

grep -r -I -l $'^\xEF\xBB\xBF' ./

执行完后,会列出当前文件夹里面包含bom头的文件,用编辑器去掉就好了,我之前是用 zend studio,不过现在不用了,用nodepad++

Centos 7 新特性整理

Centos 7 发布了,发现,用起来很多都不相关了,呵呵,是我不相关了还是Centos 7 变动有点大了呢。

也许是因为好久没有弄Centos了吧,呵呵。不管太多,他变总有变的道理,就按照他的来就可以了。

1、防火墙变了

默认使用了 firewall 防火墙

下面常用命:

systemctl stop firewalld   #关闭
systemctl start firewall   #启动
systemctl restart firewall   #重启(猜的)

也可以用原来的server 命令,不过,好像centos 现在比较推荐使用这个命令。

2、mysql 数据库换了

mysql在centos 7啊安装源里面已经没有了,现在默认使用 mariadb。功能和使用习惯、配置文件等还是和 mysql 的差不多。就是名字变长了,唉,英文不行背半年啊!

yum install mariadb-server  #安装 mariadb 数据库
systemctl start mariadb     #启动
yum install mariadb         #安装 mariadb 客户端 记得这个是客户端哦,不是服务端

Ubuntu 14.04 server 设置静态IP

 

今天记一下Ubuntu14.04 server版 修改静态IP的方法。呵呵,只因为最近在Centos 7 和Ubuntu14.04上切换来切换去的,两个修改IP的格式有点不一样,头有点大,一时就修改错了,先记下来,等过几天又切换到Centos7的时候,再把Centos的修改方法给记下来吧。

1、找到相应的文件(/etc/network/interfaces )

sudo vi /etc/network/interfaces
auto eth0  # 这个要用 ifconfig 确认下是不是这个名字
iface eth0 inet static
address 192.168.0.220
gateway 192.168.0.1	 #这个地址你要确认下网关地址,在路由器那边
netmask 255.255.255.0    #这个基本上都是这个

2、修改DNS,原本是动态获取dns,但是修改成静态ip后,也不会去获取dns了,所以不改的话,上不了网。

这里,14.04 server 修改dns不能使用 /etc/resolv.conf 文件,这个文件修改是一次性的,重启后就没有了,所以想要永久修改,想要修改 /etc/resolvconf/resolv.conf.d/base 这个文件,呵呵,这个是和之前版本不一样的地方。

sudo vi /etc/resolvconf/resolv.conf.d/base

加入如下内容(google提供的dns),主要是为了让电信和联通的用户容易修改吧,呵呵,不要误会,如果你有电信或联通的dns ,也可以用电信或联通的。

nameserver 8.8.8.8
nameserver 8.8.4.4

3、重启networking服务,不过在重启之前,可以先关闭网卡

sudo ifdown eth0 # 关闭网卡,不知道为什么有时候重启了IP没有改过来,所以关闭下网卡
sudo service networking restart
sudo ifup eth0  #打开网卡

好了,就写到这里,修改dns的就完了,下次接下去写Centos的,现在没有开Centos的机器。呵呵!

常见负载均衡方法 Nignx代理 LVS DNS轮询

最近一直在研究系统,主要原因是,哪怕效率再高的语言,在并发面前,其所谓的效率都只是浮云!

所以,在这样的情况下,研究负载均衡(或者说流量分发)就变得很有必要。下面收集一些负载均衡的常用实现方法。用于日后参考。

1、NDS轮询

RR-DNS(Round-Robin Domain Name System) 轮流排程的方式是:在DNS服务器中,可以为多个不同的IP地址配置同一个名称,当客户端查询这个名字时将在解析这个名称时得到其中的一个地址。因此,对于同一个名字,不同的客户端会得到不同的地址,他们也就连结不同地址上的Web服务器,从而达到负载平衡的目的。例如 : 当客户端连结 www.muti-ip.com.tw这名称时,DNS 有能力依序将名称解析到 202.1.1.1 、 202.1.1.2 、202.1.1.3和 202.1.1.4等不同的网络地址,而这些是提供相同服务的主机,让客户端不自觉有不同。

优点:

成本低,几乎为不需要成本,现在一般的域名提供商,都提供该功能,只需要设置下,就可以使用。

缺点:

为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。

单点故障,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。

要给每台服务器分配一个internet上的IP地址,这势必会占用过多的IP地址。

 

2、LVS

LVS是一个开源软件,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。

3、Nginx

Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多此次应用Nginx实现多台web服务器的简单负载均衡,直观了解负载均衡的工作原理。

Ubuntu 14.04 server 163 源 (mirrors)

这是Ubuntu 14.04 163 的更新源 ,更新速度要比ubuntu 中国区服务器好很多,呵呵,提供上来,方便大家使用。

deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

163对应镜像下载 http://mirrors.163.com/ubuntu-releases/14.04/

事实上,人家如果要安装ubuntu 也可以选择在163这里下载,下载速度也比ubuntu中国区服务器好。另外,如果大家选择在线安装,那一定是要用这个源的了,呵呵。因为在线安装对网速要求比较高,如果网速不好,成功的机会很小,或者,装到你不想在装了!

解决Linux(ubuntu 14.04 server)中文环境语言错误

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "zh_CN:zh",
        LC_ALL = (unset),
        LC_TIME = "zh_CN",
        LC_MONETARY = "zh_CN",
        LC_ADDRESS = "zh_CN",
        LC_TELEPHONE = "zh_CN",
        LC_NAME = "zh_CN",
        LC_MEASUREMENT = "zh_CN",
        LC_IDENTIFICATION = "zh_CN",
        LC_NUMERIC = "zh_CN",
        LC_PAPER = "zh_CN",
        LANG = "zh_CN.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
Selecting previously unselected package language-pack-zh-hans-base.

安装Ubuntu时,选择的是中文,在下载软件的时候,因为网速不好,取消了。安装完之后,经常出现上面的错误,呵呵,导致有时候apt-get 安装软件时有些软件不能成功,也不知道为什么,反正知道了问题,就把语言包装上就好了。ubuntu 安装语言包还算容易,下面是ubuntu14.04 server版的安装方法。

sudo apt-get install language-pack-zh-hans language-pack-zh-hans-base

安装好之后,中文也正常显示了。

有关Linux 中文语言的一些知识,来自网络,没有验证,大家自己看看吧。

查看当前安装有那些语言:

locale -a

当前语言相关配置:

root@ubuntu:/etc/sphinxsearch# locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC=zh_CN
LC_TIME=zh_CN
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY=zh_CN
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER=zh_CN
LC_NAME=zh_CN
LC_ADDRESS=zh_CN
LC_TELEPHONE=zh_CN
LC_MEASUREMENT=zh_CN
LC_IDENTIFICATION=zh_CN
LC_ALL=

locale 把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为:语言[_地域[.字符集]]。完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]。zh_CN.GB2312=中文_中华人民共和国.国标2312字符集。

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:
LC_ALL>LC_*>LANG
可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。

2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。

3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值 zh_CN.UTF-8 。

4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:

LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的:
1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。
2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而 LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。

C.LANG和LANGUAGE的区别:
LANG – Specifies the default locale for all unset locale variables
LANGUAGE – Most programs use this for the language of its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值

Cordova 调试利器 Ripple

Ripple是Chrome(谷歌浏览器)的一个插件,主要功能是用来调试Cordova(Photogap)软件。可以有效的提高Cordova的开发效率,防止每次都将软件Run 到android虚拟机的麻烦,并且,在这里,调试可以使用 javascrpt debug。

Ripple是一个开源的Apache项目(http://incubator.apache.org/projects/ripple.html)。它允许浏览器作为移动设备的模拟器。目前已经支持Blackberry和Cordova(PhoneGap)。

一旦安装了Ripple,Chrome浏览器将得到一个新的工具图标:

Linux Iptalbes 功能 命令行常用记录

Iptables 是linux 系统常见的防火墙,弄服务器的化,经常会用到。因为基本只能用命令操作,且命令比较长,经常记不住,比较蛋痛,就顺便记在这里了,呵呵。免得老是要去百度找。

常用命令列表:

命令 -A, –append
范例 iptables -A INPUT …
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。

命令 -I, –insert
范例 iptables -I INPUT 1 –dport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。

命令 -L, –list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。 可以使用 –line-number 参数列出行好 iptables -L –line-number

命令 -D, –delete
范例 iptables -D INPUT –dport 80 -j DROP
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

命令 -R, –replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。

命令 -F, –flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则。

命令 -Z, –zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令 -N, –new-chain
范例 iptables -N allowed
说明 定义新的规则链。

命令 -X, –delete-chain
范例 iptables -X allowed
说明 删除某个规则链。

命令 -P, –policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

命令 -E, –rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。

常用封包比对参数:
参数 –line-number
范例 iptables -L –line-number
说明 显示出每条命令的行号,便于使用行号操作
参数 -p, –protocol
范例 iptables -A INPUT -p tcp
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含
udp、icmp …等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数 -s, –src, –source
范例 iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时
可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。
参数 -d, –dst, –destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数 -i, –in-interface
范例 iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也
以使用 ! 运算子进行反向比对,例如:-i ! eth0。
参数 -o, –out-interface
范例 iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数 –sport, –source-port
范例 iptables -A INPUT -p tcp –sport 22
说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:–sport 22:80,表示从 22 到 80 埠之间都算是符合
件,如果要比对不连续的多个埠,则必须使用 –multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数 –dport, –destination-port
范例 iptables -A INPUT -p tcp –dport 22
说明 用来比对封包的目的地埠号,设定方式同上。
参数 –tcp-flags
范例 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设
,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)
PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子
行反向比对。
参数 –syn
范例 iptables -p tcp –syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp –tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !
运算子,可用来比对非要求联机封包。
参数 -m multiport –source-port
范例 iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
参数 -m multiport –destination-port
范例 iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数 -m multiport –port
范例 iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80
目的地埠号为 110,这种封包并不算符合条件。
参数 –icmp-type
范例 iptables -A INPUT -p icmp –icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp –help 来查看有哪些代码可
用。
参数 -m limit –limit
范例 iptables -A INPUT -m limit –limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均
次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封
数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
参数 –limit-burst
范例 iptables -A INPUT -m limit –limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封
将被直接丢弃。使用效果同上。
参数 -m mac –mac-source
范例 iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网
后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到
个网络接口去。
参数 –mark
范例 iptables -t mangle -A INPUT -m mark –mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最
不可以超过 4294967296。
参数 -m owner –uid-owner
范例 iptables -A OUTPUT -m owner –uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出
,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
参数 -m owner –gid-owner
范例 iptables -A OUTPUT -m owner –gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数 -m owner –pid-owner
范例 iptables -A OUTPUT -m owner –pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数 -m owner –sid-owner
范例 iptables -A OUTPUT -m owner –sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
参数 -m state –state
范例 iptables -A INPUT -m state –state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。