Showing posts with label web. Show all posts
Showing posts with label web. Show all posts

Monday, February 14, 2011

Linux配置Apache服务器全攻略

全文摘自 "特务的专栏":http://blog.csdn.net/cookies_6362/archive/2008/09/04/2881206.aspx

一,使用源代码安装

(1) 获得源代码

# lynx http://www.apache.org/dist/httpd/httpd-2_0_NN.tar.gz

NN表示当前所用的版本号。

(2) 解压缩

# gzip -d httpd-2_0_NN.tar.gz

# tar xvf httpd-2_0_NN.tar 

(3) 配置.

# ./configure --prefix= /usr/local/apache --enable-so

表示Apache将安装在/usr/local/apache目录下

(4) 编译与安装

# make

# make install

(5) 测试

# /usr/local/apache/bin/apachectl start

二,使用RPM包安装

# rpm —ivh apache-*.rpm

完成安装后,配置文件在/etc/httpd/conf/目录下,文件根目录为/var/www/html,工具文件在/etc/rc.d/init.d/目录下,日志文件在/var/log/httpd/目录下。

第三站 Apache 2.0的配置

Apache 2.0的主配置文件为httpd.conf。如果以上述源代码安装则配置文件保存在/usr/local/apache/conf/目录下,若以RPM包方式安装则配置文件保存在/etc/httpd/conf/目录下。我们可以直接修改httpd.conf文件也可以用redhat linux 9自带的图形化工具来配置。打开启动程序->系统设置->服务器设置->HTTP服务器,可以进行相关。主界面如图:

下面我们来看一下httpd.conf中的几条指令,“#”后加入了注释说明。

Port 80 #定义了web服务器的侦听端口,默认值为80,它是TCP网络端口之一。若写入多个端口,以最后一个为准。

User apache #一般情况下,以nobody用户和nobody组来运行web服务器,因为web

Group apache # 服务器发出的所有的进程都是以root用户身份运行的,存在安全风险。 

ServerAdmin root@localhost #指定服务器管理员的E-mail地址。服务器自动将错误报告到该地址。 

ServerRoot /etc/httpd #服务器的根目录,一般情况下,所有的配置文件在该目录下

ServerName new.host.name:80 #web客户搜索的主机名称

KeepAliveTimeout 15 #规定了连续请求之间等待15秒,若超过,则重新建立一条新的TCP连接 

MaxKeepAliveRequests 100 #永久连接的HTTP请求数

MaxClients 150 #同一时间连接到服务器上的客户机总数

ErrorLog logs/error_log #用来指定错误日志文件的名称和路径

PidFile run/httpd.pid #用来存放httpd进程号,以方便停止服务器。

Timeout 300 #设置请求超时时间,若网速较慢则应把值设大。

DocumentRoot /var/www/html #用来存放网页文件

第四站 Apache的管理


(1) 启动和停止Apache

/etc/rc.d/init.d/httpd start

/etc/rc.d/init.d/httpd stop

(2) Apache的日志文件

有人说判定一个管理员是否优秀之一就是看他是否是一个分析日志的能手,因为从日志文件中获取的反馈信息对管理员来说是相当重要的。Apache的日至文件主要包括访问日志和错误日志。访问日志记录了该服务器所有的请求的过程,主要记录的是客户的信息,通过它我们可以知道什么人访问了该网站,什么时候访问的,访问的内容是什么等等。错误日志则是记录了服务器出错的细节和如何处理等。日志文件的位置是由上述主配置文件httpd.conf来规定的。Redhat中有一个查看日志的工具——系统日志。其主界面如下

下面各举一个例子来说明他的格式:

错误日志的写法:

[Mon sep 22 14:32:52 2003] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

[Mon sep 22 14:32:52 2003] 错误发生的时间。

[error] 表示错误的级别。有debug,info,notice,warn,error,crit,alert,emerg,这些级别由低到高表示了错误的严重性。

[client 127.0.0.1] 表示客户端IP地址。

client denied by server configuration: /export/home/live/ap/htdocs/test 标是错误的具体信息。

访问日志的写法:

127.0.0.1 - wangdong [22/sep/2003:13:55:36 -0800] "GET /apache_pb.gif HTTP/1.0" 200 2326

127.0.0.1 表示访问这台服务器的客户端IP地址。

Wangdong 表示用户的登录名。

[22/sep/2003:13:55:36 -0800] 服务器完成客户端请求的时间,格式为[日/月/年:小时:分钟:秒 时区]

"GET /apache_pb.gif HTTP/1.0" 表示客户端访问该资源所使用的方法。

200 记录的是服务器返回给客户的状态码。200表示成功,以4打头的表示访问出错。

2326 表示发给客户端的总字节数。若是“—”表示没有找到访问资源。

