Archive for 十一月, 2006

mysql修改/etc/my.cnf内的max_connections
apache修改httpd.conf内的MaxClients
\r\n \r\n

\r\n

\r\n

<?php

/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )   Manual: http://scrīpts.incutio.com/httpclient/*/

class HttpClient {    // Request vars    var $host;    var $port;    var $path;    var $method;    var $postdata = \'\';    var $cookies = array();    var $referer;    var $accept = \'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*\';    var $accept_encoding = \'gzip\';    var $accept_language = \'en-us\';    var $user_agent = \'Incutio HttpClient v0.9\';    // Options    var $timeout = 20;    var $use_gzip = true;    var $persist_cookies = true;  // If true, received cookies are placed in the $this->cookies array ready for the next request                                  // Note: This currently ignores the cookie path (and time) completely. Time is not important,                                   //       but path could possibly lead to security problems.    var $persist_referers = true; // For each request, sends path of last request as referer    var $debug = false;    var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found    var $max_redirects = 5;    var $headers_only = false;    // If true, stops receiving once headers have been read.    // Basic authorization variables    var $username;    var $password;    // Response vars    var $status;    var $headers = array();    var $content = \'\';    var $errormsg;    // Tracker variables    var $redirect_count = 0;    var $cookie_host = \'\';    function HttpClient($host, $port=80) {        $this->host = $host;        $this->port = $port;    }    function get($path, $data = false) {        $this->path = $path;        $this->method = \'GET\';        if ($data) {            $this->path .= \'?\'.$this->buildQueryString($data);        }        return $this->doRequest();    }    function post($path, $data) {        $this->path = $path;        $this->method = \'POST\';        $this->postdata = $this->buildQueryString($data);    	return $this->doRequest();    }    function buildQueryString($data) {        $querystring = \'\';        if (is_array($data)) {            // Change data in to postable data    		foreach ($data as $key => $val) {    			if (is_array($val)) {    				foreach ($val as $val2) {    					$querystring .= urlencode($key).\'=\'.urlencode($val2).\'&\';    				}    			} else {    				$querystring .= urlencode($key).\'=\'.urlencode($val).\'&\';    			}    		}    		$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &    	} else {    	    $querystring = $data;    	}    	return $querystring;    }    function doRequest() {        // Performs the actual HTTP request, returning true or false depending on outcome		if (!$fp = @fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout)) {		    // Set error message            switch($errno) {				case -3:					$this->errormsg = \'Socket creation failed (-3)\';				case -4:					$this->errormsg = \'DNS lookup failure (-4)\';				case -5:					$this->errormsg = \'Connection refused or timed out (-5)\';				default:					$this->errormsg = \'Connection failed (\'.$errno.\')\';			    $this->errormsg .= \' \'.$errstr;			    $this->debug($this->errormsg);			}			return false;        }        socket_set_timeout($fp, $this->timeout);        $request = $this->buildRequest();        $this->debug(\'Request\', $request);        fwrite($fp, $request);    	// Reset all the variables that should not persist between requests    	$this->headers = array();    	$this->content = \'\';    	$this->errormsg = \'\';    	// Set a couple of flags    	$inHeaders = true;    	$atStart = true;    	// Now start reading back the response    	while (!feof($fp)) {    	    $line = fgets($fp, 4096);    	    if ($atStart) {    	        // Deal with first line of returned data    	        $atStart = false;    	        if (!preg_match(\'/HTTP\\/(\\\\d\\\\.\\\\d)\\\\s*(\\\\d+)\\\\s*(.*)/\', $line, $m)) {    	            $this->errormsg = \"Status code line invalid: \".htmlentities($line);    	            $this->debug($this->errormsg);    	            return false;    	        }    	        $http_version = $m[1]; // not used    	        $this->status = $m[2];    	        $status_string = $m[3]; // not used    	        $this->debug(trim($line));    	        continue;    	    }    	    if ($inHeaders) {    	        if (trim($line) == \'\') {    	            $inHeaders = false;    	            $this->debug(\'Received Headers\', $this->headers);    	            if ($this->headers_only) {    	                break; // Skip the rest of the input    	            }    	            continue;    	        }    	        if (!preg_match(\'/([^:]+):\\\\s*(.*)/\', $line, $m)) {    	            // Skip to the next header    	            continue;    	        }    	        $key = strtolower(trim($m[1]));    	        $val = trim($m[2]);    	        // Deal with the possibility of multiple headers of same name    	        if (isset($this->headers[$key])) {    	            if (is_array($this->headers[$key])) {    	                $this->headers[$key][] = $val;    	            } else {    	                $this->headers[$key] = array($this->headers[$key], $val);    	            }    	        } else {    	            $this->headers[$key] = $val;    	        }    	        continue;    	    }    	    // We\'re not in the headers, so append the line to the contents    	    $this->content .= $line;        }        fclose($fp);        // If data is compressed, uncompress it        if (isset($this->headers[\'content-encoding\']) && $this->headers[\'content-encoding\'] == \'gzip\') {            $this->debug(\'Content is gzip encoded, unzipping it\');            $this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php            $this->content = gzinflate($this->content);        }        // If $persist_cookies, deal with any cookies        if ($this->persist_cookies && isset($this->headers[\'set-cookie\']) && $this->host == $this->cookie_host) {            $cookies = $this->headers[\'set-cookie\'];            if (!is_array($cookies)) {                $cookies = array($cookies);            }            foreach ($cookies as $cookie) {                if (preg_match(\'/([^=]+)=([^;]+);/\', $cookie, $m)) {                    $this->cookies[$m[1]] = $m[2];                }            }            // Record domain of cookies for security reasons            $this->cookie_host = $this->host;        }        // If $persist_referers, set the referer ready for the next request        if ($this->persist_referers) {            $this->debug(\'Persisting referer: \'.$this->getRequestURL());            $this->referer = $this->getRequestURL();        }        // Finally, if handle_redirects and a redirect is sent, do that        if ($this->handle_redirects) {            if (++$this->redirect_count >= $this->max_redirects) {                $this->errormsg = \'Number of redirects exceeded maximum (\'.$this->max_redirects.\')\';                $this->debug($this->errormsg);                $this->redirect_count = 0;                return false;            }            $location = isset($this->headers[\'location\']) ? $this->headers[\'location\'] : \'\';            $uri = isset($this->headers[\'uri\']) ? $this->headers[\'uri\'] : \'\';            if ($location || $uri) {                $url = parse_url($location.$uri);                // This will FAIL if redirect is to a different site                return $this->get($url[\'path\']);            }        }        return true;    }    function buildRequest() {        $headers = array();        $headers[] = \"{$this->method} {$this->path} HTTP/1.0\"; // Using 1.1 leads to all manner of problems, such as \"chunked\" encoding        $headers[] = \"Host: {$this->host}\";        $headers[] = \"User-Agent: {$this->user_agent}\";        $headers[] = \"Accept: {$this->accept}\";        if ($this->use_gzip) {            $headers[] = \"Accept-encoding: {$this->accept_encoding}\";        }        $headers[] = \"Accept-language: {$this->accept_language}\";        if ($this->referer) {            $headers[] = \"Referer: {$this->referer}\";        }    	// Cookies    	if ($this->cookies) {    	    $cookie = \'Cookie: \';    	    foreach ($this->cookies as $key => $value) {    	        $cookie .= \"$key=$value; \";    	    }    	    $headers[] = $cookie;    	}    	// Basic authentication    	if ($this->username && $this->password) {    	    $headers[] = \'Authorization: BASIC \'.base64_encode($this->username.\':\'.$this->password);    	}    	// If this is a POST, set the content type and length    	if ($this->postdata) {    	    $headers[] = \'Content-Type: application/x-www-form-urlencoded\';    	    $headers[] = \'Content-Length: \'.strlen($this->postdata);    	}    	$request = implode(\"\\r\\n\", $headers).\"\\r\\n\\r\\n\".$this->postdata;    	return $request;    }    function getStatus() {        return $this->status;    }    function getContent() {        return $this->content;    }    function getHeaders() {        return $this->headers;    }    function getHeader($header) {        $header = strtolower($header);        if (isset($this->headers[$header])) {            return $this->headers[$header];        } else {            return false;        }    }    function getError() {        return $this->errormsg;    }    function getCookies() {        return $this->cookies;    }    function getRequestURL() {        $url = \'http://\'.$this->host;        if ($this->port != 80) {            $url .= \':\'.$this->port;        }                    $url .= $this->path;        return $url;    }    // Setter methods    function setUserAgent($string) {        $this->user_agent = $string;    }    function setAuthorization($username, $password) {        $this->username = $username;        $this->password = $password;    }    function setCookies($array) {        $this->cookies = $array;    }    // Option setting methods    function useGzip($boolean) {        $this->use_gzip = $boolean;    }    function setPersistCookies($boolean) {        $this->persist_cookies = $boolean;    }    function setPersistReferers($boolean) {        $this->persist_referers = $boolean;    }    function setHandleRedirects($boolean) {        $this->handle_redirects = $boolean;    }    function setMaxRedirects($num) {        $this->max_redirects = $num;    }    function setHeadersOnly($boolean) {        $this->headers_only = $boolean;    }    function setDebug($boolean) {        $this->debug = $boolean;    }    // \"Quick\" static methods    function quickGet($url) {        $bits = parse_url($url);        $host = $bits[\'host\'];        $port = isset($bits[\'port\']) ? $bits[\'port\'] : 80;        $path = isset($bits[\'path\']) ? $bits[\'path\'] : \'/\';        if (isset($bits[\'query\'])) {            $path .= \'?\'.$bits[\'query\'];        }        $client = new HttpClient($host, $port);        if (!$client->get($path)) {            return false;        } else {            return $client->getContent();        }    }    function quickPost($url, $data) {        $bits = parse_url($url);        $host = $bits[\'host\'];        $port = isset($bits[\'port\']) ? $bits[\'port\'] : 80;        $path = isset($bits[\'path\']) ? $bits[\'path\'] : \'/\';        $client = new HttpClient($host, $port);        if (!$client->post($path, $data)) {            return false;        } else {            return $client->getContent();        }    }    function debug($msg, $object = false) {        if ($this->debug) {            print \'<div style=\"border: 1px solid red; padding: 0.5em; margin: 0.5em;\"><strong>HttpClient Debug:</strong> \'.$msg;            if ($object) {                ob_start();        	    print_r($object);        	    $content = htmlentities(ob_get_contents());        	    ob_end_clean();        	    print \'<pre>\'.$content.\'</pre>\';        	}        	print \'</div>\';        }    }   }

?>

\r\n \r\n

\r\n \r\n

\r\n

本文简要介绍了十几个Apache 的配置技巧: \r\n

