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 小馬歌 閱讀(1514) | 評論 (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 小馬歌 閱讀(425) | 評論 (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 小馬歌 閱讀(305) | 評論 (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 小馬歌 閱讀(266) | 評論 (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 小馬歌 閱讀(701) | 評論 (0)編輯 收藏
           
               摘要: Haproxy介紹及其定位    HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。根據官方數據,其最高極限支持10G的并發。    HAProxy特別適用于那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計...  閱讀全文
          posted @ 2011-04-26 15:00 小馬歌 閱讀(2294) | 評論 (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 小馬歌 閱讀(715) | 評論 (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 小馬歌 閱讀(361) | 評論 (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 小馬歌 閱讀(3658) | 評論 (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 小馬歌 閱讀(5392) | 評論 (0)編輯 收藏
          僅列出標題
          共95頁: First 上一頁 54 55 56 57 58 59 60 61 62 下一頁 Last 
           
          主站蜘蛛池模板: 盐山县| 顺平县| 时尚| 揭东县| 台山市| 邓州市| 石景山区| 皋兰县| 廊坊市| 漳州市| 胶州市| 察隅县| 若羌县| 丽水市| 杭锦后旗| 凤庆县| 麟游县| 蒙山县| 岑溪市| 绵竹市| 平湖市| 长海县| 阿坝| 梁平县| 兰溪市| 武威市| 樟树市| 西贡区| 阳原县| 邹城市| 泽州县| 怀化市| 东丰县| 上林县| 杂多县| 盐山县| 崇义县| 栖霞市| 西华县| 县级市| 西贡区|