Monthly Archives: 3月 2017

3月 31st, 2017

php网站搬家的时候,有可能出现以下错误

PHP Fatal error:  Incompatible file format:  The encoded file has format major ID 1, whereas the Loader expects 5 in 路径\includes\db.inc.php on line 0

我们都知道从PHP5.3开始如果要支持zendguard加密的PHP代码,必须安装zend guard loader,老的zend optimizer将不被支持。

 

也就是说

PHP5.2之前的Zend加密程序用Zend Optimizer解析。

PHP5.3开始的Zend加密程序用Zend Guard Loader解析。

 

综上,造成该问题的原因是原主机是用php5.2(或者更低版本)Zend Optimizer加密,而现在服务器php版本是5.3或者更高,用Zend Guard Loader加密。

 

解决方法:切换到php5.2。现在主机商一般都支持php版本切换。

 

3月 31st, 2017

当我们使用ps -ef查看程序时,发现defunct,这就是所谓的僵尸进程,它是一个已死亡的程序,但在程序表(processs table)中仍占了一个位置(slot)。由于程序表的容量是有限的,所以defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。

每个Linux的进程在进程表里都有一个进入点(entry),内核程序运行该行程时所使用的一切信息都储存在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关资料。而当使用fork()建立一个新的进程后,内核就会在进程表中给这个新行程分配一个进入点,然后将相关信息储存在该进入点所对应的进程表内,而这些信息中有一项是父程序的识别码。当这个进程结束后,它会运行exit()的系统呼叫,此时原来进程表中的数据会被该程序的退出码(exit code)运行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父程序为止。

说了这么多,defunct的出现时间是在子程序终止后,但是父程序尚未读取这些数据之前。简单地说,子进程是由父进程产生的,但如果程序消失并且父程序未得到相关数据,就会出现defunt。

3月 30th, 2017

Global.asa 文件是一个可选的文件,它可包含可被 ASP 应用程序中每个页面访问的对象、变量以及方法的声明。

Global.asa 文件

Global.asa 文件是一个可选的文件,它可包含可被 ASP 应用程序中每个页面访问的对象、变量以及方法的声明。所有合法的浏览器脚本都能在 Global.asa 中使用。

Global.asa 文件可包含下列内容:

  • Application 事件
  • Session 事件
  • <object> 声明
  • TypeLibrary 声明
  • #include 指令

注释:Global.asa 文件须存放于 ASP 应用程序的根目录中,且每个应用程序只能有一个 Global.asa 文件。

Global.asa 中的事件

在 Global.asa 中,我们可以告知 application 和 session 对象在启动和结束时做什么事情。完成这项任务的代码被放置在事件操作器中。Global.asa 文件能包含四种类型的事件:

Application_OnStart – 此事件会在首位用户从 ASP 应用程序调用第一个页面时发生。此事件会在 web 服务器重起或者 Global.asa 文件被编辑之后发生。”Session_OnStart” 事件会在此事件发生之后立即发生。

Session_OnStart – 此事件会在每当新用户请求他或她的在 ASP 应用程序中的首个页面时发生。

Session_OnEnd – 此事件会在每当用户结束 session 时发生。在规定的时间(默认的事件为 20 分钟)内如果没有页面被请求,session 就会结束。

Application_OnEnd – 此事件会在最后一位用户结束其 session 之后发生。典型的情况是,此事件会在 Web 服务器停止时发生。此子程序用于在应用程序停止后清除设置,比如删除记录或者向文本文件写信息。

Global.asa 文件可能类似这样:

<script language="vbscript" runat="server">

sub Application_OnStart
  'some code
end sub

sub Application_OnEnd
  'some code
end sub

sub Session_OnStart
  'some code
end sub

sub Session_OnEnd
  'some code
end sub

</script>

注释:由于无法使用 ASP 的脚本分隔符 (<% 和 %>) 在 Global.asa 文件中插入脚本,我们需使用 HTML 的 <script> 元素。

<object> 声明

可通过使用 <object> 标签在 Global.asa 文件中创建带有 session 或者 application 作用域的对象。

注释:<object> 标签应位于 <script> 标签之外。

语法:

<object runat="server" scope="scope" id="id"
{progid="progID"|classid="classID"}>
....
</object>
参数 描述
scope 设置对象的作用域(作用范围)(Session 或者 Application)。
id 为对象指定一个唯一的 id。
ProgID 与 ClassID 关联的 id。ProgID 的格式是:[Vendor.]Component[.Version]。

ProgID 或 ClassID 必需被指定。

ClassID 为 COM 类对象指定唯一的 id。

ProgID 或 ClassID 必需被指定。

实例

第一个实例创建了一个名为 “MyAd” 且使用 ProgID 参数的 session 作用域对象:

<object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
</object>

第二个实例创建了名为 “MyConnection” 且使用 ClassID 参数的

<object runat="server" scope="application" id="MyConnection"
classid="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
</object>

在此 Global.asa 文件中声明的这些对象可被应用程序中的任何脚本使用。

GLOBAL.ASA:

<object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
</object>

您可以从 ASP 应用程序中的任意页面引用此 “MyAd” 对象:

某个 .ASP 文件:

<%=MyAd.GetAdvertisement("/banners/adrot.txt")%>

TypeLibrary 声明

TypeLibrary (类型库)是一个容器,其中装有对应于 COM 对象的 DLL 文件。通过在 Global.asa 中包含对 TypeLibrary 的调用,可以访问 COM 对象的常量,同时 ASP 代码也能更好地报告错误。假如您的站点的应用程序依赖于已在类型库中声明过数据类型的 COM 对象,您可以在 Global.asa 中对类型库进行声明。

语法:

<!--METADATA TYPE="TypeLib"
file="filename"
uuid="typelibraryuuid"
version="versionnumber"
lcid="localeid"
-->
参数 描述
file 规定指向类型库的绝对路径。参数 file 或者 uuid,两者缺一不可。
uuid 规定了针对类型库的唯一的标识符。参数 file 或者 uuid,两者缺一不可。
version 可选。用于选择版本。假如没有找到指定的版本,将使用最接近的版本。
lcid 可选。用于类型库的地区标识符。

错误值

服务器会返回以下的错误消息之一:

错误 代码 描述
ASP 0222 Invalid type library specification
ASP 0223 Type library not found
ASP 0224 Type library cannot be loaded
ASP 0225 Type library cannot be wrapped

注释:METADATA 标签可位于 Global.asa 文件中的任何位置(在 <script> 标签的内外均可)。不过,我们还是推荐将 METADATA 标签放置于 Global.asa 文件的顶部。

限定

关于可以在 Global.asa 文件中引用的内容的限定:

你无法显示 Global.asa 文件中的文本。此文件无法显示信息。

你只能在 Application_OnStart 和 Application_OnEnd 子例程中使用 Server 和 Application 对象。在 Session_OnEnd 子例程中,你可以使用 Server、Application 和 Session 对象。在 Session_OnStart 子例程中,你可使用任何内建的对象。

如何使用子例程

Global.asa 常用于对变量进行初始化。

下面的例子展示如何检测访问者首次到达站点的确切时间。时间存储在名为 “started” 的 Session 对象中,并且 “started” 变量的值可被应用程序中的任何 ASP 页面访问:

<script language="vbscript" runat="server">
sub Session_OnStart
Session("started")=now()
end sub
</script>

Global.asa 也可用于控制页面访问。

下面的例子展示如何把每位新的访问者重定向到另一个页面,在这个例子中会定向到 “newpage.asp” 这个页面:

<script language="vbscript" runat="server">
sub Session_OnStart
Response.Redirect("newpage.asp")
end sub
</script>

我们还可以在 Global.asa 中包含函数。

在下面的例子中,当 Web 服务器启动时,Application_OnStart 子例程也会启动。随后,Application_OnStart 子例程会调用另一个名为 “getcustomers” 的子例程。”getcustomers” 子例程会打开一个数据库,然后从 “customers” 表中取回一个记录集。此记录集会赋值给一个数组,在不查询数据库的情况下,任何 ASP 页面都能够访问这个数组:

<script language="vbscript" runat="server">

sub Application_OnStart
getcustomers
end sub

sub getcustomers 
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open "c:/webdata/northwind.mdb"
set rs=conn.execute("select name from customers")
Application("customers")=rs.GetRows
rs.Close
conn.Close
end sub

</script>

Global.asa 实例

在这个例子中,我们要创建一个可计算当前访客的 Global.asa 文件。

Application_OnStart 设置当服务器启动时,Application 变量 “visitors” 的值为 0。

每当有新用户访问时,Session_OnStart 子例程就会给变量 “visitors” 加 1。

每当 Session_OnEnd 子例程被触发时,此子例程就会从变量 “visitors” 减 1。

Global.asa 文件:

<script language="vbscript" runat="server">

Sub Application_OnStart
Application("visitors")=0
End Sub

Sub Session_OnStart
Application.Lock
Application("visitors")=Application("visitors")+1
Application.UnLock
End Sub

Sub Session_OnEnd
Application.Lock
Application("visitors")=Application("visitors")-1
Application.UnLock
End Sub

</script>

此 ASP 文件会显示当前用户的数目:

<html>
<head>
</head>
<body>
<p>There are <%response.write(Application("visitors"))%> online now!</p>
</body>
</html>
3月 30th, 2017

免费CDN的出现,很多站长都开始使用的CDN来给自己的网站加速,相信站长们肯定会对CDN加速对网站SEO是否造成不可预知的影响提出质疑.本人认为,如果不存在设置上的错误,影响基本是为0的.毕竟在搜索引擎提倡以用户体验为优化原则的前提下,加快网站加载速度,无疑也是在提升用户体验.

点击查看原图

 

根据百度官方SEO指南,“Baiduspider对站点的抓取方式和普通用户访问一样,只要普通用户能访问到的内容,我们就能抓取到。不管是用什么技术,只要能保证用户能流畅的访问网站,对搜索引擎就没有影响”;但是在CDN不稳定或者因为攻击导致经常更换IP地址,因为dns缓存或者爬虫本身的缓存问题,导致爬虫的访问出错,会对SEO有一定的影响,但是如果保证前面的两点对SEO实际是有促进作用的,主要体现在以下3个方面:

1) 使用CDN之后,访问速度更快,对爬虫更友好,相对更容易被收录

2) 使用CDN之后,对于部分空间在国外并被墙的朋友,就能够让用户顺利在国内打开。

3) 使用CDN之后,由于加载速快提升了用户体验,本身的访问人数增加了。同时alexa排名会相应增长。

 

下面为设置误区

一.为搜索引擎指定独立的IP
不知道各位站长在设置自已的CDN加速时,是否会对不同的线路设置为不同的加速节点,例如我们通过一些站长工具测试,来找到访问网站最慢的线路,这样一来则可以针对不同的访问线路给出我们的最快节点,然而要注意的是,不要为搜索引擎指定独立的IP。如下图:

点击查看原图

从理论上讲,让蜘蛛到自已的源站IP上,这样的话能够保证蜘蛛抓到最真实的内容,然而当您设置了CDN加速后,有可能蜘蛛在源站和节点上抓取的内容不同,例如某著名CDN商家说静态文本1~2天后才会更新,图片1周后才会更新,从而作出站点作弊的判断。

二.CNAME解析地址后面的点
无论您使用何种CDN,不管是收费的,还是免费的,不论是全站加速还是只图片加速,我们都应该要注意,提供CDN服务的商家在给我们的别名后面,一定要加一个”.”,比如给您的别名是www.域名.com,在输入到自已的CNAME解析地址时,应该是www.域名.com.,后面要多一个点。其实我们的NS记录后面也是如此。

 

三.站点安全性
使用CDN后,由于使用的人数量较多,很有可能在某个节点上绑定了上万个站点,这样就会明显增加站点的旁注风险。尽管大部分CDN商家都会号称自已的产品是如何如何的安全,但是小心使得万年船,不管你在使用任何一种CDN加速服务最好把DDOS和CC防御开启为高。

四.开启SEO优化
不管现在那家CDN加速服务商都应该拥有搜索引擎优化,蜘蛛回源等功能,不过在搜索引擎优化这块本人还是推荐你使用百度云加速,百度云加速支持“百度蜘蛛DNS同步功能”,当云加速集群因为硬件故障或者机房网络故障等原因下线时,10s内会自动通过智能DNS将故障集群自动移除,并与百度蜘蛛自动同步DNS信息,避免百度蜘蛛因DNS缓存问题仍然访问故障节点的IP,保证搜索引擎权重的稳定性。

最后小结:

CDN加速对SEO的影响是很多朋友都关心的问题,从实验看,不管是从抓取速度和频率来说都没有什么问题,甚至是有益的。存在的问题如填写表单IP不正确等,也就不一一列举了,我相信CDN服务商的工程师们会给出完美解决的办法。

 

文章来自网络博客,原文链接:http://xiangta.cc/hulian/102.html

 

3月 30th, 2017
        2checkout无疑是国际在线支付平台的巨头之一,相当于国内的网银在线、首信支付、IPAY等。Paypal则相当于国内的支付宝,快钱等。区别是前者直接和银行挂接,无须注册用户名;而后者推荐或者限制一定要注册他们的用户才能使用在线支付功能。

2checkout的手续费和国外其他在线支付公司相比算高的了,每笔5.5%的手续费和0.45美元的交易费。这个交易费的概念是我自己取的,也许不叫这个名字,在国内现在是没有的。比如一笔10美元的交易,他先扣你0.45美元,再扣总交易的5.5%,两部分加在一起收手续费。包括Paypal和几乎所有的国外在线支付公司都是这样。那么为什么还要收这笔费用呢?我想根本原因还是出在国外的人力成本比较高,同时还存在着较高的信用卡欺诈情况,每笔交易都需要人工或机器审核,确保不是欺诈(fraud)之后,才让商户给他提供服务,比如邮寄商品,提供下载,开通域名空间等。

2checkout的网站是http://www.2checkout.com,申请需要一定的英文基础。网站上有申请商户的连接,需要缴纳一次性的49美金开户费,但2checkout没有月费,没有网关租用费等杂七杂八的费用,对小型公司长期使用来说,还是不错的选择。申请有一个申请向导,通过信用卡或Paypal付清49美金之后,还需要传真给他们相关的合同文件,文件上要亲笔签名,要稍微麻烦点,需要有一个传真机,然后买一个电话卡,打他们美国的传真要便宜点。或者也可以签字后把合同扫描成图片发邮件给他们。申请通过后,就可以在他们的后台中设置密码,测试接口了。整个过程大约需要2-3天。

一般的国外购物平台,包括国内的shopex都整合了2checkout,只要在他们后台输入商户编号和密码等就可以了,无需复杂的编程。2checkout还提供测试环境(test mode),任意输入信用卡就可以模拟真实的客户购物情况。

3月 30th, 2017

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

使用语法:
chkconfig [–add][–del][–list][系统服务] 或 chkconfig [–level <等级代号>][系统服务][on/off/reset]

chkconfig在没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回true,否则返回false。如果在服务名后面指定了on,off或者reset,那么chkconfi 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。

参数用法:
–add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
–del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。
–level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕。
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。

chkconfig –list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
chkconfig –add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
chkconfig –del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。
chkconfig [–level levels] name:设置某一服务在指定的运行级是被启动,停止还是重置。