  1、如何设 置请求等待时间

\r\n

  在httpd.conf里面设置:

\r\n

  TimeOut n

\r\n

  其中n为整数,单位是秒。

\r\n

  设置这个TimeOut适用于三种情况:

\r\n

  2、如何接收一个get请求的总时间

\r\n

  接收一个post和put请求的TCP包之间的时间

\r\n

  TCP包传输中的响应(ack)时间间隔

\r\n

  3、如何使得apache监听在特定的端口

\r\n

  修改httpd.conf里面关于Listen的选项,例如:

\r\n

  Listen 8000

\r\n

  是使apache监听在8000端口

\r\n

  而如果要同时指定监听端口和监听地址,可以使用:

\r\n

  Listen 192.170.2.1:80
  Listen 192.170.2.5:8000

\r\n

  这样就使得apache同时监听在192.170.2.1的80端口和192.170.2.5的8000端口。

\r\n

  当然也可以在httpd.conf里面设置:

\r\n

  Port 80

\r\n

  这样来实现类似的效果。

\r\n

  4、如何设置apache的最大空闲进程数

\r\n

  修改httpd.conf,在里面设置:

\r\n

  MaxSpareServers n

\r\n

  其中n是一个整数。这样当空闲进程超过n的时候,apache主进程会杀掉多余的空闲进程而保持空闲进程在n,节省了系统资源。如果在一个apache非常繁忙的站点调节这个参数才是必要的,但是在任何时候把这个参数调到很大都不是一个好主意。

\r\n

