Posts Tagged delete

bluehost因网站影响服务器性能冻结

前天一朋友为放在我bluehost上的博客购买了付费流量,也就是按月付费,几十块钱,每天能给网站带来几千IP,并承诺一个月内Alexa排名进20万,这个承诺有点胡扯了,不说能不能进,就算进了,本身也是没什么意义的

不过话说回来,进的可能还是大的,因为Alexa排名主要根据网站的非重复IP访问量,Alexa应该有个插件来监测这些数据,不过我感觉好像没用过,估计在中国用的人也不多

对方实现的方式很简单,就是在一个流量较大的网站上挂马,或者是对方自己运营的网站,这类网站有的如小说网,中国喜欢看小说的人多,太费时间了,我是多来不看的

这件事造成了很大麻烦,我真想不到小说有这么多人爱看;首先是公司的bluehost主机被关了,第一反应是侵权,但这些天没排名没广告没出单,前些天的单也过去很久了,老外应该没这么迟钝吧;看了邮件,里面原文如下:

Your web hosting account for XXXXXX.com has been deactivated, as of 10/23/2009. (reason: site causing performance problems)

This deactivation was due to a Terms of Service violation associated with your account. At sign-up, all users state that they have read through, understand, and agree to our terms. These terms are legal and binding.

Although your web site has been suspended, your data may still be available for up to 15 days past the date of deactivation; however, after this time, your account and all of its files, databases, and emails will be deleted.
If you feel this deactivation was made in error, or in order to gain access to your account, please call our customer service line as soon as possible at (888) 401-4678.
Please read the following, derived from our Terms of Service agreement, for additional information regarding the matter.
Engaging in any activity that, in BlueHost.Com’s sole and absolute discretion, disrupts, interferes with, or is harmful to (or threatens to disrupt, interfere with, or be harmful to) BlueHost.Com’s services, BlueHost.Com’s business, operations, reputation, goodwill, subscribers and/or subscriber relations, or the ability of BlueHost.Com’s subscribers to effectively use BlueHost.Com’s services is prohibited.

Please review the current copy of our Terms of Service here:
http://www.bluehost.com/cgi/terms

Thank you,
BlueHost.Com Support
http://www.bluehost.com
For support go to http://helpdesk.bluehost.com/
Toll-Free: (888) 401-4678

原来是网站造成了服务器性能问题,我查了日志,那个博客在一分钟内的请求达到200多次,高并发,造成服务器cpu占用过高,马上被冻结了

第一时间和客服联系上,bluehost的客服响应速度不错,但他们弄错了东西,就是认定是产品站的问题,我可急了,据理力争,让他们查日志去,最后各让一步,我删了那个博客站,总算解冻

如果我没搞错的话,这中间还是有BUG的,不然bluehost也不会搞错网站;客服毕竟是客服,这个,和思力的支持组差不多,汗一个

就像上次IXwebhosting一样,我忘了点应用按钮,以为优惠码不能用了,也是和对方客服争了半天,客服说是优惠码过期,我没办法,后来再试了下,点了应用键,居然行了,看来是客服不太敬业

而有的机子上,就算点了,也是报失效,哈哈,我这电脑的物理地址估计被ixwebhosting加为会员了

  • Share/Bookmark

Tags: , , , , , , , , , , ,

Deleting of product data debris failed! Please see the debug log in your uploads directory for further information.

zen cart 打开Easy Populate 1.2.5.4报错,信息如下:

Deleting of product data debris failed! Please see the debug log in your uploads directory for further information.

居然到官方论坛也得不到什么好结果,只好开FTP进去看,在temp文件夹里有错误日志:ep_debug_log.txt

里面内容如下:

Product debris corresponding to the following product_id(s) cannot be deleted by EasyPopulate:
129:5a4af9136c93e2ee5a9f7f73f9ca5481
143:fbfa1d277568fbe8e24b017f1e280d76
154:465f6fe6a48b53cf3796d4b1aeabaff4
126:64ad7566763b920d2646dce5302e4d33
142:642050ed4f5280813d68bbfe5f0c4c29
153:796d6682c145097efe123b8efafc0939
124:0aeccd9106c2ebcb5818d102d2f24319
147:e69718e20cd902ed340bb229797e5ea7
167:5ab0f97452dd98016e7cc5161a94b0e8
It is recommended that you delete this corrupted data using phpMyAdmin.

有产品信息残留无法清除,用phpmyadmin搜了所有表,原来是顾客的购物车表里有残留信息

相应的表为:zen_customers_basket、zen_customers_basket_attributes

清空这两个表就OK了

这种情况一般发生在顾客购物车不为空时删除了产品

  • Share/Bookmark

Tags: , , , , , ,

HTTP请求报文格式

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

http请求报文格式

http请求报文格式

(1)请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。

HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。

GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。

POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。

(2)请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

(3)空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

(4)请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

 

所谓的google会查看你的电脑硬件信息,我看还是不大可能的,顶多查出你的浏览器和操作系统类型

  • Share/Bookmark

Tags: , , , , ,

关于域名到期删除新规则

Verisign已经改变域名到期删除的相关规则,具体举例如下:
1:比如域名aaa.com到期时间为2003年03月01日;
2:从2003年03月02日开始,域名的ns将会被系统自动删除,域名无法解析,但我公司会继续保留该域名30天,用户可以在这30天的期限内续费;
3:如果在2所述的30天期限内没有续费,即从2003年03月31日开始,域名将变成RedemptionPeriod状态,该状态将会保持30天,在此期间该域名不会掉下来,但是除了restore命令以外的所有命令对此域名无效;
4:域名在RedemptionPeriod状态下可以restore回来,但每restore一次需要支付(折合)人民币1000元(含一年续费);
5:如果域名在RedemptionPeriod状态下的30天没有restore,从2003.04.29开始域名变成PendingDelete状态(5天),2003年04月04日该域名将会删除。