但在实际应用中,对于大型网站,日志文件往往增长的很快,不利于我们查询,降低服务器的效率,而且占用大量的磁盘空间,所以我们必须对日志进行定期的维护。

既然日志文件很大,那么我们如何把一大堆枯燥的数据整理成容易让我们看懂的形式呢?有没有这样的工具呢?非常幸运,在redhat linux 9中自带了一个分析日志的工具——webalizer,如图:

我们也可以在网上找到大量这样优秀的免费的工具,例如:WebTrends Analysis Series。

第五站 配置虚拟主机

虚拟主机是在一台www服务器上为多个单独的域名提供www服务,每个域名具有自己的目录和配置,相当于将一台主机分为多台主机,虚拟主机技术对于主机数量不足,但又想为不同的用户提供独立的Web服务的需求非常有效。而对于一个公司,利用价格昂贵的服务器只提供一种域名服务,似乎是不明智的,而现在越来越多的公司喜欢在一台服务器上使用多个域名服务,架设不同的网站,这样做的好处是显而易见。

Apache有两种方式支持虚拟主机,一种是基于IP的虚拟主机,另一种是基于名字的虚拟主机。基于名字的虚拟主机使用相同的IP地址来配置不同的虚拟主机,这就弥补了因IP地址不足而带来的问题。基于名字的虚拟主机的配置相当简单,你只需配置你得DNS服务器使每个主机名对应正确的IP地址,然后再配置Apache HTTP Server使它能认识不同的主机名就可以了。

假设我们组建了一家多媒体制作公司,有一台Apache服务器和一个IP地址:192.168.0.1 要运行两种业务,一种为电子商务网站,域名为www.business.media.com ,另一种为教学网站,域名为www.teaching.media.com 。先在DNS服务器中把域名www.business.media.com和www.teachin....conf就可以了。

NameVirtualHost 192.168.0.1  


ServerName www.business.media.com

DocumentRoot /var/www/html/business


ServerName www.teaching.media.com

DocumentRoot /var/www/html/teaching


而基于IP的虚拟主机则要求使用不同的IP地址来区别不同的虚拟主机,这就要求使用多块网卡,把不同的IP地址捆绑到不同的网卡上,或者在一块网卡上捆绑多个IP地址。假设我们主机的IP地址为192.168.0.1(www.media.com),另外有两个IP地址别?..nf/httpd.conf。[/url]

ServerAdmin webmaster@ business.media.com

DocumentRoot /var/www/html/business

ServerName www.business.media.com

ErrorLog /var/www/html/business/logs/error_log

TransferLog /var/www/html/business/logs/access_log


ServerAdmin webmaster@teaching.media.com

DocumentRoot /var/www/html/teaching

ServerName www.teaching.media.com

ErrorLog /var/www/html/teaching/logs/error_log

TransferLog /var/www/html/teaching/logs/access_log

第六站配置Apache代理

代理服务器是网络信息服务的中转站。如果我们把Apache代理服务器形象地比喻成代理商的话,消费者向代理商购买东西时,如果代理商有的话,可直接卖给消费者,若没有,则代理商向厂家进货,再卖给消费者。这样做有以下几点好处:(1)提高了访问速度。(2)充当防火墙,增加了安全性。(3)可以过滤一些不良网站。(4)具有缓存功能。(5)节省IP开销。代理服务器可分为两种类型:客户端代理和服务器端代理。下面我们在讲解几个指令后举例说明各自的配置方法。

ProxyRequest On/Off #启用或者禁用Apache代理服务。

CacheRoot "/etc/httpd/proxy" #代理缓存的根目录。

CacheSize 5 #代理缓存的大小。

CacheGcInterval 4 #设定运行管理缓存的无用数据搜集程序的时间间隔

CacheMaxExpire 24 #文件过期时间。

CacheDefaultExpire 1 #指定未包含过期信息文件的有效期。

NoCache a-domain.com another-domain.edu #该网站的文件将不被缓存。
客户端代理的配置

(1) 修改/etc/httpd/conf/httpd.conf中的相关指令

(2) 修改/etc/httpd/conf/httpd.conf,添加对代理目录的访问控制。


Order deny,allow

Deny from all

Allow from .your-domain.com


(3) 重启httpd。
服务器端代理的配置

服务器端代理与客户端代理不同,它是在防火墙上安装Apache服务器,使用它提供对WWW服务器的代理访问。这种方法把WWW服务器与外部隔开,提高了安全性,而对用户来说,好像没有变化一样。假设在内部局域网中WWW服务器的IP地址为192.168.0.2,防火墙主机内部IP地址为192.168.0.5,外部IP地址为192.9.202.1。

(一) 配置防火墙上的Apache

(1) 在/etc/httpd/conf/httpd.conf中添加虚拟主机。


ServerAdmin webmaster@business.media.com

