user  www www;

#要开启的进程数
worker_processes 8;

error_log  /usr/local/nginx/logs/nginx_error.log  crit;

pid        /usr/local/nginx/nginx.pid;

#单进程打开的最大文件数
worker_rlimit_nofile 65535;

events
{
  #工作模式,还有select(标准方法)、poll(标准方法)、kqueue(高效的方法)、eventport(高效的方法)等,在linux下面,只有epoll是高效的方法
  use epoll;
  #连接数上限
  worker_connections 65535;
}

http
{
  include       mime.types;
  default_type  application/octet-stream;

  charset  utf-8;

  #服务器名字的哈希存储大小?
  server_names_hash_bucket_size 128;

  #设定请求缓冲。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;

  client_max_body_size 300m;#定义最大允许上传文件大小
 
  #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
  #对于普通应用,必须设为 on。
  #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络IO处理速度,降低系统 uptime。
  sendfile on;

  tcp_nopush     on;
  tcp_nodelay on;

  keepalive_timeout 60;#指定客户端保活超时时间
  client_body_buffer_size  512k;#指定客户端请求主体缓冲区大小

  #开启gzip模块
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  #后端服务器连接的超时时间_发起握手等候响应超时时间
  proxy_connect_timeout    5;
  #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
  proxy_read_timeout       60;
  #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
  proxy_send_timeout       5;
  #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
  proxy_buffer_size        16k;
  #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
  proxy_buffers            4 64k;
  #目前不知道
  proxy_busy_buffers_size 128k;
  #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
  proxy_temp_file_write_size 128k;
  #proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
  proxy_temp_path   /data0/proxy_temp_dir;
  #设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
  proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;
 
  #设置负载均衡服务器
  upstream backend_server {
    server   10.0.0.2:80 weight=1 max_fails=2 fail_timeout=30s;
    server   10.0.0.3:80 weight=1 max_fails=2 fail_timeout=30s;
    server   10.0.0.4:80 weight=1 max_fails=2 fail_timeout=30s;
  }

  #也可以用memcahce来做负载均衡
  upstream memcached1 {
        server 127.0.0.1:11211;
  }

  upstream memcached2 {
        server 192.168.0.63:11211;
  }

  server
  {
    #监听端口
    listen       80;
    #主域名
    server_name  www.domain.com;
    #默认首页
    index index.html index.htm index.php index.shtml;
    #网站根目录
    root  /data0/htdocs/www;

    location /
    {
         #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         #设置Web缓存区名称为cache_one
     proxy_cache cache_one;
         #对不同的HTTP状态码设置不同的缓存时间
         proxy_cache_valid  200 304 12h;
         #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
         proxy_cache_key $host$uri$is_args$args;
         #缓存过期时间
     expires      1d;
    }
    
    #用于清除缓存,假设一个URL为http://192.168.0.152/test.txt,通过访问http://192.168.0.152/purge/test.txt就可以清除该URL的缓存。
    location ~ /purge(/.*)
    {
     #设置只允许指定的IP或IP段才可以清除URL缓存。
     allow            127.0.0.1;
     allow            192.168.0.0/16;
     deny            all;
     proxy_cache_purge    cache_one   $host$1$is_args$args;
    }    

    #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
    location ~ .*\.(php|jsp|cgi)?$
    {
         proxy_set_header Host  $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     #设置被代理服务器的地址和被映射的URI
         proxy_pass http://backend_server;
    }

    access_log  off;
  }
}

posted @ 2011-05-10 12:39 小马歌 阅读(1512) | 评论 (0)编辑 收藏
 

一、介绍Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.
二、Location语法语法:location [=|~|~*|^~] /uri/ { … }
注:
1、~ 为区分大小写匹配
2、~* 为不区分大小写匹配
3、!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
示例一:
location / { }
匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
示例二:
location =/ {}
仅仅匹配/
示例三:
location ~* \.(gif|jpg|jpeg)$ {
rewrite \.(gif|jpg)$ /logo.png;

注:不区分大小写匹配任何以gif,jpg,jpeg结尾的文件
三、ReWrite语法
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
1、下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
2、下面是可以用作判断的全局变量
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
四、Redirect语法
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ “^star\.igrow\.cn$&quot [点击图片可在新窗口打开] {
rewrite ^(.*) http://star.igrow.cn$1 redirect;
}
}
五、防盗链location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
六、根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
七、禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}

作者: mysuim
来自:http://www.phpchina.com/html/70/t-162870.html

posted @ 2011-05-10 12:30 小马歌 阅读(420) | 评论 (0)编辑 收藏
 

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向
* permanent 返回301永久重定向

一些可用的全局变量有,可以用做条件判断(待补全)

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