运行级文件:
每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 – 代替运行级。第二行对服务进行描述,可以用\ 跨行注释。
例如,random.init包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
# higher quality random number generation.

使用范例:
chkconfig –list        #列出所有的系统服务
chkconfig –add httpd        #增加httpd服务
chkconfig –del httpd        #删除httpd服务
chkconfig –level httpd 2345 on        #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态
chkconfig –list        #列出系统所有的服务启动情况
chkconfig –list mysqld        #列出mysqld服务设置情况
chkconfig –level 35 mysqld on        #设定mysqld在等级3和5为开机运行服务,–level 35表示操作只在等级3和5执行,on表示启动,off表示关闭
chkconfig mysqld on        #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级

如何增加一个服务:
1.服务脚本必须存放在/etc/ini.d/目录下;
2.chkconfig –add servicename
在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
3.chkconfig –level 35 mysqld on
修改服务的默认启动等级。

3月 29th, 2017

最近系统漏洞扫描,扫出来很多MySQL的漏洞,没有什么好的办法,先升级到最新版本。在梳理MySQL数据库信息时发现有一套zabbix用的MySQL版本是5.1.71的,现在的最新版本是5.7.17,版本跨越的太大了,不知道直接升级是否可行。库的数据量大概15G,于是就想先备份,备份完后用mysql_upgrade做升级。如果实在不行就再新创建一套库把数据导进去。

下面是在虚拟机上测试的升级步骤,中间也遇到了一些问题,不过好在最后还是升级成功了,说明这条路还是可行了。

操作系统版本RHEL 6.7 旧的MySQL版本5.1.71,新的MySQL版本5.7.17。

1、查看旧的MySQL版本,并创建测试数据库和测试表

mysql> select version();
+——————+
| version()        |
+——————+
| 5.1.71-community |
+——————+
mysql> create database zx;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+——————–+
| Database          |
+——————–+
| information_schema |
| mysql              |
| test              |
| zx                |
+——————–+
4 rows in set (0.00 sec)

mysql> use zx;
Database changed
mysql> create table test_upgrade (id int);
Query OK, 0 rows affected (0.07 sec)
……
mysql> select count(*) from test_upgrade;
+———-+
| count(*) |
+———-+
| 33554432 |
+———-+
1 row in set (0.00 sec)

现在test_upgrade表里有33554432条数据。

2、停止旧MySQL,并备份数据

[root@rhel6 mysql]# service mysql stop
Shutting down MySQL.. SUCCESS!
#这里直接用cp备份数据
[root@rhel6 lib]# cp -R mysql mysql_bak
[root@rhel6 lib]# du -sk mysql*
250880  mysql
250880  mysql_bak

3、安装新Msql软件,这里下载的是编译好的解压就可以使用

[root@rhel6 ~]# tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
#解压完后移动到/opt目录下
[root@rhel6 ~]# mv mysql-5.7.17-linux-glibc2.5-x86_64 mysql-5.7.17
[root@rhel6 ~]# mv mysql-5.7.17 /opt
[root@rhel6 ~]# cd /opt
[root@rhel6 opt]# chown -R mysql:mysql mysql-5.7.17/
[root@rhel6 opt]# ll
total 4
drwxr-xr-x. 9 mysql mysql 4096 Mar 22 21:07 mysql-5.7.17

4、修改my.cnf

主要修改basedir参数:

[root@rhel6 opt]# vi /etc/my.cnf
basedir=/opt/mysql-5.7.17

5、启动新MySQL

[root@rhel6 mysql-5.7.17]# ./bin/mysqld_safe &

1)启动报错1:

2017-03-22T13:12:39.131998Z 0 [ERROR] InnoDB: The Auto-extending innodb_system data file ‘./ibdata1’ is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!2017-03-22T13:12:39.132028Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2017-03-22T13:12:39.733953Z 0 [ERROR] Plugin ‘InnoDB’ init function returned error.
2017-03-22T13:12:39.733986Z 0 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
2017-03-22T13:12:39.733994Z 0 [ERROR] Failed to initialize plugins.
2017-03-22T13:12:39.734000Z 0 [ERROR] Aborting

解决方法在my.cnf中的[mysqld]部分添加如下参数

innodb_data_file_path = ibdata1:10M:autoextend

再次启动

2)启动报错2:

2017-03-22T13:16:03.374717Z 0 [ERROR] unknown option ‘–skip-locking’
2017-03-22T13:16:03.374735Z 0 [ERROR] Aborting

解决方法从my.cnf中注释掉相关参数skip-locking

再次启动

3)启动报错3:

2017-03-22T13:18:20.278752Z 0 [ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade.
2017-03-22T13:18:20.278954Z 0 [ERROR] Aborting

5.7无法读取5.1的mysql.user表,解决方法使用–skip-grant-tables参数跳过授权验证

再次启动

[root@rhel6 mysql-5.7.17]# ./bin/mysqld_safe –skip-grant-tables&

启动成功

2017-03-22T13:20:23.919677Z 0 [Note] ./bin/mysqld: ready for connections.
Version: ‘5.7.17’  socket: ‘/var/lib/mysql/mysql.sock’  port: 3306  MySQL Community Server (GPL)

6、执行升级

[root@rhel6 mysql-5.7.17]# ./bin/mysql_upgrade -uroot
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                OK
mysql.db                                          OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                        OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                OK
mysql.help_relation                                OK
mysql.help_topic                                  OK
mysql.host                                        OK
mysql.innodb_index_stats                          OK
mysql.innodb_table_stats                          OK
mysql.ndb_binlog_index                            OK
mysql.plugin                                      OK
mysql.proc                                        OK
mysql.procs_priv                                  OK
mysql.proxies_priv                                OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                        OK
mysql.slave_worker_info                            OK
mysql.slow_log                                    OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                              OK
mysql.time_zone_transition                        OK
mysql.time_zone_transition_type                    OK
mysql.user                                        OK
Upgrading the sys schema.
Checking databases.
sys.sys_config                                    OK
zx.test_upgrade                                    OK
Upgrade process completed successfully.
Checking if update is needed.

7、重启MySQL,并验证

[root@rhel6 mysql-5.7.17]# ./bin/mysqladmin -uroot -p shutdown
[root@rhel6 mysql-5.7.17]# ./bin/mysqld_safe &
mysql> select version();
+———–+
| version() |
+———–+
| 5.7.17    |
+———–+
1 row in set (0.00 sec)

mysql> show databases;
+——————–+
| Database          |
+——————–+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test              |
| zx                |
+——————–+
6 rows in set (0.00 sec)

mysql> select count(*) from zx.test_upgrade;
+———-+
| count(*) |
+———-+
| 33554432 |
+———-+
1 row in set (0.01 sec)

验证通过后,删除旧版本的MySQL软件。

TAGS:
3月 29th, 2017

许多人对于 Google 都有个疑问,就是他们弄了这么多传讯软件到底是要有什么用意。还好,该公司总算想到了要简化并让人分出这些产品之间的区别,第一步,就是从今天起确认将会让陪伴使用者 12 年的 Google Talk 走入历史,在未来数周内引导使用者转用 Hangouts,并且预计在 6 月 26 日正式停止功能。

提到 Hangouts,这个跨了许多平台包括 PC、Android 与 iOS 的传讯服务,先前才获得了在 Android 上传送与管理 SMS 的功能,但这次 Google 则是又宣布将把此功能从 app 中拿掉,并引导使用者改用他们后续为 Android 推出的短信 app。

将会于 5 月 22 日起正式关闭的 Hangouts 短信功能,Google 表示将不会因为转换 app 而让短信消失,不过这一下子加了功能又一下子拿掉,说真的应该会让使用者感到有点混乱。而这样的状况还不止步于此,因为官方又补充到,使用 Google Voice 或 Project Fi 来收发 SMS 的用户,其实将可继续沿用 Hangouts 的… 只能说,看在他们有开始在用心简化服务,就还是给予正面鼓励吧。

最后,Google 也针对 Gmail 的服务做出简化,将荒废的 Google+ 在其中的几项功能如简历资料与好友圈,都会在近期内被移除,但也同时为 Gmail 迎来许多 Gmail Labs 的延伸功能。

3月 29th, 2017

大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题)。Linux默认确实有内置的安全模型。你需要打开它并且对其进行定制,这样才能得到更安全的系统。Linux更难管理,不过相应也更灵活,有更多的配置选项。

对于系统管理员,让产品的系统更安全,免于骇客和黑客的攻击,一直是一项挑战。这是我们关于“如何让Linux系统更安全” 或者 “加固Linux系统“之类话题的第一篇文章。本文将介绍 25个有用的技巧和窍门 ,帮助你让Linux系统更加安全。希望下面的这些技巧和窍门可以帮助你加强你的系统的安全。

1. 物理系统的安全性

配置BIOS,禁用从CD/DVD、外部设备、软驱启动。下一步,启用BIOS密码,同时启用GRUB的密码保护,这样可以限制对系统的物理访问。

 

2. 磁盘分区

使用不同的分区很重要,对于可能得灾难,这可以保证更高的数据安全性。通过划分不同的分区,数据可以进行分组并隔离开来。当意外发生时,只有出问题的分区的数据才会被破坏,其他分区的数据可以保留下来。你最好有以下的分区,并且第三方程序最好安装在单独的文件系统/opt下。

1 /
2 /boot
3 /usr
4 /var
5 /home
6 /tmp
7 /opt

3. 最小包安装,最少漏洞

你真的需要安装所有的服务么?建议不要安装无用的包,避免由这些包带来的漏洞。这将最小化风险,因为一个服务的漏洞可能会危害到其他的服务。找到并去除或者停止不用的服务,把系统漏洞减少到最小。使用‘chkconfig‘命令列出运行级别3的运行所有服务。

1 # /sbin/chkconfig --list |grep '3:on'

当你发现一个不需要的服务在运行时,使用下面的命令停止这个服务。

1 # chkconfig serviceName off

使用RPM包管理器,例如YUM或者apt-get 工具来列出所有安装的包,并且利用下的命令来卸载他们。

1 # yum -y remove package-name
1 # sudo apt-get remove package-name

5 chkconfig Command Examples

20 Practical Examples of RPM Commands