VeriSign于2003年1月在其Registry Whois (.COM和.NET)中加了3个字段:

Status、Creation Date、Expiration Date

其中 Status 目前发现有8种状态,分别是:

1、ACTIVE:活动状态。由Registry设置;该域名可以由Registrar更改;可以续费;至少被指派一个DNS。

2、REGISTRY-LOCK:注册局锁定。由注册局设置;该域名不可以由注册商更改、删除;必须由注册局解除此状态才可以由注册商更改域名信息;域名可以续费;如果域名被指派至少一个DNS则可以包含在(域名根服务器)的区域中(可以正常使用)。

3、REGISTRY-HOLD:注册局保留。由注册局设置;该域名不可以由注册商更改、删除;必须由注册局解除此状态才可以由注册商更改域名信息;域名可以续费;该域名不包括在(域名根服务器)的区域中(不能正常使用)。

4、REGISTRAR-LOCK:注册商锁定。由该域名的原始注册商设置;该域名不可以被更改或删除;必须由注册商解除此状态才可以更改域名信息;该域名可以续费。该域名包含在(域名根服务器)的区域中(可以正常使用)。

5、REGISTRAR-HOLD:注册商保留。由该域名的原始注册商设置;该域名不可以被更改或删除;必须由注册商解除此状态才可以更改域名信息;该域名可以续费。该域名不包括在(域名根服务器)的区域中(不能正常使用)。

6、REDEMPTIONPERIOD:宽限期。当注册商向注册局提出删除域名请求后,由注册局将域名设置称此状态,不过,条件是该域名已经注册了5天以上(如果该域名注册时间不足5天,则立即删除);该域名不包括在(域名根服务器)的区域中(不能正常使用);该域名不可以被更改或清除,只可以被恢复;任何其他注册商提出对此域名的更改或其他请求都将被拒绝;该状态最多保持30天。

7、PENDINGRESTORE:恢复未决。当注册商提出将处于REDEMPTIONPERIOD的域名恢复请求后,由注册局设置;该域名包含在(域名根服务器)的区域中(可以正常使用);注册商提出的更改或任何其他请求都将被拒绝;在7天之内,有注册商向注册局提供必需的恢复文件,如果注册商在7天之内提供了这些文件,该域名将被置为ACTIVE状态,否则,该域名将重新返回到REDEMPTIONPERIOD状态。

8、PENDINGDelete:删除未决。如果一个域名在被设置成REDEMPTIONPERIOD状态期间内,注册商没有提出恢复请求,那么,域名将被置于PENDINGDelete状态,注册商对此域名的任何请求都将被拒绝;5天之后清除。

 

VeriSign是什么?
VeriSign是全球领先的提供互联网基础服务的公司,在全球互联网上负责处理.com和.net的域名解析工作,同时也经营智能基础架构服务。 VeriSign每天提供140亿次的互联网和电子邮件交互、30亿次的电话交互以及价值1千亿美元的电子商务业务服务。VeriSign提供的服务帮助超过3000家企业和40万个网站安全高效地运行,这些服务包括:安全管理、身份认证、安全咨询、信用卡支付的网关服务和电子邮件服务。
VeriSign 最主要的业务之一是颁发各种数字证书(SSL证书和代码签名证书),其SSL证书是业界最高端的SSL证书产品,广泛用于银行金融类网站和各大中型企业。全球 500 强中有 93% 的企业选用、全球前 40 大银行都选用、全球 50 大电子商务网站中有 47 个网站使用。

ICANN是什么?
ICANN就是互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers)
他是一个非营利性的国际组织,负责互联网协议(IP)地址的空间分配、协议标识符的指派、通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统的管理。
这些服务最初是在美国政府合同下由互联网号码分配当局(Internet Assigned Numbers Authority,IANA)以及其它一些组织提供。现在,ICANN行使IANA的职能。
作为一个公私结合组织,ICANN致力于维护互联网运行的稳定性、促进竞争、广泛代表全球互联网组织、以及通过自下而上和基
于一致意见的程序制定与其使命相一致的政策。

  • Share/Bookmark

Tags: , , , , , ,

更改通达OA设置时返回桌面出错的解决办法

错误代码一般如下:

#1054: Unknown column 'FROM_ID' in 'field list'
SQL语句: SELECT EMAIL_ID,READ_FLAG,FROM_ID,SUBJECT,IMPORTANT,USER_NAME,AVATAR,DEPT_ID from EMAIL,EMAIL_BODY LEFT JOIN USER ON USER.USER_ID = EMAIL_BODY.FROM_ID where EMAIL.BODY_ID=EMAIL_BODY.BODY_ID and BOX_ID=0 and TO_ID='admin' and SEND_FLAG='1' and (DELETE_FLAG='0' or DELETE_FLAG='2') order by SEND_TIME desc limit 0,15
文件: D:/MYOA/webroot/general/mytable/intel_view/index.php

修改办法
返回数据库查看出错的几张表。查看表中的数据无任何异常,但当打开表结构发现几个表字段名的后面多加了两个空格。发现问题后修改回来一切正常了。

原因:
返回webroot\general\system\security\submit.php文件解密后打开发现了问题所在:

if ( tdoa_optional( "TDEA" ) && tdoa_optional( "EXAM" ) )
{
                                $query = "ALTER TABLE `EMAIL_BODY` CHANGE `FROM_ID` `FROM_ID ` VARCHAR( 20 ) NOT NULL";
                                @mysql_query( $query, $connection );
                                $query = "ALTER TABLE `FILE_CONTENT` CHANGE `SORT_ID` `SORT_ID ` INT( 11 ) DEFAULT '0' NOT NULL";
                                @mysql_query( $query, $connection );
                                $query = "ALTER TABLE `FLOW_RUN` CHANGE `RUN_NAME` `RUN_NAME ` VARCHAR( 200 ) NOT NULL";
                                @mysql_query( $query, $connection );
}

