今天早上更新ports,发现virtualbox已经进ports了。

之前是用进ports前的版本来安装了virtualbox,跑windows速度非常快。比qemu快10倍肯定是有的。

现在正式进ports了,而且virtualbox的版本还是virtualbox-2.2.51.r20457 。一会升级下。

在每次提交的时候写明提交的目的是一个很好的习惯,Subversion默认没有提供,但是可以通过钩子实现:

将下面的代码存为pre-commit.bat放到版本库的hooks目录下即可,当你不写日志提交的话就会报告错误。(如果你下载使用,需要修改SVN_BINDIR为你的Subversion安装的程序目录)

@echo off
set SVN_BINDIR=d:Subversionbin
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
%SVN_BINDIR%svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1


 查看全文

项目大的提交前使用svn test_all

SVN的常用操作

A.SVN包括的文件
svn
一个命令行式的客户端程序;
svnversion
报告本地工作副本状态(用当前档案的修订版本号表示)的程序;
svnadmin
用来创建、tweaking或者是修复仓库的工具;
svndumpfilter
A program for filtering Subversion repository dumpfile format streams.
mod_dav_svn
Apache 服务器的一个插件模块,用来使其他人可以通过网络访问这个仓库;
svnserve
一个定制的、独立的 Subversion 服务程序。可作为一个驻留进程运行或者是由 SSH 调用。是

使仓库可以被别人通过网络访问的另一种方法。

B.SVN的revision
7.revision
1)可以用--revision或-r来指定修订版关键字
关键字包括:
HEAD
BASE
COMMITTED
PREV
eg.$ svn diff --revision PREV:COMMITTED foo.c

2)可以指定修订版日期
eg.
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {2/17/02}
$ svn checkout --revision {"17 Feb"}
$ svn checkout --revision {"17 Feb 2002"}
$ svn checkout --revision {"17 Feb 2002 15:30"}
$ svn checkout --revision {"17 Feb 2002 15:30:12 GMT"}
$ svn checkout --revision {"10 days ago"}
$ svn checkout --revision {"last week"}
$ svn checkout --revision {"yesterday"}
$ svn log --revision {11/28/2002}

C.常用操作
1.创建仓库
$ svnadmin create /path/to/repos

2.导入数据到仓库中
$ svn import /tmp/project file:///path/to/repos -m "initial import"

3.check out数据
$ svn checkout file:///path/to/repos/trunk project

4.基本工作流程
更新工作副本 svn update
产生更改 svn add;svn delete;svn copy;svn move;
查看更改 svn status;svn diff;svn revert
合并其他人的改动 svn merge;svn resolved
提交改动 svn commit

6.使用 update 命令来请求 Subversion 更新本地工作副本
$ svn update

8.文件操作
需要让svn知道,所以使用svn的命令而不是系统的命令
svn copy
svn move
svn add
svn delete

10.查看改动
$ svn status stuff/fish.c
$ svn status --verbose //显示所有工作目录文件的信息

11.比较工作副本
svn diff //将你的副本与BASE进行比较
也可以这样:
$ svn diff > patchfile

12.恢复
svn revert //恢复成BASE

13.提交更改
使用svn commit命令,你需要提供一个记录信息。
$svn commit --message "my messages."
$svn commit --file logmsg

注意:如果你没有指定 --message 或 --file, 那么 Subversion 自动调用你的editor 。
前提是你设置了SVN_EDITOR或EDITOR环境变量。否则会报下面的错误:

svn: 没有一个 SVN_EDITOR,VISUAL 或 EDITOR 环境变数被设定,执行时期的设定中也没有 'editor-cmd' 选项

设置环境变量:在win环境下,可以设置SVN_EDITOR为%SystemRoot%system32notepad.exe

参考资料:
http://freebsd.sinica.edu.tw/~plasma/svnbook/book.html

http://www.freebsd.org/doc/zh_CN.GB2312/articles/remote-install/index.html

 远程安装freebsd,非常方便的一个方案。

加个链接。

作者:NetSeek  http://www.linuxtone.org (IT运维专家网|集群架构|性能调优)
欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.
首发时间: 2008-11-25     更新时间:2009-1-14

目 录
一、        Nginx 基础知识
二、        Nginx 安装及调试
三、        Nginx Rewrite
四、        Nginx Redirect
五、        Nginx 目录自动加斜线:
六、        Nginx Location
七、        Nginx expires
八、        Nginx 防盗链
九、        Nginx 访问控制
十、        Nginx日志处理
十一、     Nginx Cache
十二、     Nginx负载均衡
十三、       Nginx简单优化      
十四、        如何构建高性能的LEMP环境
十五、        Nginx服务监控
十六、        常见问题与错误处理.
十七、        相关资源下载

【前言】:
编写此技术指南在于推广普及NGINX在国内的使用,更方便的帮助大家了解和掌握NGINX的一些使用技巧。本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对网络上愿意分享的朋友们表示感谢和致意!欢迎大家和我一起丰富本技术指南提出更好的建议!请朋友们关注: http://www.linuxtone.org 技术分享社区! 互想学习共同进步!

一、 Nginx 基础知识
1、简介
   Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。
更多的请见官方wiki: http://wiki.codemongers.com/

2、 Nginx的优点
nginx做为HTTP服务器,有以下几项基本特性:
1)        处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
2)        无缓存的反向代理加速,简单的负载均衡和容错.
3)        FastCGI,简单的负载均衡和容错.
4)        模块化的结构。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
5)        支持SSL 和 TLS SNI

Nginx专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响 应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连 接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。
Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。
Nginx 代码质量非常高,代码很规范, 手法成熟, 模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。 Upstream为诸如reverse proxy, 与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个 filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收 完后端服务器的整个请求之前把压缩流转向客户端。
Nginx采用了一些os提供的最新特性如对sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提高了性能

二、 Nginx 安装及调试
1、Pcre 安装

  1. ./configure
  2.   make && make install
  3.   cd ../
复制代码

2.        nginx 编译安装

  1. ./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl
  2. make && make install
复制代码

更详细的模块定制与安装请参照官方wiki.

3、Nginx 配置文件测试:

  1. # /usr/local/nginx/sbin/nginx -t  //Debug 配置文件的关键命令需要重点撑握.

  2. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  3. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
复制代码

3、Nginx 启动:

  1. # /usr/local/nginx/sbin/nginx
复制代码

4、Nginx 配置文件修改重新加载:

  1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid
复制代码