20 Linux YUM Commands for Linux Package Management

25 APT-GET and APT-CACHE Commands to Manage Package Management

4. 检查网络监听端口

在网络命令 ‘netstat‘ 的帮助下,你将能够看到所有开启的端口,以及相关的程序。使用我上面提到的 ‘chkconfig‘ 命令关闭系统中不想要的网络服务。

1 # netstat -tulpn

 

5. 使用 SSH(Secure Shell)

Telnet 和 rlogin 协议只能用于纯文本,不能使用加密的格式,这或将导致安全漏洞的产生。SSH 是一种在客户端与服务器端通讯时使用加密技术的安全协议。

除非必要,永远都不要直接登录 root 账户。使用 “sudo” 执行命令。sudo 由 /etc/sudoers 文件制定,同时也可以使用 “visudo” 工具编辑,它将通过 VI 编辑器打开配置文件。

同时,建议将默认的 SSH 22 端口号改为其他更高的端口号。打开主要的 SSH 配置文件并做如下修改,以限制用户访问。

1 # vi /etc/ssh/sshd_config

关闭 root 用户登录

1 PermitRootLogin no

特定用户通过

1 AllowUsers username

使用第二版 SSH 协议

1 Protocol 2

 

6. 保证系统是最新的

得一直保证系统包含了最新版本的补丁、安全修复和可用内核。

1 # yum updates
2 # yum check-update

7. 锁定 Cron任务

Cron有它自己内建的特性,这特性允许定义哪些人能哪些人不能跑任务。这是通过两个文件/etc/cron.allow 和 /etc/cron.deny 控制的。要锁定在用Cron的用户时可以简单的将其名字写到corn.deny里,而要允许用户跑cron时将其名字加到cron.allow即可。如果你要禁止所有用户使用corn,那么可以将“ALL”作为一行加到cron.deny里。

1 # echo ALL >>/etc/cron.deny

 

8. 禁止USB探测

很多情况下我们想去限制用户使用USB,来保障系统安全和数据的泄露。建立一个文件‘/etc/modprobe.d/no-usb‘并且利用下面的命令来禁止探测USB存储。

1 install usb-storage /bin/true

9.打开SELinux

SELinux(安全增强linux)是linux内核提供的一个强制的访问控制安全机制。禁用SELinux意味着系统丢掉了安全机制。要去除SELinux之前仔细考虑下,如果你的系统需要发布到网络,并且要在公网访问,你就要更加注意一下。

SELinux 提供了三个基本的操作模式,他们是:

强制执行:这是默认是模式,用来启用和强制执行SELinux安全措略。

许可模式:这种模式下SELinux不会强制执行安全措略,只有警告和日志记录。这种模式在SELinux相关问题的故障排除时候非常有用。

关闭模式:SELinux被关闭。

你可以使用命令行‘system-config-selinux‘, ‘getenforce‘ or ‘sestatus‘来浏览当前的SEliux的状态。

1 # sestatus

如果是关闭模式,通过下面的命令开启SELinux

1 # setenforce enforcing

你也可以通过配置文件‘/etc/selinux/config‘来进行SELinux的开关操作。

10. 移除KDE或GNOME桌面

没必要在专用的LAMP服务器上运行X Window桌面比如KDE和GNOME。可以移掉或关闭它们,以提高系统安全性和性能。打开/etc/inittab然后将run level改成3就可以关闭这些桌面。如果你将它彻底的从系统中移走,可以用下面这个命令:

1 # yum groupremove "X Window System"

11. 关闭IPv6

如果不用IPv6协议,那就应该关闭掉它,因为大部分的应用和策略都不会用到IPv6,而且当前它不是服务器必需的。可以在网络配置文件中加入如下几行来关掉它。

1 # vi /etc/sysconfig/network
2
3 NETWORKING_IPV6=no
4 IPV6INIT=no

12. 限制用户使用旧密码

如果你不希望用户继续使用老密码,这一条很有用。老的密码文件位于 /etc/security/opasswd。你可以使用 PAM 模块实现。

01 RHEL / CentOS / Fedora 中打开 ‘/etc/pam.d/system-auth‘ 文件。
02
03 # vi /etc/pam.d/system-auth
04
05 Ubuntu/Debian/Linux Mint 中打开 ‘/etc/pam.d/common-password‘ 文件。
06
07 # vi /etc/pam.d/common-password
08
09 在 ‘auth‘ 块中添加下面一行。
10
11 auth        sufficient    pam_unix.so likeauth nullok
12
13 在 ‘password‘ 块添加下面一行,禁止用户重新使用其过去最后用过的 5个密码。
14
15 password   sufficient    pam_unix.so nullok use_authtok md5 shadow remember=5

服务器只记录最后的 5 个密码。如果你试图使用曾用的最后 5个老密码中的任意一个,你将看到如下的错误提示。

Password has been already used. Choose another.

13. 如何检查用户密码过期?

在 Linux 中,用户的密码以加密的形式保存在 ‘/etc/shadow‘ 文件中。要检查用户的密码是否过期,你需要使用 ‘chage‘ 命令。它将显示密码的最后修改日期及密码期限的细节信息。这些细节就是系统决定用户是否必须修改其密码的依据。