直接干掉这段代码就行了

还有其它几个文件也有,自己解密后搜一下,改一下

  • Share/Bookmark

Tags: , , , , , , , , , , , , , , ,

MySQL:InnoDB和MyISAM的差别

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。下面是已知的两者之间的差别,仅供参考。

innodb
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。
InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。
MyISAM
MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

MyISAM和InnoDB优化:
key_buffer_size – 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 — 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 — .MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。
innodb_buffer_pool_size – 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把
innodb_additional_pool_size – 这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。
innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。
innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。
innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置为 0 就快很多了,不过也相对不安全了 — MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。
table_cache — 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。
thread_cache — 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。
query_cache — 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。
sort_buffer_size –如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。

  • Share/Bookmark

Tags: , , , , , , , , , ,

了解 linux 磁盘结构及分区

 

1991年,芬兰的一名学生linus torvalds出于兴趣,以他的灵感和才思,开发了当今最为流行的免费操作系统linux。linux也正以它的优越性赢得越来越多的用户的喜爱,同时也被微软视为最可怕的竞争对手之一。全世界使用linux操作系统的人正以惊人的速度增涨着,同时也产生了linux诸多不同的版本,因为它实在是太可爱了,太好了。但这里也不能说它的好了,要不就有骗稿费之疑了。但它有个最突出的特点是它的源代码全都是公开的,这样每个用户或机构就可以根据自己的需要来修改linux,甚至你也可以开发出属于你自己的操作系统。linux也给我国计算机的发展带来了机遇,借助linux的开放性我们可以开发出全中文的操作系统,我们也将不需“洋油”来过日子了。

由于linux是个自由软件,所以在使用起来不及windows这个商业软件来得上手,但好的是,linux正不断改正这一缺点,现在普通用户也可以轻松地掌握它了。本文就用户在装linux的过程中,所遇到的linux分区问题来详细地介绍一下,这里以red hat linux7.1为例。

 

首先我们要对硬盘分区的基本概念进行一些初步的了解,硬盘的分区主要分为基本分区(primary partion)和扩充分区(extension partion)两种,基本分区和扩充分区的数目之和不能大于四个。且基本分区可以马上被使用但不能再分区。扩充分区必须再进行分区后才能使用,也就是说它必须还要进行二次分区。那么由扩充分区再分下去的是什么呢?它就是逻辑分区(logical partion),况且逻辑分区没有数量上限制。

 

对习惯于使用dos或windows的用户来说,有几个分区就有几个驱动器,并且每个分区都会获得一个字母标识符,然后就可以选用这个字母来指定在这个分区上的文件和目录,它们的文件结构都是独立的,非常好理解。但对这些用户初上手red hat linux吗,可就有点恼人了。因为对red hat linux用户来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构。red hat linux中每个分区都是用来组成整个文件系统的一部分,因为它采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。下面我们先来看看red hat linux的驱动器是如何标识的。

 

对于ide硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指ide硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。例,hda3表示为第一个ide硬盘上的第三个主分区或扩展分区,hdb2表示为第二个ide硬盘上的第二个主分区或扩展分区。对于scsi硬盘则标识为“sdx~”,scsi硬盘是用“sd”来表示分区所在设备的类型的,其余则和ide硬盘的表示方法一样,不在多说。

 

我们从上面可以看到,red hat linux的分区是不同于其它操作系统分区的,它的分区格式只有ext2和swap两种,ext2用于存放系统文件,swap则作为red hat linux的交换分区。那么现在我们就可以知道red hat linux至少需要两个专门的分区(linux native和linux swap)况且不能将red hat linux安装在dos/windows分区。一般来说我们将red hat linux安装一个或多个类型为“linux native”的硬盘分区,但是在red hat linux的每一个分区都必须要指定一个“mount point”(载入点),告诉red hat linux在启动时,这个目录要给哪个目录使用。对“swap”分区来说,一般定义一个且它不必要定义载入点。下面我们先对“linux native”和“linux swap”有个初步的了解。

 

*swap分区是linux暂时存储数据的交换分区,它主要是把主内存上暂时不用得数据存起来,在需要的时候再调进内存内,且作为swap使用的分区不用指定“mout point”(载入点),既然它作为交换分区,我们理所当然应给它指定大小,它至少要等于系统上实际内存的量,一般来说它的大小是内存的两倍,如果你是16mb的内存,那么swap分区的大小是32mb左右,以此类推。但必须还要注意一点,swap分区不要大于128mb,如果你是64mb的内存,那么swap分区最大也只能被定为127mb,再大就是浪费空间了,因为系统不需要太大的交换分区。以此类推,如果你是128mb或更大的内存,swap分区也只能最大被定为127mb。况且你还必须注意的是如果你是128mb(或更大)的内存,你必须提醒系统你有这么大的内存,要不然它可不认你这个128mb内存。具体如下:当顺利启动了安装过程后,会显示一个boot:提示符,这时你只要键入boot:linux mem=128mb就可以了。另外你也可以创建和使用一个以上的交换分区,最多16个。

 

*linux native是存放系统文件的地方,它只能用ext2的分区类型,上面已说过。对windows用户来说,操作系统必须装在同一分区里,它是商业软件吗!所以你没有选择的余地!对red hat linux来说,你有了较大的选择余地,你可以把系统文件分几个区来装(必须要说明载入点),也可以就装在同一个分区中(载入点是“/”)。下面我们看看可以创建哪些分区(仅列常用几种)。

 