`
三、Nginx Rewrite

1.  Nginx Rewrite 基本标记(flags)
last - 基本上都用这个Flag。
※相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break - 中止Rewirte,不再继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
      ※原有的url支持正则  重写的url不支持正则

2.  正则表达式匹配,其中:
    * ~         为区分大小写匹配
    * ~*       为不区分大小写匹配
    * !~和!~*   分别为区分大小写不匹配及不区分大小写不匹配

3. 文件及目录匹配,其中:
   * -f和!-f用来判断是否存在文件
    * -d和!-d用来判断是否存在目录
    * -e和!-e用来判断是否存在文件或目录
    * -x和!-x用来判断文件是否可执行


3.  Nginx 的一些可用的全局变量,可用做条件判断:

  1. $args
  2. $content_length
  3. $content_type
  4. $document_root
  5. $document_uri
  6. $host
  7. $http_user_agent
  8. $http_cookie
  9. $limit_rate
  10. $request_body_file
  11. $request_method
  12. $remote_addr
  13. $remote_port
  14. $remote_user
  15. $request_filename
  16. $request_uri
  17. $query_string
  18. $scheme
  19. $server_protocol
  20. $server_addr
  21. $server_name
  22. $server_port
  23. $uri
复制代码

四、 Nginx Redirect
将所有linuxtone.org与netseek.linuxtone.org域名全部自跳转到http://www.linuxtone.org

  1. server
  2. {
  3. listen 80;
  4. server_name linuxtone.org netseek.linuxtone.org;
  5. index index.html index.php;
  6. root /data/www/wwwroot;
  7. if ($host !~ "^www.linxtone.org$") {
  8. rewrite ^(.*) http://www.linuxtone.org$1 redirect;
  9. }
  10. ........................
  11. }
复制代码

五、 Nginx 目录自动加斜线:

  1. if (-d $request_filename){
  2.            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  3.      }
复制代码

六  Nginx Location

1.基本语法:[和上面rewrite正则匹配语法基本一致]
location [=|~|~*|^~] /uri/ { … }
    * ~  为区分大小写匹配
    * ~* 为不区分大小写匹配
    * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

示例1:
location = / {
# matches the query / only.
# 只匹配 / 查询。
}
匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配

示例2:
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

示例3:
location ~* .(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
}
# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。


七、 Nginx expires

1.根据文件类型expires

  1. # Add expires header for static content
  2. location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {
  3.     if (-f $request_filename) {
  4.        root /data/www/wwwroot/bbs;
  5.        expires      1d;
  6.        break;
  7.     }
  8. }
复制代码

2、根据判断某个目录

  1. # serve static files
  2. location ~ ^/(images|javascript|js|css|flash|media|static)/  {
  3. root    /data/www/wwwroot/down;
  4.         expires 30d;
  5.   }
复制代码

八、  Nginx 防盗链

1.        针对不同的文件类型

  1. #Preventing hot linking of images and other file types
  2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
  3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
  4. if ($invalid_referer) {
  5.       rewrite   ^/   ;
  6.      # return   403;
  7.       }
  8. }
复制代码

2.        针对不同的目录

  1. location /img/ {
  2.     root /data/www/wwwroot/bbs/img/;
  3.     valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
  4.     if ($invalid_referer) {
  5.                    rewrite  ^/  ;
  6.                    #return   403;
  7.     }
  8. }
复制代码

3.        同实现防盗链和expires的方法

  1. #Preventing hot linking of images and other file types
  2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
  3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
  4. if ($invalid_referer) {
  5.       rewrite   ^/   ;
  6.                      }
  7.      access_log off;
  8.      root /data/www/wwwroot/bbs;
  9. expires 1d;
  10.      break;
  11. }
复制代码

九、 Nginx 访问控制

1.        Nginx 身份证验证

  1. #cd /usr/local/nginx/conf
  2. #mkdir htpasswd
  3. /usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone
  4. #添加用户名为linuxtone
  5. New password:   (此处输入你的密码)
  6. Re-type new password:   (再次输入你的密码)
  7. Adding password for user
  8. http://count.linuxtone.org/tongji/data/index.html(目录存在/data/www/wwwroot/tongji/data/目录下)
  9. 将下段配置放到虚拟主机目录,当访问http://count.linuxtone/tongji/即提示要密验证:
  10. location ~ ^/(tongji)/  {
  11.                 root    /data/www/wwwroot/count;
  12.                         auth_basic              "LT-COUNT-TongJi";
  13.                         auth_basic_user_file  /usr/local/nginx/conf/htpasswd/tongji;
  14.                 }
复制代码

2.        Nginx 禁止访问某类型的文件.
如,Nginx下禁止访问*.txt文件,配置方法如下.

  1. location ~* .(txt|doc)$ {
  2.    if (-f $request_filename) {
  3.    root /data/www/wwwroot/linuxtone/test;
  4.    #rewrite …..可以重定向到某个URL
  5.    break;
  6.    }
  7. }
复制代码

方法2:

  1. location ~* .(txt|doc)${
  2.         root /data/www/wwwroot/linuxtone/test;
  3.         deny all;
  4. }
复制代码

实例:
禁止访问某个目录

  1. location ~ ^/(WEB-INF)/ {
  2.             deny all;
  3. }  
复制代码

3.        使用ngx_http_access_module限制ip访问

  1. location / {
  2.     deny    192.168.1.1;
  3.     allow   192.168.1.0/24;
  4.     allow   10.1.1.0/16;
  5.     deny    all;
  6. }
复制代码

详细参见wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

4.        Nginx 下载限制并发和速率

  1. limit_zone   linuxtone  $binary_remote_addr  10m;
  2. server
  3.        {
  4.                listen       80;
  5.                server_name  down.linuxotne.org;
  6.                index index.html index.htm index.php;
  7.                root   /data/www/wwwroot/down;
  8.                #Zone limit
  9.                location / {
  10.                    limit_conn   linuxtone  1;
  11.                    limit_rate  20k;
  12.                }
  13. ..........
  14.        }
复制代码

只允许客房端一个线程,每个线程20k.
【注】limit_zone   linuxtone  $binary_remote_addr  10m; 这个可以定义在主的


5.        Nginx 实现Apache一样目录列表

  1. location  /  {
  2.     autoindex  on;
  3. }
复制代码

6.        上文件大小限制
主配置文件里加入如下,具体大小根据你自己的业务做调整。
client_max_body_size 10m;                                                         

十、        Nginx 日志处理

1.Nginx 日志切割
#contab -e
59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1
[root@count ~]# cat /usr/local/sbin/logcron.sh

  1. #!/bin/bash
  2. log_dir="/data/logs"
  3. time=`date +%Y%m%d`  
  4. /bin/mv  ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
  5. kill -USR1 `cat  /var/run/nginx.pid`
复制代码

更多的日志分析与处理就关注(同时欢迎你参加讨论):http://bbs.linuxtone.org/forum-8-1.html

2.利用AWSTATS分析NGINX日志
  设置好Nginx日志格式,仍后利用awstats进行分析.
请参考: http://bbs.linuxtone.org/thread-56-1-1.html

3.        Nginx 如何不记录部分日志
日志太多,每天好几个G,少记录一些,下面的配置写到server{}段中就可以了
location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
     access_log off;
}

十一、Nginx Cache服务配置

如果需要将文件缓存到本地,则需要增加如下几个子参数

  1. proxy_store on;
  2. proxy_store_access user:rw group:rw all:rw;
  3. proxy_temp_path 缓存目录;
复制代码

其中,
proxy_store on用来启用缓存到本地的功能,
proxy_temp_path用来指定缓存在哪个目录下,如:proxy_temp_path html;

在经过上一步配置之后,虽然文件被缓存到了本地磁盘上,但每次请求仍会向远端拉取文件,为了避免去远端拉取文件,必须修改

  1. proxy_pass:
  2. if ( !-e $request_filename) {
  3.     proxy_pass  http://mysvr;
  4. }
复制代码

即改成有条件地去执行proxy_pass,这个条件就是当请求的文件在本地的proxy_temp_path指定的目录下不存在时,再向后端拉取。

   
更多更高级的应用可以研究ncache,详细请参照http://bbs.linuxtone.org 里ncache相关的贴子.

十二、Nginx 负载均衡
1. Nginx 负载均衡基础知识
nginx的upstream目前支持4种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url_hash(第三方)

2.        Nginx 负载均衡实例1

  1. upstream bbs.linuxtone.org {#定义负载均衡设备的Ip及设备状态
  2.     server 127.0.0.1:9090 down;
  3.     server 127.0.0.1:8080 weight=2;
  4.     server 127.0.0.1:6060;
  5.     server 127.0.0.1:7070 backup;
  6. }
复制代码

在需要使用负载均衡的server中增加
proxy_pass http://bbs.linuxtone.org/;

每个设备的状态设置为:
a)        down 表示单前的server暂时不参与负载
b)        weight 默认为1.weight越大,负载的权重就越大。
c)        max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
d)        fail_timeout:max_fails次失败后,暂停的时间。
e)        backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡


3.        Nginx 负载均衡实例 2
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效,也可以用作提高Squid缓存命中率.

简单的负载均等实例:
#vi nginx.conf  //nginx主配置文件核心配置

  1. ……….
  2. #loadblance my.linuxtone.org
  3.        upstream  my.linuxtone.org  {
  4.        ip_hash;
  5.        server   127.0.0.1:8080;
  6.        server   192.168.169.136:8080;
  7.        server   219.101.75.138:8080;
  8.        server   192.168.169.117;
  9.        server   192.168.169.118;
  10.        server   192.168.169.119;
  11.      }
  12. …………..
  13. include          vhosts/linuxtone_lb.conf;
  14. ………
  15. # vi proxy.conf
  16. proxy_redirect off;
  17. proxy_set_header Host $host;
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20. client_max_body_size 50m;
  21. client_body_buffer_size 256k;
  22. proxy_connect_timeout 30;
  23. proxy_send_timeout 30;
  24. proxy_read_timeout 60;

  25. proxy_buffer_size 4k;
  26. proxy_buffers 4 32k;
  27. proxy_busy_buffers_size 64k;
  28. proxy_temp_file_write_size 64k;
  29. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
  30. proxy_max_temp_file_size 128m;
  31. proxy_store on;
  32. proxy_store_access   user:rw  group:rw  all:r;
  33. #nginx cache               
  34. #client_body_temp_path  /data/nginx_cache/client_body 1 2;
  35. proxy_temp_path /data/nginx_cache/proxy_temp 1 2;
复制代码

#vi  linuxtone_lb.conf

  1. server
  2.     {
  3.         listen  80;
  4.         server_name my.linuxtone.org;
  5.         index index.php;
  6.         root /data/www/wwwroot/mylinuxtone;
  7.         if (-f $request_filename) {
  8.             break;
  9.            }
  10.         if (-f $request_filename/index.php) {
  11.           rewrite (.*) $1/index.php break;
  12.         }

  13.         error_page 403 http://my.linuxtone.org/member.php?m=user&a=login;
  14.         location / {
  15.            if ( !-e $request_filename) {
  16.                proxy_pass http://my.linuxtone.org;
  17.                break;
  18.            }
  19.            include /usr/local/nginx/conf/proxy.conf;
  20.         }
  21. }
复制代码



十三、Nginx简单优化


1.        减小nginx编译后的文件大小 (Reduce file size of nginx)
默认的nginx编译选项里居然是用debug模式(-g)的(debug模式会插入很多跟踪和ASSERT之类),编译以后一个nginx有好几兆。去掉nginx的debug模式编译,编译以后只有几百K
在 auto/cc/gcc,最后几行有:
# debug

  1. CFLAGS=”$CFLAGS -g”
复制代码

注释掉或删掉这几行,重新编译即可。

2.        修改Nginx的header伪装服务器
1)        修改nginx.h

  1. #vi nginx-0.7.30/src/core/nginx.h
  2. #define NGINX_VERSION      "1.8"
  3. #define NGINX_VER          "LTWS/" NGINX_VERSION

  4. #define NGINX_VAR          "NGINX"
  5. #define NGX_OLDPID_EXT     ".oldbin"
复制代码

2) 修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
将如下

  1. static char ngx_http_server_string[] = "Server: nginx" CRLF;
复制代码

修改为

  1. static char ngx_http_server_string[] = "Server: LTWS" CRLF;
复制代码

a)        修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
将如下:

  1. static u_char ngx_http_error_full_tail[] =
  2. "<hr><center>" NGINX_VER "</center>" CRLF
  3. "</body>" CRLF
  4. "</html>" CRLF
  5. ;
复制代码
  1. static u_char ngx_http_error_tail[] =
  2. "<hr><center>nginx</center>" CRLF
  3. "</body>" CRLF
  4. "</html>" CRLF
  5. ;
复制代码

修改为:

  1. static u_char ngx_http_error_full_tail[] =
  2. "<center> "NGINX_VER" </center>" CRLF
  3. "<hr><center>http://www.linuxtone.org</center>" CRLF
  4. "</body>" CRLF
  5. "</html>" CRLF
  6. ;


  7. static u_char ngx_http_error_tail[] =
  8. "<hr><center>LTWS</center>" CRLF
  9. "</body>" CRLF
  10. "</html>" CRLF
  11. ;
复制代码

修改后重新编译一下环境,
404错误的时候显示效果图(如果没有指定错误页的话):
404.png



利用curl命令查看服务器header
curl.png



3.为特定的CPU指定CPU类型编译优化.
默认nginx使用的GCC编译参数是-O
需要更加优化可以使用以下两个参数
--with-cc-opt='-O3'
--with-cpu-opt=opteron
使得编译针对特定CPU以及增加GCC的优化.
此方法仅对性能有所改善并不会有很大的性能提升,供朋友们参考.
CPUD类型确定: # cat /proc/cpuinfo | grep "model name"
编译优化参数参考:http://en.gentoo-wiki.com/wiki/Safe_Cflags
4.Tcmalloc优化Nginx 性能

  1. # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
  2. # tar zxvf libunwind-0.99-alpha.tar.gz
  3. # cd libunwind-0.99-alpha/
  4. # CFLAGS=-fPIC ./configure
  5. # make CFLAGS=-fPIC
  6. # make CFLAGS=-fPIC install
  7. # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
  8. # tar zxvf google-perftools-0.98.tar.gz
  9. # cd google-perftools-0.98/
  10. # ./configure
  11. # make && make install
  12. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
  13. # ldconfig
  14. # lsof -n | grep tcmalloc
复制代码

编译nginx 加载google_perftools_module:
./configure --with-google_perftools_module
在主配置文件加入nginx.conf 添加:
google_perftools_profiles /path/to/profile;

5.内核参数优化
# vi /etc/sysctl.conf   #在末尾增加以下内容:

  1. net.ipv4.tcp_fin_timeout = 30
  2. net.ipv4.tcp_keepalive_time = 300
  3. net.ipv4.tcp_syncookies = 1
  4. net.ipv4.tcp_tw_reuse = 1
  5. net.ipv4.tcp_tw_recycle = 1
  6. net.ipv4.ip_local_port_range = 5000 65000
复制代码

#使配置立即生效
/sbin/sysctl -p

十四、如何构建高性的LEMP
请参见: http://www.linuxtone.org/lemp/lemp.pdf
1、提供完整的配置脚本下载:http://www.linuxtone.org/lemp/scripts.tar.gz
2、提供NGINX常见配置范例含(虚拟主机,防盗链,Rewrite,访问控制,负载均衡
Discuz相关程序静态化及等等),你只要稍稍修改即可线上应用。 3、将原版的xcache替换成EA,并提供相关简单调优脚本及配置文件。
更多的及更新资料请关注: http://www.linuxtone.org

十五、Nginx监控
1、        RRDTOOL+Perl脚本画图监控
先安装好rrdtool ,关于rrdtool本文不作介绍,具体安装请参照linuxtone监控版块.
#cd /usr/local/sbnin
#wget http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt
#mv rrd_nginx.pl.txt rrd_nginx.pl
#chmod a+x rrd_nginx.pl

#vi rrd_nginx.pl   //配置脚本文件设置好路径
#!/usr/bin/perl
use RRDs;
use LWP::UserAgent;

# define location of rrdtool databases
my $rrd = '/data/www/wwwroot/nginx/rrd';
# define location of images
my $img = '/data/www/wwwroot/nginx/html';
# define your nginx stats URL
my $URL = "http://219.232.244.13/nginx_status";
…………
【注】根据自己具体的状况修改相应的路径.
#crontab –e //加入如下
* * * * * /usr/local/sbin/rrd_nginx.pl
重启crond后,通过配置nginx虚拟主机指到/data/www/wwwroot/nginx/html目录,通过crond自动执行perl脚本会生成很多图片.
http://xxx/connections-day.png即可看到服务器状态图。

2、        官方Nginx-rrd 监控服务(多虚拟主机)(推荐)
网址:http://www.nginx.eu/nginx-rrd.html
此解决方案其实是基于上述监控方案的一个改进和增强,同样先安装好rrdtool这个画图工具和相应的perl模块再做如下操作:
# yum install perl-HTML*
先建立好生成的库存和图片存放录

  1. #mkdir -p /data/www/wwwroot/nginx/{rrd,html}

  2. #cd /usr/local/sbin
  3. #wget http://www.nginx.eu/nginx-rrd/nginx-rrd-0.1.4.tgz
  4. #tar zxvf nginx-rrd-0.1.4.tgz
  5. #cd nginx-rrd-0.1.4
  6. #cd etc/
  7. #cp nginx-rrd.conf /etc
  8. #cd etc/cron.d
  9. #cp nginx-rrd.cron /etc/cron.d

  10. #cd /usr/local/src/nginx-rrd-0.1.4/html
  11. # cp index.php /data/www/wwwroot/nginx/html/

  12. #cd /usr/local/src/nginx-rrd-0.1.4/usr/sbin
  13. #cp * /usr/sbin/
复制代码

#vi /etc/nginx-rrd.conf

  1. #####################################################
  2. #
  3. # dir where rrd databases are stored
  4. RRD_DIR="/data/www/wwwroot/nginx/rrd";
  5. # dir where png images are presented
  6. WWW_DIR="/data/www/wwwroot/nginx/html";
  7. # process nice level
  8. NICE_LEVEL="-19";
  9. # bin dir
  10. BIN_DIR="/usr/sbin";
  11. # servers to test
  12. # server_utl;server_name
  13. SERVERS_URL="http://219.32.205.13/nginx_status;219.32.205.13  http://www.linuxtone.org/nginx_status;www.linuxtone.org""
复制代码

//根据你的具体情况做调整.
SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2
这种格式监控多虚拟主机连接状态:
重点启crond服务,仍后通过http://219.32.205.13/nginx/html/ 即可访问。配置过程很简单!

3、        CACTI模板监控Nginx
利用Nginx_status状态来画图实现CACTI监控
nginx编译时允许http_stub_status_module

# vi /usr/local/nginx/conf/nginx.conf

  1. location /nginx_status {
  2. stub_status on;
  3. access_log off;
  4. allow 192.168.1.37;
  5. deny all;
  6. }
复制代码
  1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

  2. # wget http://forums.cacti.net/download.php?id=12676
  3. # tar xvfz cacti-nginx.tar.gz
  4. # cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/
  5. # cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/
  6. # chmod 755 /data/cacti/scripts/get_nginx*
复制代码

检测插件

  1. # /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status
复制代码

在cacti管理面板导入
cacti_graph_template_nginx_clients_stat.xml
cacti_graph_template_nginx_sockets_stat.xml

十六、常见问题与错误处理
1、400 bad request错误的原因和解决办法
配置nginx.conf相关设置如下.
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
根据具体情况调整,一般适当调整值就可以。

2、Nginx 502 Bad Gateway错误
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设置:
large_client_header_buffers 4 32k;


3、Nginx出现的413 Request Entity Too Large错误
这个错误一般在上传文件的时候会出现,
编辑Nginx主配置文件Nginx.conf,找到http{}段,添加
client_max_body_size 10m; //设置多大根据自己的需求作调整.
如果运行php的话这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。
post_max_size = 10M
upload_max_filesize = 2M

4、解决504 Gateway Time-out(nginx)
遇到这个问题是在升级discuz论坛的时候遇到的
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K。
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
在nginx.conf里, 加入: fastcgi_buffers 8 128k
这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点,例如设置成60秒:send_timeout 60;
只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错, 但是也可能是由于其他的原因, 目前关于nginx的资料不是很多, 很多事情都需要长期的经验累计才有结果, 期待您的发现哈!

5、如何使用Nginx Proxy
朋友一台服务器运行tomcat 为8080端口,IP:192.168.1.2:8080,另一台机器IP:192.168.1.8. 朋友想通过访问http://192.168.1.8即可访问tomcat服务.配置如下:
在192.168.1.8的nginx.conf上配置如下:

  1. server {
  2. listen 80;
  3. server_name java.linuxtone.org
  4. location / {
  5. proxy_pass http://192.168.1.2:8080;
  6. include /usr/local/nginx/conf/proxy.conf;
  7. }
  8. }
复制代码

6、如何关闭Nginx的LOG
access_log /dev/null; error_log /dev/null;

十七、相关资源下载

1.nginx配置示例及脚本下载:
# wget http://www.linuxtone.org/lemp/scripts.tar.gz #此脚本范例定期更新.
【附】:
文档定期更新,同时欢迎朋友多提宝贵意见,丰富nginx tips内容.
最新的文档发布.请朋友们关注: http://bbs.linuxtone.org

   正所谓“酒香也怕巷子深”,更何况我们区区草民不为人知的站点?那么,怎样才能让更多的人都知道你的站点呢?这就要靠自己的大力宣传来提高站点的知名度 了。而且如果你不把站点提交到各大搜索引擎中,它们一般是很难收录你的站点的,你可以先尝试一下看看能不能在百度搜到你的站点吧:
如果你搜不到的话说明你的站点还没有被百度收录,那么怎么才能被百度、Google等各大搜索引擎收录你的站点呢?
当然是申请免费登录到搜索引擎啦:
在你提交申请后,如果申请成功的话,大家就能够随时随地搜索到你了(百度最晚一个月可以找到你站点,因为百度的搜索是每隔36天更新一次)。被Google收录要快一些,只要你的站点还有些实际内容,它就会主动收录你的站点,还可能有一些你站点的下级页面。

说了这么多,怎么将自己的站点提交给搜索引擎呢?下面就是一些搜索引擎的提交地址,只要到下面页面填写一些简单的资料就行了:

百度:
http://www.baidu.com/search/url_submit.html

Google:
http://www.google.com/intl/zh-CN/add_url.html

搜狗:
http://db.sohu.com/regurl/regform.asp

TOM:
http://search.tom.com/tools/weblog/log.php

中搜:
http://d.zhongsou.com/NetSearch/pageurlrecord/frontpageurl.jsp

一搜:
http://www.yisou.com/search_submit.html?source=yisou_www_hp

爱问:
http://www.iask.com/guest/add_url.php

ALEXA:
http://pages.alexa.com/help/webmasters/index.html#crawl_site

北大天网:
http://www.infomall.cn/url_submit.html

博库:
http://ad001.ad086.com/Reg/User_Reg.asp

CNBlog:
http://www.cnblog.org/rings/submit.asp

提示:尽量保证在百度、Google中成功登录。因为这两个搜索引擎毕竟是现在最大的嘛。还有,搜狗的发展势头也不错,自然也不能忽视。

附(网站是如何被百度收录的)

你想知道如何被百度收录?首先你可以仔细看一下以下内容,看看你的网站是否符合百度的收录要求,如果百度机器人喜欢你的网站就一定会收录你,如果有不行的地方就要抓紧时间改正了:

百度给站长的建站指南:

如何使你的站点被百度有效收录

给每个网页加上与正文相关的标题。如果是网站首页,则标题建议使用站点名称或者站点代表的公司/机构名称;其余内容页面,标题建议做成正文内容的提炼和概括。这可以让你的潜在用户快速的访问到你的页面。

请不要在标题中堆积与正文无关的关键词。

确保每个页面都可以通过一个文本链接到达。百度无法识别Flash中的链接,这些单元上的链接所指向的网页,百度就无法收录了。

页面间的链接,尽量使用平实的超链,而不是重定向跳转。使用自动跳转的页面,可能会被百度丢弃。

尽量少使用frame和iframe框架结构。

如果是动态网页,请控制一下参数的数量和URL的长度。百度更偏好收录静态网页。

在同一个页面上,不要有过多链接。在那些站点地图类型的页面上,请把重要的内容给出链接,而不是所有细枝末节。链接太多,也可能会导致无法被百度收录。

什么样的站点会受到百度欢迎

站点应该是面向用户的,而不是面向搜索引擎的。一个受到用户欢迎的站点,最终也会受到搜索引擎欢迎;反过来,如果你的站点做了很多针对百度的优化,但却给用户带来大量负面体验,那么,你的站点最终可能还是会受到百度的冷落。

百度更喜欢有独特内容的网页,而不是简单抄袭和重复互联网上已有内容的网页。对于已经被重复了千百遍的内容,百度可能会不予收录。

请谨慎使用你的站点链接。与一些垃圾站点做友情链接,很可能会使你的网站受到负面影响。因此,当有人很热情的要求你为他的站点提供友情链接时,请审视以下两点:

一,对方的站点在他那个领域是否是高质量的?站长间所谓的流量以及排名,很多都是用欺骗手段获取的,无法保持长久。

二,对方要求的链接名称是否和对方网站地位相称?用一个涵盖范围广泛的关键词来做一个内容非常局限的网站的链接名称,很可能会使你的网站受到负面影响。

经常保持内容更新。经常有新内容产生的站点,百度是会注意到,并且大力欢迎,而且会频繁造访。

返回页首

网站登录问题

我的网站更新了,可是百度收录的内容还没更新怎么办?

答:百度会定期自动更新所有网页(包括去掉死链接,更新域名变化,更新内容变化)。因此请耐心等一段时间,你的网站上的变化就会被百度察觉并修正。

怎样使我的网站被百度收录?

答:百度免费自动收录你的站点。如果你希望百度尽快收录,可以到网站登录提交你的网址;只需提交网站首页,内部页面百度会自动抓取。

从提交到被收录,大约需要多久?

答:通常需要1-4周时间。

我不想让百度收录我的站点,该怎么办?

答:百度尊重和遵守robots协议,你可以写一个robots文件限制你的网站全部或部分不被百度收录。详情参见禁止搜索引擎收录的办法。

我的站点为什么在百度中搜不到?

答:可能的原因如下:

你可能还没向百度提交你的网站;

你已经登录了网站,但由于时间短,百度还未收录;

如果百度检测到你的网站死掉,你的站点就有可能被百度暂时删除;

如果你的网站内容有不符合中国法律的地方,则无法被百度收录;

如果你的站点页面结构复杂,则可能无法被百度收录(详见如何使你的站点被百度有效收录);

如果你的网站被百度判别为垃圾站点,则可能被百度拒绝收录或者随时删除(详见百度关于垃圾网站的处理)。

百度并不允诺能收录所有站点。如果有上述回答无法说明的问题,也可以发信到webmaster@baidu.com询问。

我的站点在百度搜索结果中排名下降了,该怎么办?

答:排序变动很正常。一般情况下,只要你不断提高网站内容质量,让更多的用户喜欢你的网站,成为你的忠实用户,你的网站在百度的排名一般就不会很差。

返回页首

百度关于垃圾网站的处理

如果你的站点中的网页,做了很多针对搜索引擎而非用户的处理,使得:用户从搜索结果中看到的内容与页面实际内容完全不同,或者站点质量与站点在搜索结果中的排名极不相称,从而导致用户产生受欺骗感觉,那么,你的网站就有可能被百度丢弃。

如果你的站点上的网页,大量都是复制自互联网上的高度重复性的内容,那么,你的站点也有可能被百度丢弃。

所以,当你的网站从百度消失,请先审视一下自己的站点有无问题。有任何意见,也可以反馈到webmaster@baidu.com

您也可以向百度投诉搜索中遇到的垃圾网站或者网页,帮助百度保持搜索结果的质量.

---------------------------------------------------------------------------------

根据我的观察,百度的收录不是按天算的,而是按小时算的,最近几天,我的站每天都要光顾几次,那是为什么呢?其实很简单,方法是:

  1、天天更新你的网站。记得要每天坚持更新,不能三天打鱼两天晒网,一定要勤更新,我的站每天晚上十二点以后更新20多条数据,早上就能收录一点,再加上下午收录一点,晚上收录一点,差不多一天更新的数就收录完了。

  2、创新。也就是说不要采集或做和别人一样的内容,要懂得创新,你想想看,如果你的内容和别人的内容都一样,那你让百度收录谁的?百度即使把所有内容相同的站都收录,那么你的站也不会排在前面,给你放到最后一页,还是没人去看有什么用?所以要懂得创新。

  3、增加外链。至于如何增加外链这里就不说了,相信很多朋友也都知道。


--------------------------------------------------------------------------------

首先是关键词的选取:

选择关键词,要避开激烈的竞争,如何看关键词的竞争程度呢?分析首页排名靠前的站,是否有超越的把握。一般来说搜索量还算可以的关键词,这种词竞争 激烈程度较低,而搜索量高的关键词,竞争比较激烈,比如万优网,关键词选的是网站制作,而不是网站建设,这个相当关键,因为相对来说,网站建设是热门关键 词.

其次要选择一个顶级域名:

域名能包含关键词最好,同时要简单好记,简短有利于记忆,不要刻意考虑关键词的密度,适当就好.一个新建的网站关键词密度一般控制在5%左右时比较好的,中间可以不断调整,直到达到了无SEO的痕迹。

再次是网站标题的写法:

网页标题用比较安全的风格,比如万优网,虚拟主机,域名注册,网站制作之类的会比较好一点,同时要注意控制标题的长度和密度.

最后是网站权重的构建:

建网站第一个目标是被收录,如果你有百度频繁光顾的站,加几个外部链接,一般一两天就收录了。新站在考核期内,一般只收录首页,收录成功之后我们要耐心地构建外链,每天导入一些带链接的文章。

做到以上几点,就耐心地等待吧,收录以后,同时注意观察统计的关键词来路,慢慢调整标题的写法。同时要注意网站更新,搜索引擎只喜欢有新鲜内容的网站.


1. /proc/partitions

对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions,而对于kernel 2.6, 数据主要来自/proc/diskstats或者/sys/block/[block-device-name]/stat。

先看看 /proc/partitions 中有些什么。

# cat /proc/partitions
major minor #blocks name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq

3 0 19535040 hda 12524 31127 344371 344360 12941 25534 308434 1097290 -1 15800720 28214662
3 1 7172991 hda1 13 71 168 140 0 0 0 0 0 140 140
3 2 1 hda2 0 0 0 0 0 0 0 0 0 0 0
3 5 5116671 hda5 100 477 665 620 1 1 2 30 0 610 650
3 6 265041 hda6 518 92 4616 2770 257 3375 29056 143880 0 46520 146650
3 7 6980211 hda7 11889 30475 338890 340740 12683 22158 279376 953380 0 509350 1294120

major: 主设备号。3 代表 hda。
minor: 次设备号。7 代表 No.7 分区。
#blocks: 设备总块数 (1024 bytes/block)。19535040*1024 => 20003880960(bytes) ~2G
name: 设备名称。如 hda7。

rio: 完成的读 I/O 设备总次数。指真正向 I/O 设备发起并完成的读操作数目,
也就是那些放到 I/O 队列中的读请求。注意很多进程发起的读操作
(read())很可能会和其他的操作进行 merge,不一定每个 read() 调用
都引起一个 I/O 请求。
rmerge: 进行了 merge 的读操作数目。
rsect: 读扇区总数 (512 bytes/sector)

ruse: 从进入读队列到读操作完成的时间累积 (毫秒)。上面的例子显示从开机
开始,读 hda7 操作共用了约340秒。

wio: 完成的写 I/O 设备总次数。
wmerge: 进行了 merge 的写操作数目。
wsect: 写扇区总数
wuse: 从进入写队列到写操作完成的时间累积 (毫秒)

running: 已进入 I/O 请求队列,等待进行设备操作的请求总数。上面的例子显
示 hda7 上的请求队列长度为 0。

use: 扣除重叠等待时间的净等待时间 (毫秒)。一般比 (ruse+wuse) 要小。比
如 5 个读请求同时等待了 1 毫秒,那么 ruse值为5ms, 而 use值为
1ms。use 也可以理解为I/O队列处于不为空状态的总时间。hda7 的I/O
队列非空时间为 509 秒,约合8分半钟。

aveq: 在队列中总的等待时间累积 (毫秒) (约等于ruse+wuse)。为什么是“约等于”而不是等于呢?让我们看看aveq, ruse, wuse的计算方式,这些量一般是在I/O完成后进行更新的:
  aveq += in-flight * (now - disk->stamp);
  ruse += jiffies - req->start_time; // 如果是读操作的话
  wuse += jiffies - req->start_time;  // 如果是写操作的话
注意aveq计算中的in-flight,这是当前还在队列中的I/O请求数目。这些I/O还没有完成,所以不能计算到ruse或wuse中。理论上,只有在I/O全部完成后,aveq才会等于ruse+wuse。举一个例子,假设初始时队列中有三个读请求,每个请求需要1秒钟完成。在1.5秒这一时刻, aveq和ruse各是多少呢?
  ruse = 1 // 因为此时只有一个请求完成
  aveq = 3*1 + 2*0.5 = 4 // 因为第二个请求刚发出0.5秒钟,另还有一个请求在队列中呢。
                                   // 这样第一秒钟时刻有3个in-flight,而1.5秒时刻有2个in-flight.
如果三个请求全部完成后,ruse才和aveq相等:
  ruse = 1 + 2 + 3 = 6
  aveq = 1 + 2 + 3 = 6
详细说明请参考 linux/drivers/block/ll_rw_blk.c中的end_that_request_last()和disk_round_stats()函数。

2. iostat 结果解析

# iostat -x
Linux 2.4.21-9.30AX (localhost) 2004年07月14日

avg-cpu: %user %nice %sys %idle
3.85 0.00 0.95 95.20

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/hda 1.70 1.70 0.82 0.82 19.88 20.22 9.94 10.11 24.50 11.83 57.81 610.76 99.96
/dev/hda1 0.00 0.00 0.00 0.00 0.01 0.00 0.00 0.00 12.92 0.00 10.77 10.77 0.00
/dev/hda5 0.02 0.00 0.00 0.00 0.03 0.00 0.02 0.00 6.60 0.00 6.44 6.04 0.00
/dev/hda6 0.01 0.38 0.05 0.03 0.43 3.25 0.21 1.62 46.90 0.15 193.96 52.25 0.41
/dev/hda7 1.66 1.33 0.76 0.79 19.41 16.97 9.70 8.49 23.44 0.79 51.13 19.79 3.07

rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
即 delta(use)/s/1000 (因为use的单位为毫秒)

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),
svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多
也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及
I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明
I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用
得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑
更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是
按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

3. I/O 系统 vs. 超市排队

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当
是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人
购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队
排了。还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的
等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人
去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情
比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。

I/O 系统也和超市排队有很多类似之处:

r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例。

我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间。

4. 一个例子

# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s +
w/s = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。

平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上
78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是
同时发出的,那么平均等待时间可以这样计算:

平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数

应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+2/29 = 70ms,和
iostat 给出的 78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。

每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),
这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。

一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里
I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。
一天,女儿满腹牢骚地向父亲抱怨起生活的艰难。  父亲是一位著名的厨师。他平静地听完女儿的抱怨后,微微一笑,把女儿带进了厨房。父亲往三只同样大小的锅里倒进了一样多的水,然后将一根大大的胡萝卜放进了第一只锅里,将一个鸡蛋放进了第二只锅里,又将一把咖啡豆放进了第三只锅里,最后他把三只锅放到火力一样大的三个炉子上烧。
  女儿站在一边,疑惑地望着父亲,弄不清他的用意。
  20分钟后,父亲关掉了火,让女儿拿来两个盘子和一个杯子。父亲将煮好的胡萝卜和鸡蛋分别放进了两个盘子里,然后将咖啡豆煮出的咖啡倒进了杯子。他指着盘子和杯子问女儿:“孩子,说说看,你见到了什么?”
  女儿回答说:“还能有什么,当然是胡萝卜、鸡蛋和咖啡了。”
  父亲说:“你不妨碰碰它们,看看有什么变化。”
  女儿拿起一把叉子碰了碰胡萝卜,发现胡萝卜已经变得很软。她又拿起鸡蛋,感觉到了蛋壳的坚硬。她在桌子上把蛋壳敲破,仔细地用手摸了摸里面的蛋白。然后她又端起杯子,喝了一口里面的咖啡。做完这些以后,女儿开始回答父亲的问题:“这个盘子里是一根已经变得很软的胡萝卜;那个盘子里是一个壳很硬、蛋白也已经凝固了的鸡蛋;杯子里则是香味浓郁、口感很好的咖啡。”说完,她不解地问父亲,“亲爱的爸爸,您为什么要问我这么简单的问题?”
  父亲严肃地看着女儿说:“你看见的这三样东西是在一样大的锅里、一样多的水里、一样大的火上和用一样多的时间煮过的。可它们的反应却迥然不同。胡萝卜生的时候是硬的,煮完后却变得那么软,甚至都快烂了;生鸡蛋是那样的脆弱,蛋壳一碰就会碎,可是煮过后连蛋白都变硬了;咖啡豆没煮之前也是很硬的,虽然煮了一会儿就变软了,但它的香气和味道却溶进水里变成了可口的咖啡。”
  父亲说完之后接着问女儿:“你像它们之中的哪一个?”
  现在,女儿更是有些摸不着头脑了,只是怔怔地看着父亲,不知如何回答。
  父亲接着说:“我想问你的是,面对生活的煎熬,你是像胡萝卜那样变得软弱无力还是像鸡蛋那样变硬变强,亦或像一把咖啡豆,身受损而不堕其志,无论环境多么恶劣,都向四周散发出香气、用美好的感情感染周围所有的人?简而言之,你应该成为生活道路上的强者,让你自己和周围的一切变得更好、更漂亮、更有意义。 ”

 

1、有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

2、以为蒙上了眼睛,就可以看不见这个世界;以为捂住了耳朵,就可以听不到所有的烦恼;以为脚步停了下来,心就可以不再远行;以为我需要的爱情,只是一个拥抱。


3、那些已经犯过的错误,有一些是因为来不及,有一些是因为刻意躲避,更多的时候是茫然地站到了一边。我们就这样错了一次又一次,却从不晓得从中汲取教训,做一些反省。

4、你不知道我在想你,是因为你不爱我,我明明知道你不想我,却还爱你,是因为我太傻。也许有时候,逃避不是因为害怕去面对什么,而是在等待什么。

5、天空没有翅膀的痕迹,但鸟儿已经飞过;心里没有被刀子割过,但疼痛却那么清晰。这些胸口里最柔软的地方,被爱人伤害过的伤口,远比那些肢体所受的伤害来得犀利,而且只有时间,才能够治愈。

6、很多人,因为寂寞而错爱了一人,但更多的人,因为错爱一人,而寂寞一生。我们可以彼此相爱,却注定了无法相守。不是我不够爱你,只是我不敢肯定,这爱,是不是最正确的。

7、如果背叛是一种勇气,那么接受背叛则需要一种更大的勇气。前者只需要有足够的勇敢就可以,又或许只是一时冲动,而后者考验的却是宽容的程度,绝非冲动那么简单,需要的唯有时间。

8、生命无法用来证明爱情,就像我们无法证明自己可以不再相信爱情。在这个城市里,诚如劳力士是物质的奢侈品,爱情则是精神上的奢侈品。可是生命脆弱无比,根本没办法承受那么多的奢侈。

9、人最大的困难是认识自己,最容易的也是认识自己。很多时候,我们认不清自己,只因为我们把自己放在了一个错误的位置,给了自己一个错觉。所以,不怕前路坎坷,只怕从一开始就走错了方向。

10、生活在一个城市里,或者爱一个人,又或者做某件事,时间久了,就会觉得厌倦,就会有一种想要逃离的冲动。也许不是厌倦了这个城市、爱的人、坚持的事,只是给不了自己坚持下去的勇气。

11、多少次又多少次,回忆把生活划成一个圈,而我们在原地转了无数次,无法解脱。总是希望回到最初相识的地点,如果能够再一次选择的话,以为可以爱得更单纯。

12、如果你明明知道这个故事的结局,你或者选择说出来,或者装作不知道,万不要欲言又止。有时候留给别人的伤害,选择沉默比选择坦白要痛多了。


${expression}一共有9种使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
上面4种可以用来进行缺省值的替换。
${#parameter}
上面这种可以获得字符串的长度。
${parameter%word} 最小限度从后面截取word
${parameter%%word} 最大限度从后面截取word
${parameter#word} 最小限度从前面截取word
${parameter##word} 最大限度从前面截取word
上面4个就是用来截取字符串的方法了。有了着四种用法就不必使用cut命令来截取字符串了。
在shell里面使用外部命令会降低shell的执行效率。特别是在循环的时候。

利用这个方法我简单的重写了以前用cut实现的cgi参数解析的shell

str=$QUERY_STRING
[ "${str%&}" = "$str" ] && str="$str&"
while [ -n "$str" ]; do
pair=${str%%&*}
var=${pair%=*}
val=${pair#*=}
str=${str#*&}
eval $(echo "PARM_$var"="$val")
done

  字符串的处理:
  1,截取
  方法一:
  echo $a|awk ’{print substr( ,1,8)}’
  substr是awk中的一个子函数,对第一个参数的进行截取,从第一个字符开始,共截取8个字符,如果不够就从第二个字符中补充
  方法二
  echo $a|cut -b2-8
  cut:对标准输入的字符串进行处理
  cut -bn-m:以byte为单位,从第n个byte开始,取m个
  cut -bn,m:以byte为单位,截取第n,m个byte
  cut -b-n,m:以byte为单位,截取1-n,和第m个
  -c:以charactor为单位
  -d:指定分隔符,默认为tab
  -s:使标准输入中没有delimeter
  cut -f1:截取第1个域
  方法三
  a=123456
  echo $
  方法四
  使用sed截取字符串的最后两位
  echo $test |sed ’s/(.*)(..)$//’
  截取字符串的前2位
  echo $test |sed ’s/^(..)(.*)//’
  2,比较
  好像没有什么可以比较的
  3,连接
  $a$b
  或者
  $string
  4,翻转
  方法一:
  使用rev命令
  方法二:
  编写脚本实现
  #!/usr/bin/awk -f
  ################################################################
  # Description : duplicate rev in awk
  ################################################################
  {
  revline = ""
  for (i=1;i<=length;i++)
  {
  revline = substr(,i,1) revline
  }
  }
  END{print revline}
  5,匹配
  grep
  egrep
  fgrep
  6,排序
  7,替换
  bash中:
  %x=abcdabcd
  %echo $ # 只替换一个
  bbcdabcd
  %echo $ # 替换所有
  bbcdbbcd
  sh中:
  ??
  如何替换/
  使用sed
  替换所有匹配
  echo $test |sed ’s/xx/yy’
  替换单个匹配
  ??
  8,得到字符串的长度:
  bash当中
  $
  或者
  expr "$VAR" : ’.*’
  9,判断字符串是否为数字
  10,得到字符串中某个字符的重复次数
  echo $a |tr "x" "n" |wc -l
  得到的结果需要减去1
  或者
  echo $a |awk -F"x" ’{print NF-1}’
  11,得到字符串中某个string的重复次数
  12,将一批文件中的所有string替换
  for i in file_list
  do
  vi $i <<-!
  :g/xxxx/s//XXXX/g
  :wq
  !
  done
  13,如何将字符串内每两个字符中间插入一个字符
  使用sed
  echo $test |sed ’s/../&[insert char]/g’
针对Apache2.0之前的版本,它原本是不支持的,不过可以通过添加第三方的module_gzip模块来启用
针对Apache2.0及之后的版本,Apache提供支持, 不过不叫gzip,而叫mod_deflate
下面就对Apache2.0及之后的版本作一个说明
1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#,
2) 添加LoadModule deflate_module modules/mod_deflate.so
3) 在VirtualHost中添加
1
<Location "/">
2         SetOutputFilter DEFLATE
3         BrowserMatch ^Mozilla/4 gzip-only-text/html
4         BrowserMatch ^Mozilla/4.0[678] no-gzip
5         BrowserMatch bMSIE !no-gzip !gzip-only-text/html
6         SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
7         Header append Vary User-Agent env=!dont-vary
8    </Location>
9

我这里面有一个完整的演示
1# 加载deflate模块
2LoadModule headers_module modules/mod_headers.so
3LoadModule deflate_module modules/mod_deflate.so
4<VirtualHost *:80>
5     DocumentRoot f:/apacheTest
6    <Location "/">
7         SetOutputFilter DEFLATE
8         BrowserMatch ^Mozilla/4 gzip-only-text/html
9         BrowserMatch ^Mozilla/4.0[678] no-gzip
10         BrowserMatch bMSIE !no-gzip !gzip-only-text/html
11         SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
12         Header append Vary User-Agent env=!dont-vary
13    </Location>
14</VirtualHost>

原来在使用mysql4版本时,mediawiki总是会在提交内容后,浏览时出现n换行字符。

一些该换行的地方没有换行,以至荒废wiki.isyi.com半年多了。

今天趁放假在家,将mediawiki安装在mysql5上,解决了这个问题。以后逐步使用上wiki来记录文档。

一、CGI概述

  CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、C语言等。但是用C语言编写的CGI程序具有执行速度快、安全性高(因为C语言程序是编译执行且不可被修改)等特点。

  CGI接口标准包括标准输入、环境变量、标准输出三部分。
  1.标准输入
  CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。POST方法是常用的方法,本文将以此方法为例,分析CGI程序设计的方法、过程和技巧。

  2.环境变量
操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI 程序传递一些重要的参数。CGI的GET方法还通过 环境变量QUERY-STRING向CGI程序传递Form中的数据。

  3.标准输出
  CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

  下面是一个简单的CGI程序,它将HTML中Form的信息直接输出到We b浏览器。
  # include <stdio.h>
  # include <stdib.h>
  main()
  {
  int i , n ;
  printf (″Content type: text/plainnn″);
  n=0;
  if(getenv(″CONTENT-LENGTH″))
  n=atoi(getenv(CONTENT-LENGTH″));
  for (i=0;i<n;i++)
  putchar(getchar());
  putchar (′n′);
  fflush(stdout);
  }


  下面对此程序作一下简要的分析。
  prinft (″Content type :text/plainnn″);
  此行通过标准输出将字符串″Content type :text/plainnn″传送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。请注意在这个 头信息中有两个新行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。
  if (getenv(″CONTENT-LENGTH″))
  n=atoi (getenv(″CONTENT-LENGTH″));
  此行首先检查环境变量CONTENT-LENGTH是否存在。Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web 服务器传送给CGI程序的输入中的字符数目,因此我们使用函数atoi() 将此环境变量的值转换成整数,并赋给变量n。请注意Web服务器并不以文件结束符来终止它的输出,所以如果不检查环境变量CONTENT- LENGTH,CGI程序就无法知道什么时候输入结束了。

  for (i=0;i<n;i++)
  putchar(getchar());
  此行从0循环到(CONTENT-LENGTH-1)次将标准输入中读到的每一个字符直接拷贝到标准输出,也就是将所有的输入以ASCII的形式回送给Web服务器。
  通过此例,我们可将CGI程序的一般工作过程总结为如下几点。
  1.通过检查环境变量CONTENT-LENGTH,确定有多少输入;
  2.循环使用getchar()或者其他文件读函数得到所有的输入;
  3.以相应的方法处理输入;
  4.通过″Contenttype:″头信息,将输出信息的格式告诉Web服务器;
  5.通过使用printf()或者putchar()或者其他的文件写函数,将输出传送给Web服务器。
  总之,CGI程序的主要任务就是从Web服务器得到输入信息,进行处理,然后将输出结果再送回给Web服务器。


二、环境变量

  环境变量是文本串(名字/值对),可以被OS Shell或其他程序设置 ,也可以被其他程序访问。它们是Web服务器传递数据给CGI程序的简单手段,之所以称为环境变量是因为它们是全局变量,任何程序都可以存取它们。

  下面是CGI程序设计中常常要用到的一些环境变量。
  HTTP-REFERER:调用该CGI程序的网页的URL。
  REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名。
  REQUEST-METHOD:指的是当Web服务器传递数据给CGI程序时所采用的方法,分为GET和POST两种方法。GET方法仅通过环境变量 (如QUERY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入传递数据给CGI程序,因此POST方法可较方便地传递较多 的数据给CGI程序。

  SCRIPT-NAME:该CGI程序的名称。
  QUERY-STRING:当使用POST方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序。
  CONTENT-TYPE:传递给CGI程序数据的MIME类型,通常为″applica tion/x-www-form-url encodede″,它是从HTML Form中以POST方法传递数据给CGI程序的数据编码类型,称为URL编码类型。
  CONTENT-LENGTH:传递给CGI程序的数据字符数(字节数)。
  在C语言程序中,要访向环境变量,可使用getenv()库函数。例如:
  if (getenv (″CONTENT-LENGTH″))
   n=atoi(getenv (″CONTENT-LENGTH″));
  请注意程序中最好调用两次getenv():第一次检查是否存在该环境变量,第二次再使用该环境变量。这是因为函数getenv()在给定的环境变量 名不存在时,返回一个NULL(空)指针,如果你不首先检查而直接引用它,当该环境变量不存在时会引起CGI程序崩溃。


三、From输入的分析和解码

  1.分析名字/值对
  当用户提交一个HTML Form时,Web浏览器首先对Form中的数据以名字/值对的形式进行编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。其格式如下:
  name1=value1&name2=value2&name3=value3&name4=value4&...
  其中名字是Form中定义的INPUT、SELECT或TEXTAREA等标置(Tag)名字,值是用户输入或选择的标置值。这种格式即为URL编 码,程序中需要对其进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对。这可以通过在输入流中查找下面的两个字符来 完成。
  每当找到字符=,标志着一个Form变量名字的结束;每当找到字符& ,标志着一个Form变量值的结束。请注意输入数据的最后一个变量的值不以&结束。
  一旦名字/值对分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符。这些特殊字符是:
  +:将+转换成空格符;
  %xx:用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。
  对Form变量名和变量值都要进行这种转换。下面是一个对Form数据进行分析并将结果回送给Web服务器的CGI程序。


  #include <stdio.h>
  #include <stdlib.h>
  #include <strings.h>
  int htoi(char *);
  main()
  {
   int i,n;
  char c;
  printf (″Contenttype: text/plainnn″);
  n=0;
  if (getenv(″CONTENT-LENGTH″))
   n=atoi(getenv(″CONTENT-LENGTH″));
  for (i=0; i<n;i++){
   int is-eq=0;
  c=getchar();
  switch (c){
   case ′&′:
    c=′n′;
    break;
   case ′+′:
    c=′ ′;
    break;
   case ′%′:{
    char s[3];
    s[0]=getchar();
    s[1]=getchar();
    s[2]=0;
    c=htoi(s);
    i+=2;
   }
   break;
  case ′=′:
   c=′:′;
   is-eq=1;
   break;
  };
  putchar(c);
  if (is-eq) putchar(′ ′);
  }
  putchar (′n′);
  fflush(stdout);
  }
  /* convert hex string to int */
  int htoi(char *s)
  {
   char *digits=″0123456789ABCDEF″;
  if (islower (s[0])) s[0]=toupper(s[0]);
  if (islower (s[1])) s[1]=toupper(s[1]);
  return 16 * (strchr(digits, s[0]) -strchr (digits,′0′)
)
  +(strchr(digits,s[1])-strchr(digits,′0′));
  }

  上面的程序首先输出一个MIME头信息给Web服务器,检查输入中的字符数,并循环检查每一个字符。当发现字符为&时,意味着一个名字/值对 的结束,程序输出一个空行;当发现字符为+时,将它转换成空格; 当发现字符为%时,意味着一个两字符的十六进制值的开始,调用htoi()函数将随后的两个字符转换为相应的ASCII字符;当发现字符为=时,意味着一 个名字/值对的名字部分的结束,并将它转换成字符:。最后将转换后的字符输出给Web服务器。


四、产生HTML输出

  CGI程序产生的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。我们已经看到怎样使用MIME头信息″Content type :text/plainnn″和printf()、put char()等函数调用来输 出纯ASCII文本给Web服务器。实际上,我们也可以使用MIME头信息″Content type :text/htmlnn″来输出HTML源代码给Web服务器。请注意任何MIME头信息后必须有一个空行。一旦发送这个MIME头信息给We b服务器后,Web浏览器将认为随后的文本输出为HTML源代码,在HTML源代码中可以使用任何HTML结构,如超链、图像、Form,及对其他CGI 程 序的调用。也就是说,我们可以在CGI程序中动态产生HTML源代码输出 ,下面是一个简单的例子。

  #include <stdio.h>
  #include <string.h>
  main()
  {
   printf(″Contenttype:text/htmlnn″);
  printf(″<html>n″);
  printf(″<head><title>An HTML Page From a CGI</title></h ead>n″);
  printf(″<body><br>n″);
  printf(″<h2> This is an HTML page generated from with i n a CGI program..   .</h2>n″);
  printf(″<hr><p>n″);
  printf(″<a href="../output.html#two"><b> Go back to out put.html page <
  /b></a>n″);
  printf(″</body>n″);
  printf(″</html>n″);
  fflush(stdout);
  }


  上面的CGI程序简单地用printf()函数来产生HTML源代码。请注意在输出的字符串中如果有双引号,在其前面必须有一个后斜字符, 这是因为整个HTML代码串已经在双引号内,所以HTML代码串中的双引号符必须用一个后斜字符来转义。


五、结束语

  本文详细分析了用C语言进行CGI程序设计的方法、过程和技巧。C语言的CGI程序虽然执行速度快、可靠性高,但是相对于Perl语言来说,C语言缺乏强有力的字符串处理能力,因此在实际应用中,应根据需 要和个人爱好来选择合适的CGI程序设计语言。

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。

新装的wine中文全是乱码,需要修改一下几个配置文件,找到一篇比较详细的配置说明,分享一下:
“ wine下中文的配置方案
步骤:
1. 初始设置
运行 winecfg,把模拟的 Windows 系统设置为 Windows XP 或者 Windows 2000。
2. 准备字体
为了让 Windows 应用程序看上去更美观,所以需要 Windows 下面的字体。
由于我已经将 simsun.ttc 复制到 /usr/share/fonts/windows/ 目录中了。所以我只需要在 ~/.wine/drive_c/windows/fonts/ 目录中为 simsun.ttc 创建一个符号连接:
cd ~/.wine/drive_c/windows/fonts
ln -s /usr/share/fonts/windows/simsun.ttc simsun.ttc
ln -s /usr/share/fonts/windows/simsun.ttc simfang.ttc
创建一个 simfang.ttc 是许多 Windows 应用默认使用 simfang.ttc 字体。
3. 修改 ~/.wine/system.reg
装好字体后,还要修改一下 Wine 的注册表设置,指定与字体相关的设置:
gedit ~/.wine/system.reg
(一定要使用 gedit 或其他支持 gb2312/utf8 编码的编辑器修改这些文件,否则文件中的中文可能变乱码)
搜索: LogPixels
找到的行应该是:[SystemCurrentControlSetHardware ProfilesCurrentSoftwareFonts]
将其中的:
"LogPixels"=dword:00000060
改为:
"LogPixels"=dword:00000070
搜索: FontSubstitutes
找到的行应该是:[SoftwareMicrosoftWindows NTCurrentVersionFontSubstitutes]
将其中的:
"MS Shell Dlg"="Tahoma"
"MS Shell Dlg 2″="Tahoma"
改为:
"MS Shell Dlg"="SimSun"
"MS Shell Dlg 2″="SimSun"
4. 修改 ~/.wine/drive_c/windows/win.ini
gedit ~/.wine/drive_c/windows/win.ini
在文件末尾加入:
[Desktop]
menufontsize=13
messagefontsize=13
statusfontsize=13
IconTitleSize=13
   5. 最关键的一步,网上很多文章中没有提到的一步──把下面的代码保存为zh.reg,然后终端执行regedit zh.reg。从Windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows /fonts里面。
      代码:
      REGEDIT4
      [HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionFontSubstitutes]
      "Arial"="simsun"
      "Arial CE,238"="simsun"
      "Arial CYR,204"="simsun"
      "Arial Greek,161"="simsun"
      "Arial TUR,162"="simsun"
      "Courier New"="simsun"
      "Courier New CE,238"="simsun"
      "Courier New CYR,204"="simsun"
      "Courier New Greek,161"="simsun"
      "Courier New TUR,162"="simsun"
      "FixedSys"="simsun"
      "Helv"="simsun"
      "Helvetica"="simsun"
      "MS Sans Serif"="simsun"
      "MS Shell Dlg"="simsun"
      "MS Shell Dlg 2"="simsun"
      "System"="simsun"
      "Tahoma"="simsun"
      "Times"="simsun"
      "Times New Roman CE,238"="simsun"
      "Times New Roman CYR,204"="simsun"
      "Times New Roman Greek,161"="simsun"
      "Times New Roman TUR,162"="simsun"
      "Tms Rmn"="simsun"

今天换了台X200,比之前所R61i要轻了很多,感觉很爽。呵呵

 拿到之后,第一时间换成FreeBSD系统。发现现在FreeBSD配置桌面越来越简单容易了。

这次选择了Xfce4.6,不安装gnome2了,因为gnome2太多相关软件包,而我又用不着。安装时费时,以后升级还麻烦,又占磁盘空间。

Xfce4.6,比以前的版本有进步了。

1 2 3 ... 35 36 37  下一篇»