DocumentRoot /www/docs/business.media.com

ServerName www.business.media.com

ErrorLog logs/business.media.com-error_log

CustomLog logs/business.media.com-log_common


(2) 配置局域网中的DNS服务器,把www.business.media.com指向192.9.201.1。

xml数据库

xml via RDB
XML 数据以层次结构组织,元素可嵌套、可递归、可有序访问。
使用xml标准的查询语言(如xpath)
RDB
数据存储在多个表中,行和列都是无序的,不支持递归元素。对XML的访问需要大量的表操作
使用SQL语言查询。

XMLDB 使用XML document 作为 (logical) storage 的基本单元 (就像RDB使用row作为基本单元); 不要求特定的物理存储模型 (可以用关系型/层次性/OO/任何其他私有存储模型)
Native XMLDB 存储 XML文档的策略有4种:
1. 用文本形式存储整个文档
2. 在文件系统中以"修改过的形式"存储整个文档
3. 把文档结构映射到数据库中
4. 把数据结构映射到数据库中
通常Native XMLDB 使用方法2/3, 而XML-enabled DB 一般用方法4

XMLDB 查询方法包括: Xpath; Xquery; 私有语言
XMLDB 修改方法: DOM/SAX 或 XML:db Xupdate
API: JAVA or C++

XMLDB2种用途:
1. 文档为中心: 用以描述书本、电子邮件等;面向人工处理;具有不规则结构,数据颗粒比较大。
2. 数据为中心,用作结构化数据的存储和交换,如时刻表,订货单;面向机器操作
XMLDB存储策略也分为:
1. 文档为中心: Native XML; 内容管理系统
2. 数据为中心, 如面向对象数据库的半结构化数据;

javascript

JavaScript 被设计用来向 HTML 页面添加交互行为。
通常被直接嵌入 HTML 页面, 是一种解释性语言.

HTML 的 <script> 标签用于把 JavaScript 插入 HTML 页面当中。
document.write 字段是标准的 JavaScript 命令,用来向页面写入输出。

<html>
<body>
<script type="text/javascript">
document.write("Hello World!");
</script>
</body>
</html>

可以通过src属性进行外部js文件调用
<script src="xxx.js">....</script>

当页面载入时,会自动执行位于 body 部分的 JavaScript。
当被显式调用时,位于 head 部分的 JavaScript 才会被执行。
将脚本编写为函数,在<head>中定义。

创建函数的语法:
function 函数名(var1,var2,...,varX)
{
代码...
}

Try...Catch 语句

try...catch 可以测试代码中的错误。try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。
语法:
try
{
//在此运行代码
}
catch(err)
{
//在此处理错误
}
throw 声明的作用是创建 exception(异常)。你可以把这个声明与 try...catch 声明配合使用,以达到控制程序流并产生精确错误消息的目的

只要页面中出现脚本错误,就会产生 onerror 事件。

如果需要利用 onerror 事件,就必须创建一个处理错误的函数。你可以把这个函数叫作 onerror 事件处理器 (onerror event handler)。这个事件处理器使用三个参数来调用:msg(错误消息)、url(发生错误的页面的 url)、line(发生错误的代码行)。
语法:
onerror=handleErrfunction handleErr(msg,url,l)
{
//Handle the error here
return true or false
}

RegExp 对象用于规定在文本中检索的内容。
RegExp 对象有 3 个方法:test()、exec() 以及 compile()。
test() 方法检索字符串中的指定值。返回值是 true 或 false。
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
compile() 既可以改变检索模式,也可以添加或删除第二个参数。

浏览器检测
javaScript 包含一个名为 Navigator 的对象,能够对访问者的浏览器类型及版本进行检测
var browser=navigator.appName
var b_version=navigator.appVersion

JavaScript 拥有若干内置的对象,比如 String、Date、Array 等等。除了这些对象,你还可以创建自己的对象Object()。
//创建一个对象的实例
personObj=new Object()
personObj.firstname="John"
//创建一个对象的模板& 使用模板创建对象实例: this 指向当前对象
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname
this.lastname=lastname
this.age=age
this.eyecolor=eyecolor
this.newlastname=newlastname
}
需要对对象的函数进行实际编写,e.g.:
function newlastname(new_lastname)
{
this.lastname=new_lastname
}


myFather=new person("John","Doe",50,"blue")
myMother.newlastname("Doe")。

Sunday, February 13, 2011

ajax & json

AJAX技术是由Jesse James Garrett于2005年2月在一篇文章中提出来,是Asynchronous JavaScript XML(异步JavaScript 和XML)的简称,Ajax提供与服务器异步通信的能力,一个最简单的应用是无需刷新整个页面而在网页中更新一部分数据。

设计的初衷是用传统的Web技术也能达到FLASH的效果。后来我在实践中发现,可以把JavaScript 和 XML 这两种传统的Web技术让来实现。