/boot分区,它包含了操作系统的内核和在启动系统过程中所要用到的文件,建这个分区是有必要的,因为目前大多数的pc机要受到bios的限制,况且如果有了一个单独的/boot启动分区,即使主要的根分区出现了问题,计算机依然能够启动。这个分区的大小约在50mb—100mb之间。但是如果想用lilo启动red hat linux系统的话,含有/boot的分区必须完全在柱面1023以下。又由于8gb后的数据lilo不能读取,所以red hat linux要安装在8gb的区域以内。

 

/usr分区,是red hat linux系统存放软件的地方,如有可能应将最大空间分给它。

 

/home分区,是用户的home目录所在地,这个分区的大小取决于有多少用户。如果是多用户共同使用一台电脑的话,这个分区是完全有必要的,况且根用户也可以很好地控制普通用户使用计算机,如对用户或者用户组实行硬盘限量使用,限制普通用户访问哪些文件等。其实单用户也有建立这个分区的必要,因为没这个分区的话,那么你只能以根用户的身份登陆系统,这样做是危险的,因为根用户对系统有绝对的使用权,可一旦你对系统进行了误操作,麻烦也就来了。

 

/var/log分区,是系统日志记录分区,如果设立了这一单独的分区,这样即使系统的日志文件出现了问题,它们也不会影响到操作系统的主分区。

 

/tmp分区,用来存放临时文件。这对于多用户系统或者网络服务器来说是有必要的。这样即使程序运行时生成大量的临时文件,或者用户对系统进行了错误的操作,文件系统的其它部分仍然是安全的。因为文件系统的这一部分仍然还承受着读写操作,所以它通常会比其它的部分更快地发生问题。

 

/bin分区,存放标准系统实用程序。

 

/dev分区,存放设备文件。

 

/opt分区,存放可选的安装的软件。

 

/sbin分区,存放标准系统管理文件。

 

上面介绍了几个常用的分区,一般来说我们需要一个swap分区,一个/boot分区,一个/usr分区,一个/home 分区,一个/var/log分区。当然这没有什么规定,完全是依照你个人来定的。但记住至少要有两个分区,一个swap分区,一个/分区。下面我们来看看怎样分区。

 

用户可以使用两种分区工具:

 

1.disk druid:它是red hat linux提供的硬盘管理工具,它最初是随red hatlinux5一起发售的,它可以根据用户的要求创建和删除硬盘分区,另外还可以为每个分区管理载入点,这是一个不错的分区软件,建议读者使用。本文也将以此软件详细地介绍red hat linux分区。

 

2.fdisk:它是传统的linux硬盘分区工具,比disk druid更强大,使用更加灵活。但是fdisk要求用户对硬盘分区有一定经验,并能够适应且读懂简单的文本界面。如果你是第一次对一个硬盘驱动器进行分区操作的话,最好还是避免fdisk这样的程序,它虽然强大但用起来的感觉不是太好的。

 

附注:此外red hat linux还提供了一种叫fips的分区软件,但这种分区软件具有一定的危险性,不宜提倡操作。虽然有许多人已经成功地用fips对他们的硬盘进行了分区,但这不能保证fips将在你的系统中也能正常地运行。况且red hat linux也不提供对fips的支持,劝你对这种分区软件还是慎用为好。

 

如果你希望将red hat linux安装在已经含有其他操作系统的盘上,也就是多重操作系统,这个情况就比较复杂了,因为一个错误就可以毁掉你辛辛苦苦保存的数据,让你欲哭无泪。如果你想让red hat linux与os/2共存,那你必须使用os/2的分区软件来创建硬盘分区,要不然os/2将不能识别硬盘分区。另外你也可以用其它的一些分区软件来分区,下面列出了一些常见的这种分区工具软件:

 

*partition commander软件,从www.v-com.com处下载。

 

*partition it软件,从www.quarterdeck..com处下载。

 

*partition magic软件,从www.powerquest.com处下载。

 

注意:硬盘分区是一个非常危险的步骤,你要想安全地在不丢失数据的情况下改变磁盘的分区有点不太现实,所以我建议大家对重要得数据进行备份,装多操作系统更要如此,以备不测。当然或许你是刚装系统或就准备重装,那也就是另外一回事了,但是大家对待分区一定要慎重又慎重,切记。

 

下面我们详细地了解一下red hat linux7.1自带的disk druid分区软件所包含的一些信息。

 

1.current disk partitions区域(这里每一行代表了一个硬盘分区)

 

mount point 指出red hat linux启动并运行以后该分区的加载点,交换空间(linux swap)是不需要加载点的。

 

device 硬盘分区的设备名

 

requeted 给这个分区定义时申请的最小空间

 

actual 分配给该分区的实际空间

 

type 说明了该分区的类型

 

2.drive summaries区域(这里每一行代表一个硬盘)

 

drive 显示硬盘的设备名

 

geom[c/h/s] 显示硬盘的物理信息,c(柱面),h(磁头),s(扇区)

 

total 显示硬盘的可用空间

 

used 显示硬盘中已分配的空间

 

free 显示硬盘中末分配的空间

 

bar graph 该条图形化地显示当前硬盘使用的百分比,#号越少,空闲空间越多

 

3.disk druid按钮

 

add 增加一个分区

 

edit 修改在current disk partitons中被选中的分区的属性,选中该按钮将出现一个对话框来进行修改,但只能修改该分区的载入点。如果你需要修改其它内容,请先删除该分区,而后再重新建这分区。

 

delete 删除一个在current disk partitons中被选中的分区

 

ok 确认

 

back 不作保存,返回

 

4.如果你想增加一个分区,请点击“add”按钮,这时会出现一对话框,内容说明如下:

 

mount point 分区载入点,说明分区

 

size 分区的大小

 

grow to fill disk 表明这个分区将添满一个硬盘的整个未分配空间。这时,这个分区的容量可以随着其它分区的修改增加或减少

 

type 选择分区类型

 