要查看任一存在用户的老化信息,如 过期日 和 时长,使用如下命令。

1 #chage -l username

要修改任一用户的密码老化,使用如下命令。

1 #chage -M 60 username
2 #chage -M 60 -m 7 -W 7 userName
3 参数
4
5 -M 设置天数最大数字
6 -m 设定天数最小数字
7 -W 设定想要的天数

14. 手动锁定或解锁用户账号

锁定和解锁功能是非常有用的,你可以锁定一个账号一周或一个月,而不是将这个账号从系统中剔除。可以用下面这个命令锁定一个特定用户。

1 # passwd -l accountName

提示:这个被锁定的用户仅对root用户仍然可见。这个锁定是通过将加密过的密码替换成(!)来实现的。如果有个想用这个账号来进入系统,他会得到类似下面这个错误的提示。

1 # su - accountName
2 This account is currently not available.
3
4 解锁一个被锁定的账号时,用下面这个命令。这命令会将被替换成(!)的密码改回来。
5
6 # passwd -u accountName

15. 增强密码

有相当数量的用户使用很弱智的密码,他们的密码都可以通过字典攻击或者暴力攻击攻破。‘pam_cracklib‘模块存于在PAM 中,它可以强制用户设置复杂的密码。通过编辑器打开下面的文件。

1 # vi /etc/pam.d/system-auth

在文件中增加一行,使用认证参数(lcredit, ucredit, dcredit 或者 ocredit 对应小写字母、大写字母,数字和其他字符)

1 /lib/security/$ISA/pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-2 dcredit=-2 ocredit=-1

16. 启用Iptable(防火墙)

高度推荐启用linux防火墙来禁止非法程序访问。使用iptable的规则来过滤入站、出站和转发的包。我们可以针对来源和目的地址进行特定udp/tcp端口的准许和拒绝访问。

 

17. 禁止Ctrl+Alt+Delete重启

在大多数的linux发行版中,按下‘CTRL-ALT-DELETE’将会让你的系统重启。只说生产服务器上这是不是一个很好的做法,这可能导致误操作。
这个配置是在‘ /etc/inittab‘文件,如果你打开这个文件,你可以看到下面类似的段落。默认的行已经被注释掉了。我们必须注释掉他。这个特定按键会让系统重启。

1 # Trap CTRL-ALT-DELETE
2 #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

18. 检查空密码帐号

任何空密码的账户意味这可以让Web上任何无授权的用户访问,这是linux服务器的一个安全威胁。所以,确定所有的用户拥有一个复杂的密码并且不存在特权用户。空密码帐号是安全风险,可以被轻易的攻克。可以利用下面的命令来检查是否有空密码账户存在。

1 # cat /etc/shadow | awk -F: '($2==""){print $1}'

19. 登录前显示SSH提示

在ssh认证时候,使用一个法律和安全警示是很好的建议。关于SSH警示可以看下面的文章。

Display SSH Warning Message to Users

20. 监视用户行为

如果你有很多的用户,去收集每一个用户的行为和和他们的进程消耗的信息非常重要。可以随后和一些性能优化和安全问题处理时进行用户分析。但是如果监视和搜集用户行为信息呢 ?

有两个很有用的工具‘psacct‘ 和 ‘acct‘可以用来监视系统中用户的行为和进程。这些工具在系统后台执行并且不断记录系统中每一个用户的行为和各个服务比如Apache, MySQL, SSH, FTP, 等的资源消耗。对这些工具更多的安装配置和使用信息,请访问下面的网址:

Monitor User Activity with psacct or acct Commands

21. 定期查看日志

将日志移动到专用的日志服务器里,这可避免入侵者轻易的改动本地日志。下面是常见linux的默认日志文件及其用处:

01 /var/log/message – 记录系统日志或当前活动日志。
02 /var/log/auth.log – 身份认证日志。
03 /var/log/kern.log – 内核日志。
04 /var/log/cron.log – Crond 日志 (cron 任务).
05 /var/log/maillog – 邮件服务器日志。
06 /var/log/boot.log – 系统启动日志。
07 /var/log/mysqld.log – MySQL数据库服务器日志。
08 /var/log/secure – 认证日志。
09 /var/log/utmp or /var/log/wtmp :登录日志。
10 /var/log/yum.log: Yum 日志。

22. 重要文件备份

在生产环境里,为了灾难恢复,有必要将重要文件备份并保存在安全的远程磁带保险库、远程站点或异地硬盘。

23. NIC 绑定

有两种类型的NIC绑定模式,需要在绑定接口用得到。

mode=0 – 循环赛模式

mode=1 – 激活和备份模式

NIC绑定可以帮助我们避免单点失败。在NIC绑定中,我们把两个或者更多的网卡绑定到一起,提供一个虚拟的接口,这个接口设置ip地址,并且和其他服务器会话。这样在一个NIC卡down掉或者由于其他原因不能使用的时候,我们的网络将能保持可用。

 

24. 保持 /boot 只读

linux内核和他的相关的文件都保存在/boot目下,默认情况下是可以读写的。把它设为了只读可以减少一些由于非法修改重要boot文件而导致的风险。

1 # vi /etc/fstab