  同时也可以设置:

\r\n

  MinSpareServers n

\r\n

  来限制最少空闲进程数目来加快反应速度。

\r\n

  5、apache如何设置启动时的子服务进程个数

\r\n

  在httpd.conf里面设置:

\r\n

  StartServers 5

\r\n

  这样启动apache后就有5个空闲子进程等待接受请求。

\r\n

  也可以参考MinSpareServers和MaxSpareServers设置。

\r\n

6、如何在apache中设置每个连接的最大请求数

\r\n

  在httpd.conf里面设置:

\r\n

  MaxKeepAliveRequests 100

\r\n

  这样就能保证在一个连接中,如果同时请求数达到100就不再响应这个连接的新请求,保证了系统资源不会被某个连接大量占用。但是在实际配置中要求尽量把这个数值调高来获得较高的系统性能。

\r\n

  7、如何在apache中设置session的持续时间

\r\n

  在apache1.2以上的版本中,可以在httpd.conf里面设置:

\r\n

  KeepAlive on
  KeepAliveTimeout 15

\r\n

  这样就能限制每个session的保持时间是15秒。session的使用可以使得很多请求都可以通过同一个tcp连接来发送,节约了网络资源和系统资源。

\r\n

  8、如何使得apache对客户端进行域名验证

\r\n