allowable drives 选择这个分区将创建在哪个硬盘上

 

好了,通过上面的了解想必大家都能容易地创建出适合自己的分区。下一步我们所要做的工作就是要格式化所建的分区,选择你要格式化的分区并按space键,如果想在格式化分区时检查有无坏块,选择“check for bad blocks during format”,点击ok并按space键。如果分区中已无你要所保存的数据,最好都格式化一下。

  • Share/Bookmark

Tags: , , , , , , , , , , ,

nginx详解

Nginx 概述
 

HTTP基础功能:  

处理静态文件,索引文件以及自动索引; 
反向代理加速(无缓存),简单的负载均衡和容错; 
FastCGI,简单的负载均衡和容错; 
模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理; 
SSL 和 TLS SNI 支持;  
 

IMAP/POP3 代理服务功能:  

使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端; 
使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端; 
认证方法:  
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5; 
IMAP: IMAP LOGIN; 
SMTP: AUTH LOGIN PLAIN CRAM-MD5; 
SSL 支持; 
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;  
支持的操作系统:  

FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64; 
Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64; 
Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
MacOS X (10.4) PPC;
结构与扩展:

一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;
kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
最小化的数据拷贝操作;
其他HTTP功能:

基于IP 和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive 和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx 错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端 IP 地址和 HTTP 基本认证的访问控制;
PUT, DELETE, 和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制;
实验特性:

内嵌的 perl
通过 aio_read()/aio_write() 的套接字工作的实验模块,仅在 FreeBSD 下。
对线程的实验化支持,FreeBSD 4.x 的实现基于 rfork()
为什么选择Nginx
 

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
安装Nginx
 

预先编译好的安装包

Nginx在一些Linux发行版和BSD的各个变种版本的安装包仓库中都会有,通过各个系统自带的软件包管理方法即可安装。需要注意的是,很多预先编译好的安装包都比较陈旧,大多数情况下还是推荐直接从源码编译。

 

官方源代码下载

点击下载源代码

 

使用源代码进行构建

Nginx 使用 Unix 下常用的 ‘./configure && make && make install’ 过程来编译安装。

configure 脚本确定系统所具有一些特性,特别是 nginx 用来处理连接的方法。然后,它创建 Makefile 文件。

configure 支持下面的选项:

–prefix=<path> – Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。

–sbin-path=<path> – Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。

–conf-path=<path> – 在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf。

–pid-path=<path> – 在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 <prefix>/logs/nginx.pid。

–lock-path=<path> – nginx.lock文件的路径。

–error-log-path=<path> – 在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 <prefix>/logs/error.log。

–http-log-path=<path> – 在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 <prefix>/logs/access.log。

–user=<user> – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。

–group=<group> – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。

–builddir=DIR – 指定编译的目录

–with-rtsig_module – 启用 rtsig 模块

–with-select_module –without-select_module – Whether or not to enable the select module. This module is enabled by default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.

//允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式

–with-poll_module –without-poll_module – Whether or not to enable the poll module. This module is enabled by default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.

–with-http_ssl_module – Enable ngx_http_ssl_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian, this is libssl-dev.

//开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl

–with-http_realip_module – 启用 ngx_http_realip_module

–with-http_addition_module – 启用 ngx_http_addition_module

–with-http_sub_module – 启用 ngx_http_sub_module

–with-http_dav_module – 启用 ngx_http_dav_module

–with-http_flv_module – 启用 ngx_http_flv_module

–with-http_stub_status_module – 启用 “server status” 页

–without-http_charset_module – 禁用 ngx_http_charset_module

–without-http_gzip_module – 禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。

–without-http_ssi_module – 禁用 ngx_http_ssi_module

–without-http_userid_module – 禁用 ngx_http_userid_module

–without-http_access_module – 禁用 ngx_http_access_module

–without-http_auth_basic_module – 禁用 ngx_http_auth_basic_module

–without-http_autoindex_module – 禁用 ngx_http_autoindex_module

–without-http_geo_module – 禁用 ngx_http_geo_module

–without-http_map_module – 禁用 ngx_http_map_module

–without-http_referer_module – 禁用 ngx_http_referer_module

–without-http_rewrite_module – 禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。

–without-http_proxy_module – 禁用 ngx_http_proxy_module

–without-http_fastcgi_module – 禁用 ngx_http_fastcgi_module

–without-http_memcached_module – 禁用 ngx_http_memcached_module

–without-http_limit_zone_module – 禁用 ngx_http_limit_zone_module

–without-http_empty_gif_module – 禁用 ngx_http_empty_gif_module

–without-http_browser_module – 禁用 ngx_http_browser_module

–without-http_upstream_ip_hash_module – 禁用 ngx_http_upstream_ip_hash_module

–with-http_perl_module – 启用 ngx_http_perl_module

–with-perl_modules_path=PATH – 指定 perl 模块的路径

–with-perl=PATH – 指定 perl 执行文件的路径

–http-log-path=PATH – Set path to the http access log

–http-client-body-temp-path=PATH – Set path to the http client request body temporary files

–http-proxy-temp-path=PATH – Set path to the http proxy temporary files

–http-fastcgi-temp-path=PATH – Set path to the http fastcgi temporary files

–without-http – 禁用 HTTP server

–with-mail – 启用 IMAP4/POP3/SMTP 代理模块

–with-mail_ssl_module – 启用 ngx_mail_ssl_module

–with-cc=PATH – 指定 C 编译器的路径

–with-cpp=PATH – 指定 C 预处理器的路径

–with-cc-opt=OPTIONS – Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-cc-opt=”-I /usr/local/include”. If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: –with-cc-opt=”-D FD_SETSIZE=2048″.

–with-ld-opt=OPTIONS – Additional parameters passed to the linker. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-ld-opt=”-L /usr/local/lib”.

–with-cpu-opt=CPU – 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