在文件最后增加下面的行,并且保存

1 LABEL=/boot     /boot     ext2     defaults,ro     1 2

如果你今后需要升级内核的话,你需要修回到读写模式。

25.不鸟ICMP和Broadcast请求

在/etc/sysctl.conf中添加下面几行,屏蔽掉ping和broadcast请求。

1 Ignore ICMP request:
2 net.ipv4.icmp_echo_ignore_all = 1
3
4 Ignore Broadcast request:
5 net.ipv4.icmp_echo_ignore_broadcasts = 1

运行下面这一行加载修改或更新

1 #sysctl -p

如果你觉得了上述安全小贴士很好用,或还有什么其它需要补充进去,请在下面的评论框里写写,不断追求进步的TecMint一如既往地愿意听到您的评论、建议以及讨论。

3月 29th, 2017

本文详细总结了PHP网站在Linux服务器上面的安全配置,包含PHP安全、mysql数据库安全、web服务器安全、木马查杀和防范等,很好很强大很安全。

php security

PHP安全配置

1. 确保运行php的用户为一般用户,如www

2. php.ini参数设置

1 disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,phpinfo #禁用的函数
2 expose_php = off            #避免暴露PHP信息
3 display_errors = off        #关闭错误信息提示
4 register_globals = off      #关闭全局变量
5 enable_dl = off             #不允许调用dl
6 allow_url_include = off     #避免远程调用文件
7 session.cookie_httponly = 1 #http only开启
8 upload_tmp_dir = /tmp       #明确定义upload目录
9 open_basedir = ./:/tmp:/home/wwwroot/ #限制用户访问的目录

open_basedir参数详解

open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号”.”来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。

举例来说: 若”open_basedir = /home/wwwroot”, 那么目录”/home/wwwroot”和”/home/wwwroot1″都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。

注意:

从网上获取的资料来看,open_basedir会对php操作io的性能产生很大的影响。研究资料表明,配置了php_basedir的脚本io执行速度会比没有配置的慢10倍甚至更多,请大家自己衡量

open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。

MySQL安全设置

1. MySQL版本的选择

在正式生产环境中,禁止使用4.1系列的MySQL数据库。至少需要使用5.1.39或以上版本。

2. 网络和端口的配置

在数据库只需供本机使用的情况下,使用–skip-networking参数禁止监听网络 。

3. 确保运行MySQL的用户为一般用户,如mysql,注意存放数据目录权限为mysql

1 vi /etc/my.cnf
2 user = mysql

4. 开启mysql二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点

1 vi /etc/my.cnf
2 log_bin = mysql-bin
3 expire_logs_days = 7

5. 认证和授权

(1) 禁止root账号从网络访问数据库,root账号只允许来自本地主机的登陆。

1 mysql>grant all privileges on *.* to root @localhost identified by 'password' with grant option;
2 mysql>flush priveleges;

(2) 删除匿名账号和空口令账号

1 mysql>USE mysql;
2 mysql>delete from user where User=;
3 mysql>delete from user where Password=;
4 mysql>delete from db where User=;

web服务器安全

确保运行Nginx或者Apache的用户为一般用户,如www,注意存放数据目录权限为www

防止sql注入

1 if ( $query_string ~* ".*[\;'\<\>].*" ){
2         return 404;
3 }

关闭存放数据上传等目录的PHP解析

1 location ~* ^/(attachments|data)/.*\.(php|php5)${
2     deny all;
3 }

针对Apache:关闭图片目录/上传等目录的PHP解析

1 <Files ~ ".php">
2     order allow,deny
3     Deny from all
4 </Files>

木马查杀和防范

php木马快速查找命令

1 grep -r --include=*.php '[^a-z]eval($_POST' /home/wwwroot/
2
3 grep -r --include=*.php 'file_put_contents(.*$_POST\[.*\]);' /home/wwwroot/

利用find mtime查找最近两天或者发现木马的这几天,有哪些PHP文件被修改

1 find -mtime -2 -type f -name \*.php

防范:

1. 做好之前的安全措施,比如禁用相关PHP函数等

2. 改变目录和文件属性

1 find -type f -name \*.php -exec chomd 644 {} \;
2 find -type d -exec chmod 755 {} \;
3 chown -R www.www /home/wwwroot/www.waitalone.cn

3. 为防止跨站感染,需要做虚拟主机目录隔离

(1) nginx的简单实现方法

利用nginx跑多个虚拟主机,习惯的php.ini的open_basedir配置:

open_basedir = ./:tmp:/home/wwwroot/

注:/home/wwwroot/是放置所有虚拟主机的web路径

黑客可以利用任何一个站点的webshell进入到/home/wwwroot/目录下的任何地方,这样对各个虚拟主机的危害就很大

例如: /data/www/wwwroot目录下有2个虚拟主机

修改php.ini

open_basedir = ./:/tmp:/home/wwwroot/www.waitalone.cn:/home/wwwroot/back.waitalone.cn

这样用户上传webshell就无法跨目录访问了。

(2) Apache的实现方法,控制跨目录访问

在虚拟机主机配置文件中加入

php_admin_value open_basedir “/tmp:/home/wwwroot/www.waitalone.cn”

TAGS: ,