举例:
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
view sourceprint?
1.if ($host ~* (.*)\.domain\.com) {
2. set $sub_name $1;
3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
4.}

参考:
http://wiki.codemongers.com/NginxChsHttpRewriteModule
http://www.romej.com/archives/515/nginx-rewrite-rules-for-wordpress-redux
http://info.codepub.com/2008/08/info-21590.html

来自:http://www.lostk.com/blog/nginx_rewrite_param/

posted @ 2011-05-10 12:29 小马歌 阅读(304) | 评论 (0)编辑 收藏
 

在 [mysqld]加入以下配置

slow_query_log=1
long_query_time=1
log_output=FILE  #开始支持TABLE
slow_query_log_file = /var/lib/mysql/slow.log
#log-queries-not-using-indexes

 

另外,还支持 set @@global.log_ouput的形式 进行热修改,修改完毕之后 通过@@global.log_ouput进行验证。

posted @ 2011-05-06 17:58 小马歌 阅读(260) | 评论 (0)编辑 收藏
 
关键字: lb

Nginx的优点:

          性能好,可以负载超过1万的并发。

          功能多,除了负载均衡,还能作Web服务器,而且可以通过Geo模块来实现流量分配。

          社区活跃,第三方补丁和模块很多

          支持gzip proxy

              缺点:

           不支持session保持。

           对后端realserver的健康检查功能效果不好。而且只支持通过端口来检测,不支持通过url来检测。

           nginx对big request header的支持不是很好,如果client_header_buffer_size 设置的比较小,就会返回400 bad request页面。

Haproxy的优点:

          它的优点正好可以补充nginx的缺点。支持session保持,同时支持通过获取指定的url来检测后端服务器的状态。

          支持tcp模式的负载均衡。比如可以给mysql的从服务器集群和邮件服务器做负载均衡。

              缺点:

          不支持虚拟主机(这个很傻啊)

          目前没有nagios和cacti的性能监控模板

LVS的优点:

           性能好,接近硬件设备的网络吞吐和连接负载能力。

           LVS的DR模式,支持通过广域网进行负载均衡。这个其他任何负载均衡软件目前都不具备。

              缺点:

           比较重型。另外社区不如nginx活跃。

posted @ 2011-04-26 15:07 小马歌 阅读(695) | 评论 (0)编辑 收藏
 
     摘要: Haproxy介绍及其定位    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。    HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计...  阅读全文
posted @ 2011-04-26 15:00 小马歌 阅读(2289) | 评论 (0)编辑 收藏
 
from:http://liuyu.blog.51cto.com/183345/166381

前言:
     由于服务器apache抗不住目前的并发.加上前端squid配置后,问题依然无法解决.而页面程序大部分是动态.无法使用fastcgi来处理.因此想使用nginx做为反向代理apache.整个配置安装过程很简单.在考虑高并发的情况下,在安装前就做了些优化.目前配置能抗住3000以上并发.好像不是特别大哦?呵~~ 但足以~~ 只是还有少量499问题..期待有人跟我讨论解决
 
第1部分:安装
1 建立用户及组
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www


2 安装pcre 让nginx支持rewrite 方便以后所需
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz
tar zxvf pcre-7.8.tar.gz
cd pcre-7.8/
./configure
make && make install


3 安装nginx
wget http://sysoev.ru/nginx/nginx-0.7.58.tar.gz
tar zxvf nginx-0.7.58.tar.gz
cd nginx-0.7.58/
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-cc-opt='-O2' --with-cpu-opt=opteron
make && make install


#注意上文中的--with-cc-opt='-O2' --with-cpu-opt=opteron 这是编译器优化,目前最常用的是-02 而不是3.后面对应CPU的型号,可参照:http://wiki.gentoo.tw/index.php/HOWTO_CFLAG

第2部分:配置及优化配置文件
1 nginx.conf 配置文件:
user    www www;
worker_processes 4;

# [ debug | info | notice | warn | error | crit ]
error_log    /usr/local/webserver/nginx/logs/nginx_error.log    crit;
pid                /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
         use epoll;
         worker_connections 51200;
}

http
{
         include             mime.types;
         default_type    application/octet-stream;
         source_charset GB2312;
         server_names_hash_bucket_size 256;
         client_header_buffer_size 256k;
         large_client_header_buffers 4 256k;

         #size limits
         client_max_body_size             50m;
         client_body_buffer_size        256k;
         client_header_timeout     3m;
         client_body_timeout 3m;
         send_timeout             3m;
#参数都有所调整.目的是解决代理过程中出现的一些502 499错误    
         sendfile on;
         tcp_nopush         on;
         keepalive_timeout 120; #参数加大,以解决做代理时502错误
         tcp_nodelay on;
        
         include                    vhosts/upstream.conf;
         include                    vhosts/bbs.linuxtone.conf;

}