–without-pcre – 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也需要 PCRE 。

–with-pcre=DIR – 指定 PCRE 库的源代码的路径。

–with-pcre-opt=OPTIONS – Set additional options for PCRE building.

–with-md5=DIR – Set path to md5 library sources.

–with-md5-opt=OPTIONS – Set additional options for md5 building.

–with-md5-asm – Use md5 assembler sources.

–with-sha1=DIR – Set path to sha1 library sources.

–with-sha1-opt=OPTIONS – Set additional options for sha1 building.

–with-sha1-asm – Use sha1 assembler sources.

–with-zlib=DIR – Set path to zlib library sources.

–with-zlib-opt=OPTIONS – Set additional options for zlib building.

–with-zlib-asm=CPU – Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro

–with-openssl=DIR – Set path to OpenSSL library sources

–with-openssl-opt=OPTIONS – Set additional options for OpenSSL building

–with-debug – 启用调试日志

–add-module=PATH – Add in a third-party module found in directory PATH

在不同版本间,选项可能会有些许变化,请总是使用 ./configure –help 命令来检查一下当前的选项列表。

示例 (最好能在同一行):

 

    ./configure \        –sbin-path=/usr/local/nginx/nginx \        –conf-path=/usr/local/nginx/nginx.conf \        –pid-path=/usr/local/nginx/nginx.pid \        –with-http_ssl_module \        –with-pcre=../pcre-4.4 \        –with-zlib=../zlib-1.1.3
 

Ubuntu/debian 上的示例,需要预先安装 libgcrypt11-dev, libpcre3-dev 和 libssl-dev (选择 –with-md5 或 –with-sha1 中的一个, 但不能都选; 在 debian 和 ubuntu 上, 它们应该都指向 /usr/lib)

 

     ./configure –with-openssl=/usr/lib/ssl/ –with-md5=/usr/lib
 

Ubuntu Edgy 的一个 0.5.2 版本的 .deb 包可以在这里下载: nginx_0.5.2-1_i386.deb.

(注: 根据 October 2006 message 的消息,md5 在一个现在不再使用的 http 缓存模块中用到,而 sha1 用在一个未完成的 mysql 库模块,所以它们当前都不是必须的)

 

运行和控制 Nginx – 命令行参数和信号
不像许多其他软件系统,Nginx 仅有数个命令行参数,完全通过配置文件来配置(想象一下)。

选项
示例
使用信号加载新的配置
平滑升级到新的二进制代码
 

 

选项

-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。

-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

-v 显示 nginx 的版本。

-V 显示 nginx 的版本,编译器版本和配置参数。

 

示例

 

/usr/bin/nginx -t -c ~/mynginx.conf
 

 

通过系统的信号控制 Nginx

可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/logs/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。

主进程可以处理以下的信号:

TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程

 

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM, INT 快速关闭
QUIT 从容关闭
USR1 重新打开日志文件

 

 

使用信号加载新的配置

Nginx 支持几个信号,能在它运行时控制其操作。其中最普通的是 15 ,用来中止运行的进程:

 

# ps aux | egrep ‘(PID|nginx)’USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
# kill -15 2213
 

而最有趣的是能平滑改变 nginx 配置的选项(请注意,在重载前,要先测试一下配置文件):

 

# nginx -t -c /etc/nginx/nginx.conf2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully
# ps aux | egrep ‘(PID|nginx)’
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
# kill -HUP 2213
 

当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。

 

平滑升级到新的二进制代码

你可以在不中断服务的情况下 – 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送 USR2 (kill -USR2 pid)信号给主进程。主进程将重命名它的 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
 

在这时,两个 nginx 实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
 

一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:

 

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
 

这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:

发送 HUP 信号给旧的主进程 – 它将在不重载配置文件的情况下启动它的工作进程
发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
发送 TERM 信号给新的主进程,迫使其退出
如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号
新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。

如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行:

 

      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND    36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
 

Nginx 配置优化
hash表

Ngnix使用hash表来协助完成请求的快速处理。

考虑到保存键及其值的hash表存储单元的大小不至于超出设定参数(hash bucket size), 在启动和每次重新配置时,Nginx为hash表选择尽可能小的尺寸。

直到hash表超过参数(hash max size)的大小才重新进行选择. 对于大多数hash表都有指令来修改这些参数。例如,保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所 控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

 

事件模型

Nginx支持如下处理连接的方法(I/O复用方法),这些方法可以通过use指令指定。

select – 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 –with-select_module 和 –without-select_module 来启用或禁用这个模块。
poll – 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 –with-poll_module 和 –without-poll_module 来启用或禁用这个模块。
kqueue – 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
epoll – 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2, 有让2.4版本的内核支持epoll的补丁。
rtsig – 可执行的实时信号,使用于Linux内核版本2.2.19以后的系统。默认情况下整个系统中不能出现大于1024个POSIX实时(排队)信号。这种情况对于高负载的服务器来说是低效的;所以有必要通过调节内核参数 /proc/sys/kernel/rtsig-max 来增加队列的大小。可是从Linux内核版本2.6.6-mm2开始, 这个参数就不再使用了,并且对于每个进程有一个独立的信号队列,这个队列的大小可以用 RLIMIT_SIGPENDING 参数调节。当这个队列过于拥塞,nginx就放弃它并且开始使用 poll 方法来处理连接直到恢复正常。
/dev/poll – 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
eventport – 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安全补丁。
 

参考:Nginx 中文站:http://www.nginx.cn/NginxChsFeatureRequests

  • Share/Bookmark

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Linux下的ftp命令大全

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中
-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip

2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。

4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。

10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。

12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。

14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。

16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。

20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。

22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。

26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。

28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。
29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。

32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。
35.modtime file-name:显示远程主机文件的最后修改时间。

36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。
39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。