Google应该是AJAX最主要推动者,Google Map、Gmail都在应用AJAX,但是对Google最主要业务搜索来说,AJAX的支持并不好,因为搜索引擎主要是抓取静态的网页,而无法抓取态的AJAX技术。


Ajax包括:
XHTML和CSS
使用DOM(DocumentObjectModel,i.e.文档对象模型)作动态显示和交互
使用XML和XSLT做数据交互和操作
使用XMLHttpRequest进行异步数据接收
使用JavaScript将它们绑定在一起

一个Ajax交互从一个称为XMLHttpRequest的JavaScript对象开始。如同名字所暗示的,它允许一个客户端脚本来执行HTTP请求,并且将会解析一个XML格式的服务器响应。Ajax处理过程中的第一步是创建一个XMLHttpRequest实例。使用HTTP方法(GET或POST)来处理请求,并将目标URL设置到XMLHttpRequest对象上
在JavaWeb服务器上,到达的请求与任何其它HttpServletRequest一样。在解析请求参数后,servlet执行必需的应用逻辑,将响应序列化到XML中,并将它写回HttpServletResponse

JavaScript 代码完成非常基本的任务:
## 从 Web 表单中获取需要的数据。JavaScript 代码很容易从 HTML 表单中抽取数据并发送到服务器。
## 修改表单上的数据:更新表单也很简单,从设置字段值到迅速替换图像。
## 建立要连接的 URL; 打开到服务器的连接。
## 设置服务器在完成后要运行的函数。
## 发送请求。

XMLHttpRequest 几个方法和属性。
open():建立到服务器的新请求。
该方法有五个参数:
request-type:发送请求的类型。典型的值是 GET 或 POST,但也可以发送 HEAD 请求。
url:要连接的 URL。
asynch:如果希望使用异步连接则为 true,否则为 false。该参数是可选的,默认为 true。
username:如果需要身份验证,则可以在此指定用户名。该可选参数没有默认值。
password:如果需要身份验证,则可以在此指定口令。该可选参数没有默认值。

通常使用其中的前三个参数

send():向服务器发送请求。
abort():退出当前请求。
readyState:提供当前 HTML 的就绪状态。 onreadystatechange 属性允许指定一个回调函数。回调允许服务器反向调用 Web 页面中的代码
responseText:服务器返回的请求响应文本。
E.g.:
// --- html code, which calls callServer whenever the input box is changed ---
<form>
<p>City: <input type="text" name="city" id="city" size="25"
onChange="callServer();" /></p>
<p>State: <input type="text" name="state" id="state" size="25"
onChange="callServer();" /></p>
<p>Zip Code: <input type="text" name="zipCode" id="city" size="5" /></p>
</form>

// --- javascript ---
// --- create XMLHttpRequest on a browser (MSIE/opera/etc) ---
/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}


function callServer() {
// Get the city and state from the web form
var city = document.getElementById("city").value;
var state = document.getElementById("state").value;
// Only go on if there are values for both fields
if ((city == null) || (city == "")) return;
if ((state == null) || (state == "")) return;
// Build the URL to connect to
var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state);
// Open a connection to the server
xmlHttp.open("GET", url, true);
// Setup a function for the server to run when it's done
xmlHttp.onreadystatechange = updatePage; //-> call updatePage when response is received (i.e. onreadystatechange)
// Send the request
xmlHttp.send(null);
}

// --- process server's response
function updatePage() {
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
document.getElementById("zipCode").value = response;
}
}
// escape(): 它用于转义不能用明文正确发送的任何字符。比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符

其中, 下面的"true" 表明这是一个异步连接, 这时表单将不等待服务器响应,用户可以继续访问表单.
>> xmlHttp.open("GET", url, true);



JSON:
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。
JSON 用 hash结构 ({}包围的) 来定义一个数据, 用 [] 包围的多个数据来 定义一个数组.

用[index]来访问数组的某个元素,"."来访问数据的key, 如:
>> people.programmers[0].lastName
要把json数据转换为字符串
>> String newJSONtext = people.toJSONString();
利用 POST 请求发送 JSON 数据
>> var url = "organizePeople.php?timeStamp=" + new Date().getTime();
>> request.open("POST", url, true);
>> request.onreadystatechange = updatePage;
>> request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
>> request.send(people.toJSONString());
如果通过GET方法通过url直接发送JSON数据,需用escape(people.toJSONString()) 以避免url错误

在服务器上解释 JSON
在服务器端处理 JSON 基本上就需要两个步骤。
1. 针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。
2. 使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。

比如,假设为 PHP 使用的是 JSON-PHP 模板
require_once('JSON.php');
$json = new Services_JSON();
// accept POST data and decode it
$value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']);
// Now work with value as raw PHP