2 upstream.conf 配置文件(这也是做负载的配置方法)
upstream.conf
            upstream bbs.linuxtone.com {
                 server 192.168.1.4:8099;
             }


3 站点配置文件
bbs.linuxtone.conf
server
     {
            listen             80;
            server_name    bbs.linuxtone.conf;
            charset GB2312;
            index index.html index.htm;
            root    /date/wwwroot/linuxtone/;

                location ~ ^/NginxStatus/ {
                        stub_status on;
                        access_log off;
                 }

         location / {
             root    /date/wwwroot/linuxtone/;
             proxy_redirect off ;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             client_max_body_size 50m;
             client_body_buffer_size 256k;
             proxy_connect_timeout 30;
             proxy_send_timeout 30;
             proxy_read_timeout 60;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
             proxy_max_temp_file_size 128m;
             proxy_pass    http://bbs.linuxtone.com;
            }


#参数都有所调整.目的是解决代理过程中出现的一些502 499错误   
#Add expires header for static content
     location ~* \.(jpg|jpeg|gif|png|swf)$ {
         if (-f $request_filename) {
             root /date/wwwroot/linuxtone/;
             expires            1d;
             break;
            }
     }

         log_format    access    '$remote_addr - $remote_user [$time_local] "$request" '
                                                 '$status $body_bytes_sent "$http_referer" '
                                                 '"$http_user_agent" $http_x_forwarded_for';
        access_log    /exp/nginxlogs/bbs.linuxtone_access.log    access;
    
}


注:第二种代理方式
nginx 处理下图片,html等静态的东西.其它动态由apache处理.因此apache也需要做一些参数调整.
设置图片等过期时间.缓解请求.

如果源与nginx在同一台机器建议使用如下方法:
                 location / {
                            proxy_pass    http://192.168.1.4:8099/;
                            proxy_redirect default ;
                 }


针对不同的目录进行代理把下面的配置放到根目录代理的上面
                location /linuxtone/ {
                            proxy_pass    http://192.168.1.4:8099/linuxtone/;
                            proxy_redirect default ;
                 }


4 源配置
<VirtualHost 192.168.1.4:8099>
        ServerAdmin liuyu105#gmail.com
        DocumentRoot /date/wwwroot/linuxtone
        ServerName bbs.linuxtone.com
        ErrorLog logs/linuxtone_error_log
     CustomLog "|/usr/local/sbin/cronolog logs/linuxtone_access_log.%Y%m%d" combined
</VirtualHost>

 
第3部分:源的优化
1 apache-mpm.conf
<IfModule mpm_prefork_module>
        StartServers                    15
        MinSpareServers             15
        MaxSpareServers            30
        ServerLimit                 2536
        MaxClients                    2048
        MaxRequestsPerChild     1500
</IfModule>

2 apache-keepalive
Timeout 120   #与nginx的保持一至
KeepAlive On
MaxKeepAliveRequests 400
KeepAliveTimeout 7


第4部分:PHP的优化
优化一:将PHP由之前的xcache换成eaccelerator
1 安装
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3/
/usr/local/webserver/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php5/bin/php-config
make
make install

注:PHP路径以安装为准!

2 配置
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\n#' /etc/php.ini
sed -i 's#output_buffering = Off#output_buffering = On#' /etc/php.ini
sed -i "s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g" /etc/php.ini


配置eAccelerator加速PHP:
mkdir -p /usr/local/webserver/eaccelerator_cache
vi /etc/php.ini

按shift+g键跳到配置文件的最末尾,加上以下配置信息:
[eaccelerator]
zend_extension="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="300"
eaccelerator.shm_prune_period="120"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"


优化二:联系开发重新编译php减少php的模块.以减少php进程所占用内存数.这块尽管影响不大,但也有一定的作用.编译前也可以参照nginx的编译器优化方式安装.

第5部分:测试并启动nginx
ulimit -SHn 51200
/usr/local/webserver/nginx/sbin/nginx -t
/usr/local/webserver/nginx/sbin/nginx