42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。

44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。

48.quote arg1,arg2…:将参数逐字发至远程ftp服务器,如:quote syst.
49.recv remote-file[local-file]:同get。

50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。

52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。

54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。

58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。

60.site arg1,arg2…:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。

62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。

64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。

66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。

68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。

70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

  • Share/Bookmark

Tags: , , , , , , , , , , , , , , , , , , ,

一个整理的dnspod接口类

DNSPod 建立于2006年3月份,是一款免费智能DNS产品。网址http://www.dnspod.com/
DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,达到互联互通的效果。
当然,不需要智能解析的普通用户也可以用它的服务。不限制用户的域名、记录数量,并且提供别的DNS服务提供商没有提供的服务。
DNSPod服务器:ns1.dnspod.net~ns6.dnspod.net 共6台
比较人性化的是它提供了丰富的API接口
DNSPod API 列表

目前DNSPod的API是完全免费开放给大家使用。
API调用示例请看DNSPod API 调用实例

方法列表

== 添加新域名

URL: /API/Domain.Create
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain – 域名, 没有 WWW, 如 dnspod.com
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名无效
 5 域名已存在
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Domain name created success.</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
 <domain>
  <id>141846</id>
  <punycode>test1163078446.com</punycode>
 </domain>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Domain name created success.”,
        ”created_at”: “2008-11-25 21:12:23″
    },
    ”domain”: {
        ”id”: “141839″,
        ”punycode”: “test110891592.com”
    }
}

== 获取域名列表

URL: /API/Domain.List
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 没有域名
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Get domain list success</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
 <domains>
  <domain>
   <id>141842</id>
   <name>test1045710140.com</name>
   <status>1</status>
   <records>0</records>
  </domain>
  <domain>
   <id>141846</id>
   <name>test1163078446.com</name>
   <status>1</status>
   <records>0</records>
  </domain>
 </domains>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Get domain list success.”,
        ”created_at”: “2008-11-25 21:14:50″
    },
    ”domains”: {
        ”domain”: [
            {
                "id": 141839,
                "name": "test110891592.com",
                "status": "1",
                "records": "0"
            },
            {
                "id": 141840,
                "name": "test1451919503.com",
                "status": "1",
                "records": "0"
            }
        ]
    }
}

== 删除单个域名

URL: /API/Domain.Remove
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名ID错误
 5 域名不存在
 6 非域名所有者
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Domain delete success.</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Domain delete success.”,
        ”created_at”: “2008-11-25 21:14:50″
    }
}

== 设置域名状态

URL: /API/Domain.Status
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
 status {enable,disable} – 状态
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名ID错误
 5 域名不存在
 6 非域名所有者
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Domain status changed success.</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Domain status changed success.”,
        ”created_at”: “2008-11-25 21:14:50″
    }
}

== 创建新记录

URL: /API/Record.Create
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
 sub_domain – 主机记录, 如 www
 record_type {1,2,3,4,5,6,7} – 记录类型, 1:A, 2:CNAME, 3:MX, 4:URL Redirect, 5:NS, 6:TXT, 7:AAAA
 record_line {1,2,3,4} – 线路类型, 1:通用, 2:电信, 3:网通, 4:教育网
 value – 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com.
 mx {1-20} – MX优先级, 当记录类型是 MX 时有效,范围1-20
 ttl {1-604800} – TTL,范围1-604800
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名ID错误
 5 域名不存在
 6 非域名所有者
 7 缺少参数或者参数错误
 8 主机记录错误
 9 记录值错误
 10 不能为@记录设置NS类型
 11 TTL 必须大于 1
 12 MX 必须大于 1
 12 记录重复或者和 CNAME 记录冲突
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Record created success</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
 <record>
  <id>419616</id>
  <name>test1163078446</name>
 </record>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Record created success”,
        ”created_at”: “2008-11-25 21:16:04″
    },
    ”record”: {
        ”id”: “419613″,
        ”name”: “test”
    }
}

== 获取记录列表

URL: /API/Record.List
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名ID错误
 5 域名不存在
 6 非域名所有者
 7 没有记录
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Get record list success</message>
  <created_at>2008-11-26 16:12:00</created_at>
 </status>
 <records>
  <record>
   <id>419613</id>
   <name>test</name>
   <line>2</line>
   <type>2</type>
   <ttl>3600</ttl>
   <value>www.dnspod.com.</value>
   <mx>0</mx>
   <enabled>1</enabled>
   <updated_on>2008-11-25 21:16:04</updated_on>
  </record>
  <record>
   <id>419616</id>
   <name>test1163078446</name>
   <line>1</line>
   <type>1</type>
   <ttl>3600</ttl>
   <value>127.0.0.1</value>
   <mx>0</mx>
   <enabled>1</enabled>
   <updated_on>2008-11-26 16:12:00</updated_on>
  </record>
 </records>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Get record list success.”,
        ”created_at”: “2008-11-25 21:18:26″
    },
    ”records”: {
        ”record”: [
            {
                "id": "419613",
                "name": "test",
                "line": "2",
                "type": "2",
                "ttl": "3600",
                "value": "www.dnspod.com.",
                "mx": "0",
                "enabled": "1",
                "updated_on": "2008-11-25 21:16:04"
            },
            {
                "id": "419614",
                "name": "test1815321701",
                "line": "1",
                "type": "1",
                "ttl": "3600",
                "value": "127.0.0.1",
                "mx": "0",
                "enabled": "1",
                "updated_on": "2008-11-25 21:18:26"
            }
        ]
    }
}

== 修改记录