  可以在httpd.conf里面设置:

\r\n

  HostnameLookups on|off|double

\r\n

  如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。

\r\n

  如果为了安全,建议使用double;为了加快访问速度,建议使用off。

\r\n

  9、如何使得apache只监听在特定的ip

\r\n

  修改httpd.conf,在里面使用

\r\n

  BindAddress 192.168.0.1

\r\n

  这样就能使得apache只监听外界对192.168.0.1的http请求。如果使用:

\r\n

  BindAddress *

\r\n

  就表明apache监听所有网络接口上的http请求。

\r\n

  当然用防火墙也可以实现。

\r\n

10、apache中如何限制http请求的消息主体的大小

\r\n

  在httpd.conf里面设置:

\r\n

  LimitRequestBody n

\r\n

  n是整数,单位是byte。

\r\n

  cgi脚本一般把表单里面内容作为消息的主体提交给服务器处理,所以现在消息主体的大小在使用cgi的时候很有用。比如使用cgi来上传文件,如果有设置:

\r\n

  LimitRequestBody 102400

\r\n

  那么上传文件超过100k的时候就会报错。

\r\n

  11、如何修改apache的文档根目录

\r\n

  修改httpd.conf里面的DocumentRoot选项到指定的目录,比如:

\r\n

  DocumentRoot /www/htdocs

\r\n

  这样http://localhost/index.html就是对应/www/htdocs/index.html

\r\n

  12、如何修改apache的最大连接数

\r\n

  在httpd.conf中设置:

\r\n

  MaxClients n

\r\n

  n是整数,表示最大连接数,取值范围在1和256之间,如果要让apache支持更多的连接数,那么需要修改源码中的httpd.h文件,把定义的HARD_SERVER_LIMIT值改大然后再编译。

\r\n

  13、如何使每个用户有独立的cgi-bin目录

\r\n

  有两种可选择的方法:

\r\n

  (1)在Apache配置文件里面关于public_html的设置后面加入下面的属性:

\r\n