第6部分:nginx日志切割脚本
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/exp/nginxlogs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}bbs.linuxtone_access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/bbs.linuxtone_access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`


crontab -e
00 00 * * * /bin/bash    /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
posted @ 2011-04-25 21:55 小马歌 阅读(711) | 评论 (0)编辑 收藏
 

开始之前

Flex 作为富 Internet 应用(RIA)时代的新技术代表,自从 2007 年 Adobe 公司将其开源以来,Flex 就以前所未有的速度在成长。很多公司,包括 IBM 都纷纷加入了 Flex 开发的阵营当中。很多开发人员也按捺不住 Flex 的“诱惑”而准备从事 Flex 开发。本文主要讲述 Flex 开发的基础知识,主要是关于开发环境的搭建,以及介绍简单的 Flex 项目创建、编码、调试以及部署的过程和 Flex 编程的基本知识。通过本文的学习,您将会学习如何搭建 Flex 基本的开发环境以及开发、调试和部署方面的基础知识。为您以后深入系统的学习 Flex 打下良好的基础。

要学习本文,您需要有一定的 Web 编程经验和 Eclipse FireFox 使用经验。

代码示例和安装要求

本文所有示例均在 Windows XP SP3 系统中测试完成。您需要一台能流畅运行 Windows XP 系统的机器,除此之外您还需要一些工具才能试用本文中的代码。所有这些工具都可以免费下载(参见 参考资源):

  • Java SDK 1.5 或更高版本
  • Tomcat 6.0 或更高版本
  • Eclipse 3.3 或更高版本
  • Flex Builder 3.0 或更高版本
  • FireFox2.0 或更高版本

安装配置开发环境

接下来我们便迫不及待的开始吧!首先搭建我们的开发环境,为了减少因为环境不一致而引起的问题,建议读者使用与本文相同的软件版本:

  • 下载 并安装 JDK( 本文使用版本为 Sun JDK 6) ;
  • 下载 并解压 Eclipse( 本文使用版本为 Eclipse Ganymede J2EE 版本,含 WTP 插件 );
  • 下载 并安装 Flex Builder Eclipse 插件版 ( 本文使用的 Flex Builder 版本为 3.0.1);
  • 下载 并安装 Tomcat( 本文使用版本为 Tomcat6.0.18);
  • 下载 并安装 FireFox( 由于 Flex3.0 和一些插件的兼容性问题,本文使用 FireFox2.0.0.17)

小提示

Flex Builder 提供两个版本,一个是 All in one 的版本,另外一个是 Eclipse 的插件版,All in one 的版本内置了一个 Eclipse 的基本核心,插件不全。所以我们采用单独下载 Eclipse 和安装 Flex Builder 插件版的方式。另外在安装过程中不要安装 FlashPlayer 到 IE 或者 FireFox 上。我们在接下来的步骤中将单独安装 debug 版本的 Flash Player 。

大家知道 Flex 代码编译后是一个 SWF 文件,运行在 Flash Player 中,要想看到 SWF 文件在运行时输出的一些调试信息是比较困难的。所以在安装好基本的软件之后,我们要安装一些便于我们调试 Flex 的 FireFox 插件:

下载 并安装 debug 版本的 FireFox Flash Player 插件 ( 本文使用的版本为 Flash Player10)

打开 FireFox,到 FireFox 的 扩展组件站点 上搜索并安装 HttpFox,FlashTracer,Cache Status 三个插件,如图 1 所示。


图 1:开发调试需要的 FireFox 插件
图 1:开发调试需要的 FireFox 插件

小提示

在 Debug 版本的 Flash player 和 FlashTracer 插件完成好之后,我们发现 FlashTracer 并不能正常的显示用 trace 语句输出的调试信息。为了使其能够工作,还需要先点击图 1 中的 FlashTracer 设置按钮来设置日志文件的输出路径。并且输出的日志文件路径对于 Windows XP 来说必须是 C:\Documents and Settings\Administrator\Application Data\Macromedia\Flash Player\Logs\flashlog.txt 。

在安装了 Debug 版本的 Flash Player 之后,Flash Tracer 能显示您在程序中用 trace() 语句输出的调试信息,HttpFox 插件不仅能查看 HTTP 通信的过程和数据,还能看到哪些内容是从 Cache 里面读取的。另外,Cache Status 插件可以让我们方便的管理缓存。在 Flex 开发过程中,往往需要先清除掉缓存中的内容,才能看到新改动的效果。

接下来我们打开 Flex Builder, 在菜单Window>Preferences>Server>Runtime Environment中设置我们的 Tomcat6 以及在菜单Window>Preferences>General>Web Browser中设置浏览器为外部浏览器 FireFox,如图 2 和图 3 所示:


图 2:配置 Tomcat
图 2:配置 Tomcat

图 3:设置默认浏览器
图 3:设置默认浏览器

到此为止,我们的开发环境算是彻底搭建完毕,可以看出这个过程并不算是特别简单。别急,先苦后甜,小憩一下,让我们来享受一下 Flex 开发带来的乐趣吧!


Flex 的 Hello World !

创建项目

打开 Flex Builder, 如图 4 所示,新建一个 Flex 项目:


图 4:新建 Flex 项目
图 4:新建 Flex 项目

在图 5 所示设置页面中,我们选择项目类型是 Web application,关于 AIR 类型应用的基础知识可参考 developerWorks 上的另一篇文章《使用 Adobe AIR 和 Dojo 开发基于 Ajax 的 Mashup 应用》。 Application server type 我们以 J2EE 为例,并且不要钩选 Use remote object access service, 关于这些高级内容,我们将在后续的文章中陆续讨论。最后我们使用 Eclipse Ganymede J2EE 版本内置的 WTP(Web Tools Platform) 来创建一个后端使用 Java 前端使用 Flex 的 RIA 项目。在默认设置下,src 是 Java 代码的源代码文件夹。


图 5:设置 Flex 项目
图 5:设置 Flex 项目

在后续的设置页面中,我们配置项目运行时的 J2EE server 为我们在安装配置开发环境部分中配置的 Tomcat6 如图 6 所示:


图 6:配置运行时 J2EE Server
图 6:配置运行时 J2EE Server

点击 Next,在下一个页面中一切都按照默认设置即可。如图 7 所示,Main source folder 是设置默认的 flex 代码 ( 包括 mxml 和 Action script) 的源文件夹,Main application file 是项目默认的主应用。 Out folder URL 是项目运行在我们配置的 Tomcat 上时的 URL.


图 7:其他属性设置
图 7:其他属性设置

一切完成之后,我们来看看项目的组成结构,如图 8 所示:flex_src 中是默认的 flex 源码位置,flex_libs 则是存放 flex 其他第三方包的默认路径。类似于 web 应用的 lib 文件夹。 src 是 java 代码位置。 WebContent 文件夹的结构和普通由 WTP 建立的 Web Project 的结构完全相同。在默认的输出路径 bin-debug 文件夹中,我们可以看出 Flex builder 自动生成的 FlexSample.mxml 文件已经被自动编译成 FlexSample.swf 文件。


图 8:Flex 项目结构
图 8:Flex 项目结构

接下来,我们在新创建的项目上增加一点内容并让它运行起来:双击 FlexSample.mxml, 在其中添加一个最基本的 Flex 组件 :Label, 并且在该应用初始化的时候调用 init() 方法。我们在 init() 方法中用 trace() 语句输出调试信息。代码如下清单 1 所示:


清单 1:FlexSample.mxml
            <?xml version="1.0" encoding="utf-8"?>
            <mx:Application
            xmlns:mx="http://www.adobe.com/2006/mxml"
            layout="absolute"
            initialize="init()">
            <mx:Script>
            <![CDATA[
            private function init():void
            {
            var i:int = 0;
            i++;
            trace("i="+i);
            }
            ]]>
            </mx:Script>
            <mx:Label text="Hello World!" />
            </mx:Application>
            

运行、调试以及部署

现在,终于到了让我们的项目运行的时候了 ! 右键点击项目 ->Run As->Run On Server 如图 9 所示:接下来的几个页面选择默认即可,这时大家我们可以看到项目会被部署到我们配置的 Tomcat6 上去。并且 Flex Builder 会自动打开一个我们刚才配置的外部 FireFox 窗口。


图 9:运行项目
图 9:运行项目

但可能令您遗憾的是 Flex Builder 自动打开的 FireFox 窗口打开的 URL: http://localhost:8080/FlexSample/ 却什么也没有。别着急,还剩下最后一步:

如图 10 所示:右键点击我们要运行的 FlexSample.mxml > Run As > Flex Application


图 10:运行 mxml
图 10:运行 mxml

如果不出意外的话,您应该会看到下面的界面,Flash Tracer 插件输出了我们用 trace() 语句输出的 debug 信息,标签的 Hello World !也被显示到了界面上。同样,打开 FireFox 的 HttpFox 插件,我们也可以看到在运行时 FlexSample.swf 被载入。


图 11:运行后的界面
图 11:运行后的界面

如果我们希望像调试 Java 代码那样,在运行时观察变量的值怎么办呢?首先我们像在 Java 代码中设置断点一样给我们的 Action Script 代码增加断点。如图 12 所示:


图 12:在 Action Script 代码中设置断点
图 12:在 Action Script 代码中设置断点

然后选择我们的 FlexSample.mxml 右键选择调试运行。如图 13 所示:


图 13:调试方式运行 flex
图 13:调试方式运行 flex

然后我们随提示切换到 Flex 的调试视图,就会看到我们可以像 Java 调试模式那样轻松的调试 Flex 代码。如图 14 所示:


图 14:Flex Builder 调试视图
图 14:Flex Builder 调试视图

利用 WTP,我们可以将项目 export 成一个标准的 war file. 将导出的 war 文件放到 Tomcat 的 webapps 目录或者其他 web 服务器的相应目录下就可以当作一个标准的 web 应用来部署运行。

到此为止,我们应该庆祝一下我们已经迈入了 Flex 的大门了!我们已经编译出了我们自己的 swf 文件,并且运行在服务器上了。熟悉了这个开发过程之后,让我们乘胜前进,结合一个小例子学习一下 Flex 的编程基础知识吧!


Flex 编程基础

面向对象的编程

在上面 Hello World 的例子中我们可以看出,就像在 HTML 中嵌入 JavaScript 那样,我们可以在 mxml 里面嵌入 Action Script 代码来实现业务逻辑。没错!如果您把 Flex 中 mxml 和 Action Script 的关系理解为 Html 和 JavaScript 的关系,您会忽然发现您对 Flex 变的如此熟悉!

Action Script 语言是面向对象的脚本语言,它连编写方式都和 JavaScript 非常的相似。除了可以嵌套在 mxml 里面之外,它还可以像 JavaScript 写在单独的 .js 文件里面那样写在单独的 .as 文件里面,然后在 mxml 里面引入它。

下面我们新建一个 Action Script 的类 J2eeServer.as 如清单 2 所示:


清单 2:J2eeServer.as
            package com.ibm.flex
            {
            import flash.events.EventDispatcher;
            import mx.rpc.AsyncToken;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.HTTPService;
            public class J2eeServer extends EventDispatcher
            {
            public function J2eeServer()
            {
            }
            public function sendRequest(locale:String):void
            {
            var httpObject:HTTPService = new HTTPService();
            httpObject.resultFormat = "text";
            httpObject.url =
            "http://localhost:8080/FlexSample/SampleServlet?locale="+locale;
            var responder:mx.rpc.Responder = new mx.rpc.Responder(onSuccess, onFault);
            var call:AsyncToken = httpObject.send();
            call.addResponder(responder);
            }
            private function onSuccess(event:ResultEvent):void
            {
            this.dispatchEvent(event);
            }
            private function onFault(event:FaultEvent):void
            {
            trace("communication failed!");
            this.dispatchEvent(event);
            }
            }
            }
            

在这个类定义里面,熟悉 Java 的开发人员可以看出其编码规范和 Java 非常类似。在其中我们定义了一个 sendRequest() 方法, 使用 HTTPService 对象发起一个 http 的 get 请求 , 并且对于不同的返回结果我们定义了 onSuccess() 和 onFault() 两个方法去处理。在这两个结果处理方法中,我们将事件 dispatch 出去。

与 Servlet 集成

在 J2eeServer.as 中,我们通过 Action Script 发出 http 请求,现在我们定义一个服务器端的 servlet 来处理该请求。如清单 3 所示:


清单 3:SampleServlet.java
            package com.ibm.sample;
            import java.io.IOException;
            import java.io.PrintWriter;
            import javax.servlet.ServletException;
            import javax.servlet.http.HttpServlet;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            public class SampleServlet extends HttpServlet {
            private static final long serialVersionUID = 1L;
            public SampleServlet() {
            super();
            }
            protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
            }
            protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            String locale = request.getParameter("locale");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("The locale you selected is " + locale);
            }
            }
            

和普通 web 应用一样配置 web.xml, 如清单 4


清单 4:web.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
            <display-name>FlexSample</display-name>
            <servlet>
            <display-name>SampleServlet</display-name>
            <servlet-name>SampleServlet</servlet-name>
            <servlet-class>com.ibm.sample.SampleServlet</servlet-class>
            </servlet>
            <servlet-mapping>
            <servlet-name>SampleServlet</servlet-name>
            <url-pattern>/SampleServlet</url-pattern>
            </servlet-mapping>
            <welcome-file-list>
            <welcome-file>FlexSample.html</welcome-file>
            </welcome-file-list>
            </web-app>
            

事件驱动与数据绑定

从 J2eeServer.as 中我们依稀可以看出 Flex 事件驱动的影子。的确,Flex 的业务流程大多是靠事件来驱动的。某一个方法结束后,dispatch 出去一个事件。事件的监听者监听到这个事件后就会采取相应的动作来处理事件。如清单 5 所示:我们在 init() 方法中进行了事件绑定,绑定了两个监听方法 successHandler () 和 errorHandler () 到 J2eeServer 上。当 J2eeServer 完成和服务器端 servlet 通信 dispatch 出相应的事件后,两个监听方法便会监听到相应的事件并进行处理。

Flex 的另外一个重要的特点就是支持数据绑定,在另一篇文章《使用 Eclipse 和 JavaFX 开发 Mashup 应用》中我们曾介绍了 JavaFx 的数据绑定特性,同样 Flex 也支持数据绑定。当数据源被绑定到另外一个对象的某属性上时,数据源的数据如果发生变化,开发人员不需要写额外的代码该对象的属性值就可以相应的变化。如清单 5 中所示:如果要进行数据绑定,则要先定义一个可绑定的数据源,例如我们在变量 private var serverResponse:String = "" ;的上面设置 [Bindable] 属性,表示其为可绑定变量。然后我们在 resultLable 中使用花括号 {serverResponse} 将变量serverResponse绑定到 resultLable 的 text 属性上。


清单 5:FlexSample.mxml
            <?xml version="1.0" encoding="utf-8"?>
            <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
            creationComplete="init()">
            <mx:Script>
            <![CDATA[
            import mx.rpc.events.ResultEvent;
            import mx.rpc.events.FaultEvent;
            import com.ibm.flex.J2eeServer;
            import mx.collections.ArrayCollection;
            private var jserver:J2eeServer = new J2eeServer();
            //可绑定变量
            [Bindable]
            private var serverResponse:String = "";
            //可绑定变量
            [Bindable]
            private var locales:ArrayCollection = new ArrayCollection(
            [ {label:"en_us", data:"en_us"},
            {label:"zh_cn", data:"zh_cn"}]);
            private function init():void
            {
            //事件绑定
            jserver.addEventListener(ResultEvent.RESULT, successHandler);
            jserver.addEventListener(FaultEvent.FAULT, errorHandler);
            }
            private function localeComboxChangeHandler(event:Event):void
            {
            jserver.sendRequest(localeCombox.selectedItem.data);
            }
            private function successHandler(event:ResultEvent):void
            {
            serverResponse = event.result.toString();
            trace(event.result);
            }
            private function errorHandler(event:FaultEvent):void
            {
            serverResponse = event.message.toString();
            trace(event.message);
            }
            ]]>
            </mx:Script>
            <mx:VBox>
            <mx:Label text="Select your locale:" />
            <mx:ComboBox
            id="localeCombox"
            width="160"
            dataProvider="{locales}"
            change="localeComboxChangeHandler(event)"/>
            <mx:Label
            id="resultLabel"
            text="The response from server is: {serverResponse}" />
            </mx:VBox>
            </mx:Application>
            

最终项目的文件结构如图 15 所示:


图 15:项目文件结构图
图 15:项目文件结构图

运行项目,我们可以看到当我们改变下拉框的值的时候,会触发 localeComboxChangeHandler() 函数调用 J2eeServer 的 sendRequest() 方法将选择的 locale 值发送给服务器端的 servlet,并且在结果返回后,将从服务器端得到的 response 显示在 resultLable 上。如图 16 所示:


图 16:项目运行结果
图 16:项目运行结果

结束语

Flex 作为 RIA 的新技术,对传统 web 开发技术有继承也有发展。这篇文作为入门文,主要作用是帮助大家掌握 Flex 的开发环境、开发方式、开发调试部署的流程以及 Flex 的基本编程知识。但 Flex 除了国际化、Unit 测试、Ant 编译等传统问题之外,作为新技术 Flex 还有很多不同以往的地方,比如模块开发,RSL(Runtime Shared Libraries), Shared object、和 JavaScript 交互以及它的 MVC 框架 cairngorm,远程调用和消息传递框架 BlazeDS 等。所有这些问题都是值得我们进行后续讨论的。

致谢

在本文完成之际,特别感谢 IBM 中国软件开发中心 IM 开发团队我的同事们在工作和学习中给我的巨大帮助!


参考资料

学习

  • Flex 3 Developer's Guide”:很好的 Flex 基础知识入门材料。

  • Flex Developer Center”:针对具体开发场景的大量示例代码和文章。

  • Flex Ant Tasks”:介绍了如何结合 Ant 工具来编译 Flex。

  • Flex RSL”:对Flex RSL开发的各方面进行详细介绍的官方文档。

  • 集成 Flex 与 Ajax 应用程序”(developerWorks,2008 年 7 月):阅读完本文后,您将能够利用通过 Flash 资源获得的丰富功能。

  • 使用 Flex SDK 实现一个 Facebook 相册”(developerWorks,2008 年 12 月):在本篇教程中,将在 Adobe Flex 中开发一个 Facebook 应用程序,它可以以幻灯片的形式显示用户的 Facebook 相册。

  • Fluint 的官方站点”:Fluint 是 Flex Unit Test 的框架 Flex Unit 的升级版本。

  • Cairngorm 框架的 Adobe 官方站点”:Cairngorm 是 Flex 开发最著名和最成熟的一个 MVC 框架。

  • BlazeDS 框架的开源站点”:BlazeDS 是 Adobe 的一个开源项目。基于服务器的 Java 远程调用(remoting)和 Web 消息传递(messaging)技术,它能够使得后台的 Java 应用程序和运行在浏览器上的 Flex 应用程序或 AIR 应用程序相互通信。

获得产品和技术

  • 下载 JRE 或 JDK。

  • 下载 Eclipss Ganymede。

  • 下载 Flex Builder Eclipse 插件版。

  • 下载 Tomcat 6。

  • 下载 FireFox 2.0。

  • 下载 BDebug 版本的 FireFox Flash Player 插件。

关于作者

刘庆,目前在 IBM 软件开发中心(IBM CSDL)IM 开发团队担任开发工程师,拥有 IBM DB2 DBA 专业认证,他在 J2EE 和 Web 开发领域有着多年开发经验,喜欢关注新技术。他毕业于中国科技大学,并拥有硕士学位。

posted @ 2011-04-25 13:53 小马歌 阅读(357) | 评论 (0)编辑 收藏
 

1. Xdebug
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),相当强大,它可以用来跟踪,调试和分析PHP程序的运行状况。Xdebug现在的最新版本是Xdebug 2.1.0, 下载页面是http://xdebug.org/download.php ,注意页面中下载链接有多个(如下图),要根据自己的计算机位数以及PHP版本来选择,搞清楚自己的PHP的版本以及是否线程安全(通过phpinfo函数查看),PHP5.3版本的用户还要知道自己的PHP是由哪种编译器编译的以决定下载VC6或者VC9版本。例如,我的PHP版本是5.2.x且线程安全,所以选择 5.2 VC6 (32 bit) 下载,文件名是php_xdebug-2.1.0-5.2-vc6.dll:

点击查看原图

2. Eclipse
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。使用它,可以为我们的PHP开发带来很多便利,软件可在其官网下载。

安装与配置:
1. 安装Xdebug
Eclipse的安装就不说了。Xdebug安装的方法不难,首先将下载到的文件重命名为 php_xdebug.dll 放置到PHP的ext/目录下,然后修改php.ini文件,在文件末尾加上下列几行:

[Xdebug]
; 指定xdebug 扩展文件的位置(路径请根据自己的情况做调整)
zend_extension_ts = "F:/library/php_xdebug-2.1.0-5.2-vc6.dll"
; 启用xdebug 远程调试
xdebug.remote_enable = 1
; 以下xdebug 调试选项实际上是默认值
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.remote_mode = req
xdebug.remote_handler = dbgp

zend_zend_extension_ts中的ts表示线程安全,如果你的PHP并非线程安全请写成zend_extension。完整的配置项及说明见 http://xdebug.org/docs/all_settings 。

保存php.ini后重启服务器,查看phpinfo()的输出,若在页面上能看到下面的画面则安装成功:

点击查看原图

2. 在Eclipse中配置debug选项
我用的是Eclipse for PHP Developers Helios,其他的版本类似。首先在Window -> Preferences 窗口的左边选择PHP -> Debug(如下图),在窗口右边的PHP Debugger这一项中选择XDebug,这个选项的右边有个Configure链接,点进去可以对XDebug进行设置,请确保XDebug使用的端口号与php.ini文件中指定的相同(通常为9000),下面两项为设置web服务器以及php解释程序,再下面的Break at first line表示调试开始后在第1行断开:

点击查看原图

程序调试:
设置好之后便可对程序进行调试了,点击工具上的虫子 -> Debug As,这里可以选择以web页面的形式或是PHP脚本的形式进行调试(如下图):

点击查看原图

顺利的话当前工作区视图会切换为PHP Debug,然后程序会在第1行断开,接着就可以进行单步调试了(如下图),调试的方法就不多说了,自己摸索,总之很是方便:

 

点击查看原图

本文来自:http://blog.csdn.net/Eric6/archive/2010/10/10/5932029.aspx

引用地址: 

posted @ 2011-04-13 15:25 小马歌 阅读(3654) | 评论 (0)编辑 收藏
 
httpd 无法启动: RSA server certificate CommonName
下面是ssl_error.log的内容;

[Sun Oct 16 23:27:09 2005] [warn] RSA server certificate CommonName (CN) `mailserver’ does NOT match server name!?
[Sun Oct 16 23:27:09 2005] [error] Unable to configure RSA server private key
[Sun Oct 16 23:27:09 2005] [error] SSL Library Error: 185073780 error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
=====================

一些解决方案:
Error: “OpenSSL:error:0B080074:x509 certificate outines:x509_check_private_key:key values mismatch”
This error message occurs if you are using the incorrect certificate or private key during installation. So you need to use the matching key and certificate files. To check that the public key in your cert matches the public portion of your private key, view both files, and compare the modulus values with the following instructions:
To view the certificate:
openssl x509 -noout -text -in certfile
To view the key:
openssl rsa -noout -text -in keyfile

The “modulus” and “public exponent” portions in the key and the certificate must match exactly. If the “modulus” do not match exactly then you are using either the incorrect private key or certificate.

posted @ 2011-04-02 15:35 小马歌 阅读(5389) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 54 55 56 57 58 59 60 61 62 下一页 Last