URL: /API/Record.Modify
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
 record_id – 记录ID, 如 1234567
 sub_domain – 主机记录, 如 www
 record_type {1,2,3,4,5,6,7} – 记录类型, 1:A, 2:CNAME, 3:MX, 4:URL Redirect, 5:NS, 6:TXT, 7:AAAA
 record_line {1,2,3,4} – 线路类型, 1:通用, 2:电信, 3:网通, 4:教育网
 value – 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com.
 mx {1-20} – MX优先级, 当记录类型是 MX 时有效,范围1-20
 ttl {1-604800} – TTL,范围1-604800
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 域名ID错误
 5 域名不存在
 6 非域名所有者
 7 缺少参数或者参数错误
 8 主机记录错误
 9 记录值错误
 10 不能为@记录设置NS类型
 11 TTL 必须大于 1
 12 MX 必须大于 1
 12 记录重复或者和 CNAME 记录冲突
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Record updated success</message>
  <created_at>2008-11-26 16:16:09</created_at>
 </status>
 <record>
  <id>419615</id>
  <name>test308859996</name>
 </record>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Record updated success”,
        ”created_at”: “2008-11-25 21:19:25″
    },
    ”record”: {
        ”id”: 419614,
        ”name”: “test770079528″
    }
}

== 删除记录

URL: /API/Record.Remove
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
 record_id – 记录ID, 如 1234567
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 缺少参数或者参数错误
 5 域名不存在
 6 非域名所有者
 7 记录不存在
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Record deleted.</message>
  <created_at>2008-11-26 16:16:09</created_at>
 </status>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Record deleted.”,
        ”created_at”: “2008-11-25 21:19:25″
    }
}

== 设置记录状态

URL: /API/Record.Status
方法: POST
参数:
 login_email – 用户帐号
 login_password – 用户密码
 format {json,xml} – 返回的数据格式,支持json和xml.
 domain_id – 域名ID, 如 12345
 record_id – 记录ID, 如 1234567
 status {enable,disable} – 状态
响应代码:
 -1 登陆失败
 1 成功
 2 只允许POST方法
 3 未知错误
 4 缺少参数或者参数错误
 5 域名不存在
 6 非域名所有者
 7 记录不存在
返回数据参考:
XML
<?xml version=”1.0″ encoding=”UTF-8″?>
<dnspod>
 <status>
  <code>1</code>
  <message>Record status changed.</message>
  <created_at>2008-11-26 16:16:09</created_at>
 </status>
</dnspod>
JSON
{
    ”status”: {
        ”code”: “1″,
        ”message”: “Record status changed.”,
        ”created_at”: “2008-11-25 21:19:25″
    }
}
由网友整理出来的接口类:

<?php

class HTTP {

public $ch;
public $url;
public $param;
public $option;
private $method;

public function __construct($url, $method = ‘post’, $redirect = true) {

$this->url = $url;

$this->ch = curl_init ( $this->url );

if ($method == ‘post’) {
curl_setopt ( $this->ch, CURLOPT_POST, true );
} else {
curl_setopt ( $this->ch, CURLOPT_HTTPGET, true );
}

$this->method = $method;

curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, true );

if ($redirect) {
curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, true );
}
}

public function setOption($option) {

if (! empty ( $option )) {
$this->option = $option;
} else {
return false;
}

foreach ( $this->option as $k => $v ) {
curl_setopt ( $this->ch, $k, $v );
}

return true;
}

public function setParam($param) {
if (! empty ( $param )) {
$this->param = $param;
} else {
return false;
}

foreach ( $param as $k => $v ) {
$params [] = “$k=$v”;
}

$this->param = implode ( ‘&’, $params );

if ($this->method == ‘post’) {
curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $this->param );
} else {
curl_setopt ( $this->ch, CURLOPT_URL, $this->url . ‘?’ . $this->param );
}

return true;
}

public function exec() {
return curl_exec ( $this->ch );
}

public function __destruct() {
curl_close ( $this->ch );
}
}

class DnspodApi {

private $httpHandler;
private $email;
private $pass;
private $format = ‘json’;

private $error = array();

public function __construct($email, $pass) {
if (! $email || ! $pass) {
exit ( ‘no email or pass’ );
}
$this->email = $email;
$this->pass = $pass;
$this->httpHandler = new HTTP ( ‘http://www.dnspod.com/API/’ );
}

public function createDomain($domain){
$this->setAction(’Domain.Create’);
$params['domain'] = $domain;
return $this->exec($params);
}

public function removeDomain($domainId){
$this->setAction(’Domain.Remove’);
$params['domain_id'] = $domainId;
return $this->exec($params);
}

public function setDomainStatus($params){
$this->setAction(’Domain.Status’);
return $this->exec($params);
}

public function getDomainList() {
$this->setAction(’Domain.List’);
return $this->exec();
}

public function getRecordList($domainId){
$this->setAction(’Record.List’);
$params['domain_id'] = $domainId;
return $this->exec($params);
}

public function createRecord($params){
$this->setAction(’Record.Create’);
return $this->exec($params);
}

public function modifyRecord($params){
$this->setAction(’Record.Modify’);
return $this->exec($params);
}

public function removeRecord($params){
$this->setAction(’Record.Remove’);
return $this->exec($params);
}

public function setRecordStatus($params){
$this->setAction(’Record.Status’);
return $this->exec($params);
}

private function exec($params = ”){
$params['login_email'] = $this->email;
$params['login_password'] = $this->pass;
$params['format'] = $this->format;

$this->httpHandler->setParam($params);

$result = $this->httpHandler->exec ();

$result = json_decode ( $result ,true);

return $result;
}

private function setAction($action){
$this->httpHandler->setOption ( array (CURLOPT_URL => $this->httpHandler->url . $action ) );
}

private function error($result){
$this->error['code'] = $result->status->code;
$this->error['message'] = $result->status->message;
}

public function getError(){
return $this->error;
}
}
?>

查询结果返回一个数组

  • Share/Bookmark

Tags: , , , , , , , , , , , , , , , , , , , , ,