  scrīptAliasMatch ^/~([^/]*)/cgi-bin/(.*) /home/$1/cgi-bin/$2

\r\n

  (2)在Apache配置文件里面关于public_html的设置里面加入下面的属性:

\r\n

  <Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
    SetHandler cgi-scrīpt
  </Directory>

\r\n

14、如何调整Apache的最大进程数

\r\n

  Apache允许为请求开的最大进程数是256,MaxClients的限制是256.如果用户多了,用户就只能看到Waiting for\r\nreply….然后等到下一个可用进程的出现。这个最大数,是Apache的程序决定的–它的NT版可以有1024,但Unix版只有256,你可\r\n以在src/include/httpd.h中看到:

\r\n

  #ifndef HARD_SERVER_LIMIT
  #ifdef WIN32
  #define HARD_SERVER_LIMIT 1024
  #else
  #define HARD_SERVER_LIMIT 256
  #endif
  #endif

\r\n

  你可以把它调到1024,然后再编译你的系统。

\r\n

  15、如何屏蔽来自某个Internet地址的用户访问Apache服务器

\r\n

  可以使用deny和allow来限制访问,比如要禁止202.202.202.xx网络的用户访问:

\r\n

  <Directory /www/htdocs>
  order deny,allow
  deny from 202.202.202.0/24
  </Directory>

\r\n

  16、如何在日志里面记录apache浏览器和引用信息

\r\n

  你需要把mod_log_config编译到你的Apache服务器中,然后使用下面类似的配置:

\r\n

  CustomLog logs/access_log \”%h %l %u %t \”%r\” %s %b \”%{Referer}i\” \”%{User-Agent}i\”\”

\r\n

  17、如何修改Apache返回的头部信息

\r\n

  问题分析:当客户端连接到Apache服务器的时候,Apache一般会返回服务器版本、非缺省模块等信息,例如:

\r\n

  Server: Apache/1.3.26 (Unix) mod_perl/1.26

\r\n

  解决:

\r\n

  你可以在Apache的配置文件里面作如下设置让它返回的关于服务器的信息减少到最少:

\r\n

  ServerTokens Prod

\r\n

  注意:

\r\n

  这样设置以后Apache还会返回一定的服务器信息,比如:

\r\n

  Server: Apache

\r\n

  但是这个不会对服务器安全产生太多的影响,因为很多扫描软件是扫描的时候是不顾你服务器返回的头部信息的。你如果想把服务器返回的相关信息变成:

\r\n

  Server: It iS a nOnE-aPaCHe Server

\r\n

  那么你就要去修改源码了。

\r\n \r\n

\r\n

\r\n无线网卡安装过程如下:\r\n
\r\n首先下载“wl_apsta.o”文件。http://boredklink.googlepages.com/wl_apsta.o \r\n
\r\n然后:sudo apt-get install bcm43xx-fwcutter\r\n
\r\n再:sudo bcm43xx-fwcutter -w /lib/firmware/×××(这里请自己确认一下firmware\r\n
\r\n目录里面系统的目录名称) ~/Desktop/wl_apsta.o\r\n
\r\n最后,使用桌面上面的类似于网上邻居的快捷方式设置一下ssid,然后激活就可以了。
\r\n \r\n

\r\n

标准的网页可以用自带的 Firefox Mplayer 插件播放。

\r\n

非标准的网页可以试试用 FireFox 的 mediawrap 扩展

\r\n

打开这个地址
\r\nhttp://releases.mozilla.org/pub/mozilla.org/extensions/mediawrap/
\r\n点击里面的 .xpi ( 如 mediawrap-0.1.6.3-fx.xpi ),选 安装,
\r\n再重启 FireFox ,
\r\n重启 fireFox 后会出来 mediawrap 配置向导,
\r\n把里面的播放器都设置为 totem 或者 gmplayer 即可。

\r\n

\r\n \r\n

\r\n