php+FreeBSD + Nginx 环境搭建

为什么要选择 FreeBSD?


官方网站:www.freebsd.org中文网站:http://www.freebsd.org/zh_CN/
FreeBSD是一个优秀的unix操作系统,基于宽松的BSD协议,是完美的企业级操作系统,以重点突出性能和安全而闻名,行业领先的企业多年以来一直 使用FreeBSD服务器。具有同所有其它开源软件操作系统竞争的高级性能。

  1. Unix兼容性强
  2. 速度快
  3. 极其稳定、可靠
  4. 强大的网络功能
  5. 多用户、多任务
  6. 使用方便(按照极好的说明文件操作)

为什么要选 择 Nginx?

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯访 问量第二的Rambler.ru 站点开发的,它已 经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了 Nginx,如六房间、酷6等。 新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx。

Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性:

  • 在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作 为开发模型;
  • 内存消耗少:在3万并发连接下,开启10个Nginx进程消耗150M左右内存(15M*10);
  • 不要钱:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机刚需要十多万至几十万元人民币;
  • Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为HTTP代理 服 务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多;
  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm描 述了成功并且美妙的使用经验;
  • Nginx 是一个 [#installation 安装] 非常的简单 ,配置文件?非常简洁(还能够支持perl语法),Bugs非 常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级;
  • 稳定性高:用于反向代理,宕机的概率微乎其微。

4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留 1GB的内存。 Nginx 0.7.51 + PHP 5.2.8 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存 (20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样 php-cgi消耗的总内存数才500M。

为什么Nginx的性能要比Apache高得多?这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的 Squid、Memcached都采用的是epoll网络I/O模型。

处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx 采用的epoll模型进行之间的区别:

假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版楼管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版楼 管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找 自己住这栋楼的同学时,select版和epoll版楼管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之 一,select和epoll的性能谁的性能更高,同样不言自明了。

安装 FreeBSD7.2

操作系统的安装建议参考FreeBSD Handbook,在此仅给出链接,以避免不必要的重复劳动:



安装时的注意事项

1. 磁盘分区

由于是WEB服务系统,网站目录都放于/home目录下,因此home分区要有足够的空间。以一块硬盘146G/内存4G的服务器为例,可做如下分 区:

  /  1024M  
  swap 4096M
  /var 10G
  /usr 20G
  /home 110G
  /tmp 1024M

2. 软件包的选择

我们的WEB服务系统是要对外服务的,所以尽可能少的选择软件包,安装时建议选择Minimal,然后进入Custom选择 doc,info,man,src即可。


配置

1. 编辑/etc/rc.conf确保有如下内容:

  sshd_enable="YES"  
  named_enable="YES"

2.根据硬件的配置重新编译内核,编译内核的办法参考FreeBSD Handbook,这里只给出链接:



编译后系统的性能将得到较大的提升。

获取相关开 源软件包

本文中提到的所有开源软件包为截止到2009年10月20日的最新稳定版,且均从官方网站下载。


mkdir -p /home/software
cd /home/software
fetch http://sysoev.ru/nginx/nginx-0.8.24.tar.gz
fetch ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
fetch ftp://xmlsoft.org/libxml2/libxml2-2.7.6.tar.gz
fetch http://www.zlib.net/zlib-1.2.3.tar.gz
fetch ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.40.tar.gz
fetch http://www.ijg.org/files/jpegsrc.v7.tar.gz
fetch http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.3.11.tar.gz
fetch http://www.libgd.org/releases/gd-2.0.35.tar.gz
fetch http://www.php.net/get/php-5.2.11.tar.gz/from/this/mirror
fetch http://php-fpm.org/downloads/php-5.2.11-fpm-0.5.13.diff.gz
fetch http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz

安装 Mysql5.1.40


Mysql5.1.40 下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.40.tar.gz/from/pick

pw groupadd mysql
pw useradd mysql -g mysql -d /dev/null -s /sbin/nologin
tar zxvf mysql-5.1.40.tar.gz
cd mysql-5.1.40
./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=innobase
make && make install clean
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cp /usr/local/webserver/mysql/support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf
cd ..


以mysql用户帐号的身份建立数据表


/usr/local/webserver/mysql/bin/mysql_install_db --datadir=/usr/local/webserver/mysql/data --user=mysql


创建 Mysql 开机启动脚本

cp /usr/local/webserver/mysql/share/mysql/mysql.server /usr/local/etc/rc.d/mysql.sh


为 mysql.sh 脚本设置可执行属性

chmod +x /usr/local/etc/rc.d/mysql.sh


修改 /etc/rc.conf

vi /etc/rc.conf


加入以下内容

mysql_enable="YES"


启动 Mysql

/usr/local/etc/rc.d/mysql.sh start


安 装 Nginx

安装Nginx所需的 pcre库



tar zxvf pcre-8.00.tar.gz
cd pcre-8.00
./configure
make && make install clean
cd ..

安 装 Nginx0.8.24


tar zxvf nginx-0.8.24.tar.gz
cd nginx-0.8.24
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install clean
cd ..

创建 Nginx 日志目录


mkdir -p /var/log/nginx
chmod +w /var/log/nginx
chown -R www:www /var/log/nginx

创建 Nginx 配置文件


rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf


输入以下内容:

user  www www;
worker_processes 8;

error_log  /var/log/nginx/error.log;
pid        /var/log/nginx/nginx.pid;

worker_rlimit_nofile 51200;
events {
  use kqueue;
  worker_connections 51200;
}

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

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    sendfile        on;
    tcp_nopush     on;
    
    keepalive_timeout  30;
    
    tcp_nodelay on;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    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;
    
    server {
        listen       80;
        server_name  localhost;
        root   /home/excms;
        index  index.html index.htm index.php;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location /nginx_status {
            stub_status on;
            access_log   off;
        }
    }
}

创建 Nginx 开机启动脚本

vi /usr/local/etc/rc.d/nginx.sh


加入以下内容

#!/bin/sh

nginx=/usr/local/webserver/nginx/sbin/nginx
conf=/usr/local/webserver/nginx/conf/nginx.conf

case $1 in
       start)
              echo -n "Starting Nginx"
              $nginx -c $conf
              echo " done"
       ;;

       stop)
              echo -n "Stopping Nginx"
              killall -9 nginx
              echo " done"
       ;;

       test)
              $nginx -t -c $conf
       ;;

 reload)
              echo -n "Reloading Nginx"
              ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP
              echo " done"
       ;;

 restart)
  $nginx stop
  $nginx start
       ;;

       show)
              ps -aux|grep nginx
       ;;

       *)
              echo -n "Usage: $0 {start|restart|reload|stop|test|show}"
       ;;
 
esac

为 nginx.sh 脚本设置可执行属性

chmod +x /usr/local/etc/rc.d/nginx.sh


修改 /etc/rc.conf

vi /etc/rc.conf


加入以下内容

nginx_enable="YES"


启动 Nginx

/usr/local/etc/rc.d/nginx.sh start


在不停止 Nginx 服务的情况下平滑变更 Nginx 配置
修改 /usr/local/webserver/nginx/conf/nginx.conf 配置文件后,请执行以下命令检查配置文件是否正确:

/usr/local/etc/rc.d/nginx.sh test


如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully


平滑变更 Nginx 配置

/usr/local/etc/rc.d/nginx.sh reload

安装 GD

安装 zlib

tar zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make && make install clean
cd ..

安装 libpng

tar zxvf libpng-1.2.40.tar.gz
cd libpng-1.2.40
./configure
make && make install clean
cd ..

安装 jpeg

tar zxvf jpegsrc.v7.tar.gz
cd jpeg-7
./configure –prefix=/usr/local/jpeg7 -enable-shared -enable-static
make && make install clean
cd ..

安装 freetype

tar zxvf freetype-2.3.11.tar.gz
cd freetype-2.3.11
./configure
make && make install clean
cd ..

安 装 gd2.0.35

tar zxvf gd-2.0.35.tar.gz
cd gd-2.0.35
./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg7 --width-png --width-zlib --width-freetype
make && make install clean
cd ..

安装 libxml2

tar -zxvf libxml2-2.7.6.tar.gz
cd libxml2-2.7.6
./configure
make && make install clean
cd ..

安装 PHP5.2.11

编译安装PHP 5.2.11所需的支持库 libiconv



tar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13
./configure --prefix=/usr/local
make && make install clean
cd ..

编译安装 PHP(FastCGI模式)


tar zxvf php-5.2.11.tar.gz
gzip -cd php-5.2.11-fpm-0.5.13.diff.gz | patch -d php-5.2.11 -p1
cd php-5.2.11
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-gd --enable-gd-native-ttf --with-libxml-dir --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-openssl --enable-pcntl --enable-sockets
make ZEND_EXTRA_LIBS='-liconv'
make install clean
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ..

安装 ZendOptimizer

ZendOptimizer 官方下载地址: http://www.zend.com/en/products/guard/downloads

tar zxvf ZendOptimizer-3.3.9-freebsd6.0-i386.tar.gz
cd ZendOptimizer-3.3.3-freebsd6.0-i386
ln -s /usr/lib/libc.so /usr/lib/libc.so.6 
ln -s /usr/lib/libcrypt.so /usr/lib/libcrypt.so.3 
ln -s /usr/lib/libutil.so /usr/lib/libutil.so.5 
ln -s /usr/lib/libm.so /usr/lib/libm.so.4 
./install-tty
cd ..

安装过程中的提示全默认就可以,指定php.ini文件路径 /usr/local/webserver/php/etc,到Apache Web Server选no

修改php-fpm配 置文件

php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi

vi /usr/local/webserver/php/etc/php-fpm.conf

将 <value name="user">nobody</value>和 <value name="group">nobody</value> 中的 nobody 改为 www, 并去掉前后的注释标签 <!-- , -->;
如要显示PHP调试的错误信息将 <value name="display_errors">0</value> 修改为 <value name="display_errors">1</value> ,并去掉前后的注释标签 <!-- , -->, 以显示PHP错误信息,否则,Nginx 会报状态为500的空白错误页。
创建 PHP-fpm 开机启动脚本

vi /usr/local/etc/rc.d/php-fpm.sh


加入以下内容

#! /bin/sh

php_fpm_BIN=/usr/local/webserver/php/bin/php-cgi
php_fpm_CONF=/usr/local/webserver/php/etc/php-fpm.conf
php_fpm_PID=/usr/local/webserver/php/logs/php-fpm.pid

php_opts="--fpm-config $php_fpm_CONF"

wait_for_pid () {
 try=0

 while test $try -lt 35 ; do

  case "$1" in
   'created')
   if [ -f "$2" ] ; then
    try=''
    break
   fi
   ;;

   'removed')
   if [ ! -f "$2" ] ; then
    try=''
    break
   fi
   ;;
  esac

  echo -n .
  try=`expr $try + 1`
  sleep 1

 done

}

case "$1" in
 start)
  echo -n "Starting php_fpm "

  $php_fpm_BIN --fpm $php_opts

  if [ "$?" != 0 ] ; then
   echo " failed"
   exit 1
  fi

  wait_for_pid created $php_fpm_PID

  if [ -n "$try" ] ; then
   echo " failed"
   exit 1
  else
   echo " done"
  fi
 ;;

 stop)
  echo -n "Shutting down php_fpm "

  if [ ! -r $php_fpm_PID ] ; then
   echo "warning, no pid file found - php-fpm is not running ?"
   exit 1
  fi

  kill -TERM `cat $php_fpm_PID`

  wait_for_pid removed $php_fpm_PID

  if [ -n "$try" ] ; then
   echo " failed"
   exit 1
  else
   echo " done"
  fi
 ;;

 quit)
  echo -n "Gracefully shutting down php_fpm "

  if [ ! -r $php_fpm_PID ] ; then
   echo "warning, no pid file found - php-fpm is not running ?"
   exit 1
  fi

  kill -QUIT `cat $php_fpm_PID`

  wait_for_pid removed $php_fpm_PID

  if [ -n "$try" ] ; then
   echo " failed"
   exit 1
  else
   echo " done"
  fi
 ;;

 restart)
  $0 stop
  $0 start
 ;;

 reload)

  echo -n "Reload service php-fpm "

  if [ ! -r $php_fpm_PID ] ; then
   echo "warning, no pid file found - php-fpm is not running ?"
   exit 1
  fi

  kill -USR2 `cat $php_fpm_PID`

  echo " done"
 ;;

 logrotate)

  echo -n "Re-opening php-fpm log file "

  if [ ! -r $php_fpm_PID ] ; then
   echo "warning, no pid file found - php-fpm is not running ?"
   exit 1
  fi

  kill -USR1 `cat $php_fpm_PID`

  echo " done"
 ;;

 *)
  echo "Usage: $0 {start|stop|quit|restart|reload|logrotate}"
  exit 1
 ;;

esac

为 php-fpm.sh 脚本设置可执行属性

chmod +x /usr/local/etc/rc.d/php-fpm.sh


修改 /etc/rc.conf

vi /etc/rc.conf


加入以下内容

php_fpm_enable="YES"


启动 PHP-fpm

/usr/local/etc/rc.d/php-fpm.sh start


在不停止 PHP-fpm 服务的情况下平滑变更 php.ini 配置
修改 /usr/local/webserver/php/etc/php.ini 或者 /usr/loca/webserver/php/etc/php-fpm.conf 配置文件后,请执行以下命令检查配置文件是否正确:

/usr/local/etc/rc.d/php-fpm.sh reload

测试

在/home/excms 目录下新建 phpinfo.php


vi /home/excms/phpinfo.php


加入如下文本

<?
    phpinfo();
    ?>

打开浏览器,在地址栏里输入 http://您服务器的IP/phpinfo.php

系统优化

修改内核参数,编辑 /boot/loader.conf


vi /boot/loader.conf


加入如下文本

kern.dfldsiz="2147483648"  # Set the initial data size limit
kern.maxdsiz="2147483648"  # Set the max data size
kern.ipc.nmbclusters="0"   # Set the number of mbuf clusters
kern.ipc.nsfbufs="66560"   # Set the number of sendfile(2) bufs

解释: a.第一,第二行主要是为了突破1G内存设置的 b. 第三行其实是bsd的一个bug,当系统并发达到一个数量级的时候,系统会crash,这个是非常糟糕的事情,所幸更改了这个参数后,在高并发的时候,基 本可以没有类似情况,当然非常bt的情况,还得进一步想办法 c.第四行是读取的文件数,如果你下载的文件比较大,且比较多,加大这个参数,是非常爽的

防ddos攻击

Sysctl 修改


vi /etc/rc.local


加入如下文本

sysctl kern.ipc.maxsockets=100000  ##增加并发的socket,对于ddos很有用
sysctl kern.ipc.somaxconn=65535  ##打开文件数
sysctl net.inet.tcp.msl=2500   ##timeout时间

php+CentOS + Nginx 环境搭建

获取相关开源软件包
本文中提到的所有开源软件包为截止到2009年10月20日的最新稳定版,且均从官方网站下载。
mkdir -p /home/software
cd /home/software
fetch http://sysoev.ru/nginx/nginx-0.8.24.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
wget ftp://xmlsoft.org/libxml2/libxml2-2.7.6.tar.gz
wget http://www.zlib.net/zlib-1.2.3.tar.gz
wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.40.tar.gz
wget http://www.ijg.org/files/jpegsrc.v7.tar.gz
wget http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.3.11.tar.gz
wget http://www.libgd.org/releases/gd-2.0.35.tar.gz
wget http://www.php.net/get/php-5.2.11.tar.gz/from/this/mirror
wget http://php-fpm.org/downloads/php-5.2.11-fpm-0.5.13.diff.gz
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz

安装、升级所需的程序库
利用CentOS Linux系统自带的yum命令安装、升级所需的程序库
yum -y install gcc gcc-c++ autoconf libtool* openssl openssl-devel
安装 Mysql5.1.40
Mysql5.1.40 下载地址: http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.40.tar.gz/from/pick
/usr/sbin/groupadd mysql
/usr/sbin/useradd mysql -g mysql -d /dev/null -s /sbin/nologin
tar zxvf mysql-5.1.40.tar.gz
cd mysql-5.1.40
./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=innobase
make && make install clean
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cp /usr/local/webserver/mysql/share/mysql/my-medium.cnf /usr/local/webserver/mysql/my.cnf
cd ..

以mysql用户帐号的身份建立数据表
/usr/local/webserver/mysql/bin/mysql_install_db --datadir=/usr/local/webserver/mysql/data --user=mysql

创建 Mysql 开机启动脚本
cp /usr/local/webserver/mysql/share/mysql/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql

添加 Nginx 为系统服务(开机自动启动)

chkconfig --add mysql
chkconfig mysql on

启动 Mysql
service mysql start
安 装 Nginx
安装Nginx所需的pcre库
tar zxvf pcre-8.00.tar.gz
cd pcre-8.00
./configure
make && make install clean
cd ..
安 装 Nginx0.8.24
tar zxvf nginx-0.8.24.tar.gz
cd nginx-0.8.24
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install clean
cd ..
创建www组、用 户、Nginx 日志目录

/usr/sbin/groupadd www
/usr/sbin/useradd www -g www -d /dev/null -s /sbin/nologin
mkdir -p /var/log/nginx
chmod +w /var/log/nginx
chown -R www:www /var/log/nginx

创建 Nginx 配置文件
rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf
输入以下内容:

user  www www;
worker_processes 8;

error_log  /var/log/nginx/error.log;
pid        /var/log/nginx/nginx.pid;

worker_rlimit_nofile 51200;
events {
  use epoll;
  worker_connections 51200;
}

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

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    sendfile        on;
    tcp_nopush     on;
    
    keepalive_timeout  30;
    
    tcp_nodelay on;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    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;
    
    server {
        listen       80;
        server_name  localhost;
        root   /home/excms;
        index  index.html index.htm index.php;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location /nginx_status {
            stub_status on;
            access_log   off;
        }
    }
}


创建 Nginx 开机启动脚本
vi /etc/init.d/nginx

加入以下内容

#!/bin/bash
#
# chkconfig: - 85 15
# description: Nginx is a World Wide Web server.
# processname: nginx

nginx=/usr/local/webserver/nginx/sbin/nginx
conf=/usr/local/webserver/nginx/conf/nginx.conf

case $1 in
       start)
              echo -n "Starting Nginx"
              $nginx -c $conf
              echo " done"
       ;;

       stop)
              echo -n "Stopping Nginx"
              killall -9 nginx
              echo " done"
       ;;

       test)
              $nginx -t -c $conf
       ;;

 reload)
              echo -n "Reloading Nginx"
              ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP
              echo " done"
       ;;

 restart)
  $0 stop
  $0 start
       ;;

       show)
              ps -aux|grep nginx
       ;;

       *)
              echo -n "Usage: $0 {start|restart|reload|stop|test|show}"
       ;;
 
esac


为 nginx.sh 脚本设置可执行属性
chmod +x /etc/init.d/nginx

添加 Nginx 为系统服务(开机自动启动)

chkconfig --add nginx
chkconfig nginx on


启动 Nginx
service nginx start

在不停止 Nginx 服务的情况下平滑变更 Nginx 配置
修改 /usr/local/webserver/nginx/conf/nginx.conf 配置文件后,请执行以下命令检查配置文件是否正确:
service nginx test
  如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully

平滑变更 Nginx 配置
service nginx reload
安装 GD
安装 zlib

tar zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make && make install clean
cd ..

安装 libpng

tar zxvf libpng-1.2.40.tar.gz
cd libpng-1.2.40
./configure
make && make install clean
cd ..

安装 jpeg

tar zxvf jpegsrc.v7.tar.gz
cd jpeg-7
./configure -enable-shared -enable-static
make && make install clean
cd ..

安装 freetype

tar zxvf freetype-2.3.11.tar.gz
cd freetype-2.3.11
./configure
make && make install clean
cd ..

安装 gd2.0.35

tar zxvf gd-2.0.35.tar.gz
cd gd-2.0.35
./configure
make && make install clean
cd ..

安装 libxml2

tar -zxvf libxml2-2.7.6.tar.gz
cd libxml2-2.7.6
./configure
make && make install clean
cd ..

安装 PHP
编译安装PHP 5.2.11所需的支持库 libiconv
tar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13
./configure --prefix=/usr/local
make && make install clean
cd ..
编译安装PHP(FastCGI模式)
tar zxvf php-5.2.11.tar.gz
gzip -cd php-5.2.11-fpm-0.5.13.diff.gz | patch -d php-5.2.11 -p1
cd php-5.2.11
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-gd --enable-gd-native-ttf --with-libxml-dir --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-openssl --enable-pcntl --enable-sockets
make ZEND_EXTRA_LIBS='-liconv'
make install clean
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ..
安装 ZendOptimizer
ZendOptimizer 官方下载地址: http://www.zend.com/en/products/guard/downloads

tar zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

cd ZendOptimizer-3.3.9-linux-glibc23-i386
cp data/5_2_x_comp/ZendOptimizer.so /usr/local/webserver/php/include/

修改 php.ini 在末尾添加以下内容

[zend]
zend_optimizer.optimization_level=15
zend_extension="/usr/local/webserver/php/include/ZendOptimizer.so"

修改php-fpm配置文件
php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi

vi /usr/local/webserver/php/etc/php-fpm.conf

将 nobody和 nobody 中的 nobody 改为 www, 并去掉前后的注释标签 ;
如要显示PHP调试的错误信息将 0 修改为 1 ,并去掉前后的注释标签 , 以显示PHP错误信息,否则,Nginx 会报状态为500的空白错误页。

修改 php-fpm 启动脚本

ln -s /usr/local/webserver/php/sbin/php-fpm /etc/init.d/php-fpm
vi /usr/lcaol/webserver/php/sbin/php-fpm

在 #!/bin/sh 下添加以下内容
#
# chkconfig: - 85 15
# description: php-fpm is PHP FastCGI Process Manage.
# processname: php-fpm

添加 php-fpm 为系统服务

chkconfig --add php-fpm
chkconfig php-fpm on

启动 php-fpm

service php-fpm start


在不停止 PHP-fpm 服务的情况下平滑变更 php.ini 配置
修改 /usr/local/webserver/php/etc/php.ini 或者 /usr/loca/webserver/php/etc/php-fpm.conf 配置文件后,请执行以下命令检查配置文件是否正确:
service php-fpm reload
测试
在/home/excms 目录下新建 phpinfo.php
vi /home/excms/phpinfo.php
加入如下文本

打开浏览器,在地址栏里输入 http://您服务器的IP/phpinfo.php
优化Linux内核 参数
vi /etc/sysctl.conf
在末尾增加如下文本

net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024  65535

使配置立即生效:
/sbin/sysctl -p
防ddos攻击
Sysctl 修改
vi /etc/rc.local
加入如下文本

sysctl kern.ipc.maxsockets=100000  ##增加并发的socket,对于ddos很有用
sysctl kern.ipc.somaxconn=65535  ##打开文件数
sysctl net.inet.tcp.msl=2500   ##timeout时间

 

2010.1.8更新

基于CentOS 5.5 搭建nginx +php +php-fpm+mysql高性能php平台

一、安装准备
1.1 平台环境

CODE:

CentOS 5.5 i686 GNU/Linux
Nginx 0.8.38
PHP 5.3.2
PHP-FPM 0.6.5
MYSQL 5.5.3 M3

1.2 系统安装及分区
1.2.1操作系统安装

      安装过程中选择最少的包,采用文本模式安装,不安装图形。
1.2.3系统分区

      /boot   100M (大约100左右)
      SWAP   4G    物理内存的2倍(如果你的物理内存大于4G,分配4G即可)
      /    50G
      /data          剩余所有空间.
      注:具体分区请根据相关业务划分
1.2.4系统软件包安装规范

系统约定:
      软件源代码包存放位置          /usr/local/src
      源码包编译安装位置(prefix)     /usr/local/software_name
      脚本以及维护程序存放位置    /usr/local/sbin
      MySQL 数据库位置             /data/mysql/data(可按情况设置)
      网站根目录                          /data/www/wwwroot(可按情况设置)
      虚拟主机日志根目录             /data/logs(可按情况设置)
      Nginx运行账户                   www:www
      install_software_name.sh     //存放编译参数脚本习
惯将所有编译脚本存放在install_software_name.sh便于升级和更新软件.

1.3.系统初始化
#vi init_network.sh

CODE:

#welcome
cat << EOF
+--------------------------------------------------------------+
|       === Welcome to Centos System init ===             |
+--------------------------------------------------------------+
+----------------------Author:NetSeek--------------------------+
EOF
#disable ipv6
cat << EOF
+--------------------------------------------------------------+
|       === Welcome to Disable IPV6 ===                   |
+--------------------------------------------------------------+
EOF
echo "alias net-pf-10 off" >> /etc/modprobe.conf
echo "alias ipv6 off" >> /etc/modprobe.conf
/sbin/chkconfig --level 35 ip6tables off
echo "ipv6 is disabled!"
#disable selinux
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
echo "selinux is disabled,you must reboot!"
#vim
sed -i "8 s/^/alias vi='vim'/" /root/.bashrc
echo 'syntax on' > /root/.vimrc
#zh_cn
sed -i -e 's/^LANG=.*/LANG="en"/' /etc/sysconfig/i18n
#init_ssh
ssh_cf="/etc/ssh/sshd_config"
sed -i -e '74 s/^/#/' -i -e '76 s/^/#/' $ssh_cf
sed -i "s/#UseDNS yes/UseDNS no/" $ssh_cf
#client
sed -i -e '44 s/^/#/' -i -e '48 s/^/#/' $ssh_cf
echo "ssh is init is ok.............."
#chkser
#tunoff services
#--------------------------------------------------------------------------------
cat << EOF
+--------------------------------------------------------------+
|       === Welcome to Tunoff services ===                |
+--------------------------------------------------------------+
EOF
#---------------------------------------------------------------------------------
for i in `ls /etc/rc3.d/S*`
do
             CURSRV=`echo $i|cut -c 15-`
echo $CURSRV
case $CURSRV in
      crond | irqbalance | microcode_ctl | network | random | sendmail | sshd | syslog | local | mysqld )
   echo "Base services, Skip!"
   ;;
   *)
      echo "change $CURSRV to off"
      chkconfig --level 235 $CURSRV off
      service $CURSRV stop
   ;;
esac
done

1.4 系统环境部署及调整
检查系统是否正常
# tail -n100 /var/log/messages (检查有无系统级错误信息)
# dmesg                   (检查硬件设备是否有错误信息)
# ifconfig                    (检查网卡设置是否正确)
# ping www.linuxtone.org    (检查网络是否正常)
1.5使用 yum 程序安装所需开发包

1.5.1 更换快源
#cd /etc/yum.repos.d/
#mv CentOS-Base.repo CentOS-Base.repo.linuxtone
#wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo

如何创建magento模块z之Hello World例子

 

如何创建magento模块z之Hello World例子



步骤:
1.创建一个Hello World模块
2.为这个模块配置路由
3.为这个模块创建执行控制器

 

创建Hello World模块



创建模块的结构目录:
app/core/local/Sjolzy/HelloWorld/Block
app/core/local/Sjolzy/HelloWorld/controllers
app/core/local/Sjolzy/HelloWorld/etc
app/core/local/Sjolzy/HelloWorld/Helper
app/core/local/Sjolzy/HelloWorld/Model
app/core/local/Sjolzy/HelloWorld/sql
创建config.xml的内容(app/core/local/Sjolzy/HelloWorld/etc/config.xml):
<config>
 <modules>
  <Sjolzy_HelloWorld>
   <version>0.1.0</version>
  </Sjolzy_HelloWorld>
 </modules>
</config>
然后创建一个系统配置文件激活这个模块
Sjolzy_HelloWorld.xml(app/etc/modules/Sjolzy_HelloWorld.xml)
<config>
 <modules>
  <Sjolzy_HelloWorld>
   <active>true</active>
   <codePool>local</codePool>
  </Sjolzy_HelloWorld>
 </modules>
</config>
检查是否模块已经激活:先清空magento缓存(var/cache),在后台管理:System->Configuration->Advanced 展开Disable Modules Output,看是否Sjolzy_HelloWorld显示出来。
 

配置路由


路由是用来把一个URL请求转换成一个执行控制器的方法。
需要在magento的全局配置中显式的定义你的路由。
在config.xml(app/core/local/Sjolzy/HelloWorld/etc/config.xml)中:
<config>
 ...
 <!-- /*  fontend:指向网站的前台(也可以是admin|install) */ -->
 <frontend>
  <!-- /*  routers:路由对象的定义或路由路径的定义 */ -->
  <routers>
   <!-- /*  helloworld:指向网站的前台 */ -->
   <helloworld>
    <use>standard</use>
     <args>
      <!-- /*  module:模块名字的小写版本 */ -->
      <module>Sjolzy_HelloWorld</module>
      <!-- /*  fontName:路由过程中的一个参数,只跟路由相关(Front Controller则是用来实例化所有路由) */ -->
      <frontName>helloworld</frontName>
     </args>
   </helloworld>
  </routers>
 </frontend>
</config>
 

为路由创建执行控制器


路由会把控制权交给控制器,我们已经定义了路由,现在来定义我们的执行控制器。
app/code/local/Sjolzy/HelloWorld/controllers/IndexAction.php(模块的控制器放在子目录controllers<小写>里,这是magento的规定)
<?php
class Sjolzy_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
 public function indexAction(){
  echo 'Hello World!';
 }
}
?>

还是情况缓存,请求URL:http://example.com/helloworld/index/index
注:http://example.com/frontName/执行控制器/执行方法


如果看到空白页面上写着'Hello World!',则你的模块创建成功!

黑客精神

 

 

黑客精神态度是很重要的,但技术则更是重要。黑客态度虽然是无可取代,随著新科技的发明和旧技术的取代,这些工具时间在慢慢的改变。例如:以往总是会学会用机器码写程序,直到最近我们开始使用HTML。不过,在1996年末,当然,这是基础的hacking技能。在1997年,理所当然的,你必须学会C。 但,如果你只是学一种言,那么你不能算是一位黑客,了不起只能算是一个programmer。除此,你还必须学会学会以独立于任何程序言之上的概括性观念来思考一件程序设计上的问题。要成为一位真正的黑客,你必须要能在几天之内将manual内容和你目前己经知道的关连起学会一种新的言。也就是说,你必会学还了C之外的东西,你至少还要会LISP或Perl(Java也正在努力的挤上这个名单; 译者注: 我很怀疑这份名单)。除了几个重要的hacking常用言之外,这些言提供你一些不同的程序设计途径,并且让你在好的方法中学习。 

程序设计是一种复杂的技术,我没辨法在这提供完整的学习步骤。但是我能告诉你一些在书本上和课堂上所没有的东西(有很,几乎全部最好的黑客们都是自习而来的)。(a) 读别人的程序码;(b)写程序,这两项是不错的方法。学习写程序就像在学习写一种良好的自然言,最好的方法是去看一些专家们所写的东西,然后写一些你自己的东西,然后读更,再写更。然后一直持续,一直到你发展出一种属于自己的风格和特色。要找到好的程序码来看是很一件很困难的事,因为,对菜鸟黑客们而言,适于供他们阅读和努力的大型程序的source数量很少。但这事己有了戏剧性的变化了; 现在免费的供应的软件程序设计工具和操作系统(大都公开提供 source,而且全都是由黑客们写成的)到处可看。进入下一个主题。 

2、取得一个免费的 unix,并学习使用和维护。我先假设你己经有一部个人电脑或者是可以使用任何一部(现在的小孩子幸福,可如此轻易的拥有 :-))。 取得黑客技巧的第一个步骤是取得一份linux 或者一份免费的 BSD-Unix,并将它安装在自己的机器,并使之顺利的运作。没错,在这个世界上除了unix之外,还有其它的操作系统。但是他们只提供bianry,你不能看到他们的程序码,你也不能修改他们。想要在DOS或windows或MacOS开始hacking,无疑就是要你绑著枷锁跳舞一样。 

除此之外,Unix是Internet上的操作系统。当你在不懂Unix的情况下学习使用Internet时,你没辨法在不懂Unix的情况下成为Internet的黑客。因为这个原故,现在的黑客文化还是很牢固的以unix为中心。(这并不完全是正确的,而且有些活在旧时代黑客甚至也不喜欢这种情形,但是Unix和Internet之间的共生共成己经到了牢不可破的地步,即使是Microsoft的大块肌肉也没能在上面留下明显的伤痕。) 因些,把unix装起来吧! (我自己是喜欢linux,但是还有其它的东东可用。) 学习它,让它运作起来,让它陪你努力精进。 用他向整个Internet喊话。看程序码,改程序。 

有一天你成为一位高竿的黑客,你回头往后看时会发现,你得到比Microsoft操作系统所能提供的还要好的程序设计工具(包括 C,Lisp和 Perl)。而且得到快乐,并学到比共生共成己经到了牢不可破的地步,即使是Microsoft的大块肌肉也没能在上面留下明显的伤痕。) 因些,把unix装起来吧! (我自己是喜欢linux,但是还有其它的东东可用。) 学习它,让它运作起来,让它陪你努力精进。用他向整个Internet喊话。 看程序码,改程序。有一天你成为一位高竿的黑客,你回头往后看时会发现,你得到比Microsoft操作系统所能提供的还要好的程序设计工具(包括 C,Lisp和 Perl)。而且得到快乐,并 

学到比你想像中的还要知识。 

看一下Linux distribution的目录或 linux CD,并把自己交付给它。 

3、学习使用World Wide Web并学会写 HTML。 

黑客文化创造出来的东西,大在他们的活动范围外被使用著,如,在工厂和辨公室或大学被漠漠的使用著。但Web是一个很大的例外,这个黑客眼中的大玩具甚至还被政客们接受,并巧巧的在改变这个世界。因此(还有很好的理由),你必须学习Web。并不只是学习使用browser(这太容易了)而己,还要学会写HTML这个Web的标签言。如果你不知道如何设计程序,写HTML也可以给一些习惯上的帮助。嗯!! 建立home page吧! 不过,有一个home page 并没任何特别之处能让你成为一位黑客。Web上到处都是home page,而且大部份都没什么重点,没什么内容的烂泥 -- 很好看的烂泥巴,但是看起来都一样,差不


你该学什么程序


程序言可分为5 

  1、web page script languages 

    就是网页代码,比如Html、javascript、Css、asp、php、xml都应该属于此(照蔡的意思,Html不应该属于anguages的,可能他觉得太简单了吧,不过我觉得Html也应该算的,大家爱听谁的就听谁的好了,这个不重要) 

  2、Interpreted Languages(解释型言) 

    包括Perl、Python、REBOL、Ruby等(后面三个听豆没听过),也常被称作Script言,通常被用于和底下的操作系统沟通。照蔡的意思,每个人至少应该学会一套这言。这言的缺点是效率差、源代码外露——所以不适合用来开发软件产品,一般用于网页服务器。 

  3、Hybrid Laguages(混合型言) 

    代表是JAVA和C#。介于解释型和编译型之间。蔡认为C#是.net最重要的言,值得期待其后续发展;至于JAVA,蔡叫看他的《Sleepless in Java》——我倒! 

  4、COMPILING Languages(编译型言) 

    C/C++,JAVA都是编译型言。蔡说C++很复杂,要成为高手没三五年是不行的(就凭这句话,我决定向JAVA投降),虽然如此,但真正要成为高手的都应该懂C/C++。 

    关于Delphi,蔡说如果想要跨linux和windows平台的言,则Delphi似乎是最好的选择。 

  5、Assembly Languages(汇编言) 

    汇编言是最接近于硬件的言,不过现在几乎没少人用了。 

  程序言学习顺序建议 

    如果完全没有程序经验,可照这个顺序:javascript——解释型言——混合型言——编译型言——汇编(如果需要的话) 

    用业界流行一句话做结尾“真正的程序员用C++,聪明的程序员用Delphi”,那么,什么样的程序员用JAVA呢? 

  虚怀若谷题外话 

    看在我这么晚了还这么辛苦的敲字的面子上,看到这篇帖子的朋友给点掌声吧,虽然没什么自己的思想。 

    另外,本文完全据蔡学镛先生同名文章精简,所以如果这篇文章给你的程序生涯有什么不好的作用,那我不介意你去扁他。当然如果这篇文章对你有什么积极影响,我很高兴你能请我吃大餐。

如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧! 

    方案一 Basic言 & Visual Basic 

    优点 

    (1)Basic 简单易学,很容易上手。 

    (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。 

    (3)众控件让编程变得象垒积木一样简单。 

    (4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。 

    缺点 

    (1)Visual Basic 不是真正的面向对象的开发文具。 

    (2)Visual Basic 的数据型太少,而且不支持指针,这使得它的表达能力很有限。 

    (3)Visual Basic 不是真正的编译型言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。 

    综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏朋友来说,VB 是您最佳的选择。 

    方案二 Pascal言 & Delphi 

    优点 

    (1)Pascal言结构严谨,可以很好地培养一个人的编程思想。 

    (2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。 

    (3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。 

    (4)Delphi具有强大的数据库">数据库开发能力,可以让你轻松地开发数据库">数据库。 

    缺点 

    Delphi几乎可以说是完美的,只是Pascal言的过于严谨让人感觉有点烦。 

    综述: 方案二比较适合那些具有一定编程基础并且学过Pascal言的朋友。 

    方案三 C言 & Visual C++ 

    优点 

    (1)C言灵活性好,效率高,可以接触到软件开发比较底东西。 

    (2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。 

    (3)VC是微软制作的产品,与操作系统的结合更加紧密。 

    缺点 

    对使用者的要求比较高,既要具备丰富的C言编程经验,又要具有一定的windows编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。 

    综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。 

    方案四 C++言 & C++ Builder 

    优点 

    (1)C++言的优点全部得以继承。 

    (2)完全的可是化。 

    (3)极强的兼容性,支持OWL、VCL和MFC三大库。 

    (4)编译速度非常快。 

    缺点 

    由于推出的时间太短,关于它的各种资料还不太。 

     综述:我认为C++ Builder 是最好的编程工具。它既保持了C++言编程的优点,又做到了完全的可视化。

    方案五 SQL言 & Power Builder 

    对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库">数据库开发工具。各种各样的控件功能强大的PowerBuilder都会帮助你开发出自己的数据库">数据库应用程序

补充:关于网页后台言和其他言的关系,一般认为:

C言学的好,那么学习php会有事半功倍的效果

VC学的好,那么学习asp会有事半功倍的效果

JAVA学的好,那么学习jsp、JAVASCRIPT会有事半功倍的效果

关于网页后台言和数据库">数据库,通常来说:

php与mysql是黄金搭档

asp小型网站用ACCESS,大型用SQL

jsp我就不知道了

关于电子商务流行的言,目前

当当、卓越、6688、igo5、雅宝使用的是asp

易趣、淘宝使用的是php

贝塔斯曼使用的是jsp

4、至少学会以下的其中两种: 

一、网站服务器程序asp、php、cgi、jsp 

个人认为cgi是最难学的其中一种。 

二、程序言:C言、C++、VB、JAVA、PERL、DELPHI、汇编言 

不过我认为C言的通用性最好,可以跨平台(操作系统使用。 

还要试着自己写程序、开发软件等工作。 

三、数据库">数据库管理软件:mysql、SQL、FOXPRO……等。 

四、几种常用的操作系统:WIN98、WIN2000、WINNT、WINXP、unix、linux、要是能学到unix那是最好不过的了。最最基本的WIN2K、WINNT也要学会吧。 

如果以上的你都会了,那么你已经是个高手了。

50个有用的PHP工具

 

调试工具

测试和优化工具

文档工具

安全工具

图形处理

代码优化

版本控制系统

有用的拓展,使用工具和类

  • SimplePie :PHP RSS 解析程序



  • HTML Purifier :可以用来移除所有恶意代码(XSS),而且还能确保你的页面遵循W3C的标准规范。
  • TCPDF :一个用于快速生成PDF文件的PHP5函数包。
  • htmlSQL :一个是你可以方便的对HTML和XML内容方便的使用类似SQL语句进行检索的PHP类。
  • The Greatest PHP Snippet File Ever (Using Quicktext for Notepad++)
  • Creole :用PHP5编写, 是一个基于真正意义的OO的层,API接口以JDBC为基础。
  • PHPLinq :用SQL语法操作PHP数组。
  • PHPMathPublisher:作者是一位法国中学数学老师。



  • phpMyAdmin :可以通过互联网在线控制和操作MySQL。
  • PHPExcel :相当强大的MS Office Excel 文档生成类库。
  • Phormer :一个轻量级,强大的PHP在线相册。
  • xajax PHP Class Library :一个开源的PHP 类库,用来构建WEB上的Ajax 程序。
  • PHP User Class :用户管理。
  • PHP-GTK :为了证明PHP是一种远远超越网络应用程序的有效的工具而开发的。使用PHP-GTK你可以建立独立的GUI(用户图形界面)应用程序。

在线工具和资源

  • Minify! :使用 PHP5 开发的用于合并压缩 js/css 文件的应用程序。合并压缩之后的结果可通过 HTTP gzip/deflate 及一些相关头,优化客户端缓存。


  • HTTP_StaticMerger:自动“合并”CSS和JavaScript文件。
  • PHP Object Generator :一个开源的PHP代码生成器。它能够为你的PHP4/PHP5应用程序生成简洁和可测试的面向对象代码。


  • gotAPI/PHP







  • koders :开放源代码搜索。
  • PECL :含有PHP 开发组提供的不同扩展库的信息。

浏览器中的工具(Firefox插件)

  • FirePHP :是基于Firebug的一个扩展,可以用来在Firebug的console中方便的输出php的调试信息又不影响php程序的正常运行。


  • phpLangEditor :是一个用来翻译各种PHP变数的工具.



  • PHP Lookup :是一个内置的搜索栏,以帮助您快速查找引用的PHP语法。
  • PHP Manual Search :一个方便的搜索栏,从您的Web浏览器中搜索官方PHP文档

PHP框架

  • Dwoo :一个PHP5 的模板引擎。
  • CodeIgniter :帮助你编写Web 应用程序的敏捷开源PHP 框架。



  • YII Framework 一个高性能的基于组件的PHP框架。
  • Solar



  • symfony :一个开源的PHP Web框架。目的是加速Web应用的创建与维护。
  • PEAR   
  • Propel :是一个适用于PHP5的OR映射(Object Relational Mapping)框架。它允许你使用对象代替SQL来读写数据库表格中的行。
  • {{macro}} template engine

  • Zend Framework :是一个开放源代码的PHP5 开发框架,可用于来开发web 程序和服务。
  • Qcodo :是一个适用于敏捷开发基于PHP5采用MVC架构与CRUD代码生成功能的框架。


  • SAJAX :Sajax 是一种制作 Ajax 应用程序的模块化方式,通过预定的、动态的函数调用,使得应用程序的开发过程更加平滑。
  • Smarty : 用PHP实现MVC开发模式的逻辑层和表示层的模板引擎。
  • CakePHP :是一个开源的PHP on rails的full-stack框架。


  • Savant2 :是一套直接使用PHP function,但是做了合理的限制的PHP模板引擎。
  • PHPSpec :PHPSpec是一个简单而直观的PHP框架。

IDEs 和 Editors

  • PHPEclipse :相当强大的一个Eclipse下开发PHP的插件,包括的功能有:PHP语法分析,调试,代码格式化,大纲视图,代码模板定制等。


  • PhpED :内部调试器。


  • phpDesigner :针对PHP 网页的编写所设计的程序。


  • Zend Studio :一个屡获大奖的专业PHP 集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示。


  • Aptana PHP :一个开源的IDE ,主要致力于浏览器端的开发。
  • PDT :一个开发工具框架,致力于在Eclipse平台之上提供一个功能完整的PHP集成开发环境。
  • VS.Php :通过安装这个插件,我们可以在Visual Studio .Net这个市场中最流行的IDE中编译、编辑、配置PHP程序。
  • PHPEdit :这款IDE软件提供用于突出语法显示、代码提示、代码识别,一个集成的PHP调试器以及一个帮助生成器工具。

补充资源

标签: url, IT, 工具, img

基于RBAC的权限设计模型

1  RBAC 介绍

RBAC 模型作为目前最为广泛接受的权限模型

NIST (The National Institute of Standards and Technology,美国国家标准技术研究院)标准RBAC模型由4个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC)、角色分级模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC)[1]。RBAC0模型如图1所示。

clip_image001.jpg 
图表 1 RBAC 0 模型

l          RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合

在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展

l          RBAC1 引入角色间的继承关系

角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的继承。而受限继承关系则进一步要求角色继承关系是一个树结构。

l          RBAC2 模型中添加了责任分离关系

RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型用户的访问许可。

l          RBAC3 包含了RBAC1和RBAC2

既提供了角色间的继承关系,又提供了责任分离关系

建立角色定义表。定出当前系统中角色。

因为有继承的问题,所以角色体现出的是一个树形结构。

test.bmp

2        权限设计:

 

配置资源以及资源的操作 : 这里资源可以定义为一个通用的资源模型。提供通用的资源统一接口。

 

 

 

 

 

数据库 ER 图:

clip_image002.gif

 

关系图:

 

clip_image003.gif

 

未命名.bmp

 

3        分析:

 

    根据以上的关系图和ER图可以看出。整个权限可以抽象为五个对象组成。

OrgBean : 用于描述org模型

Role : 用于描述角色。

Permission : 用于描述权限

Resource : 用于描述资源

Operation : 用于描述操作。

 

其中Permission中有Resource , Operation 的聚合,资源和操作组成权限

Role 和 Permission 都有自包含。因为设计到权限的继承。

资源Resource 也可能出现一颗树形结构,那资源也要有自包含。

 

思想 :

权限系统的核心由以下三部分构成: 1. 创造权限, 2. 分配权限, 3. 使用权限,然后,系统各部分的主要参与者对照如下: 1. 创造权限 - Creator 创造, 2. 分配权限 - Administrator 分配, 3. 使用权限 - User :

1. Creator 创造 Privilege , Creator 在设计和实现系统时会划分,一个子系统或称为模块应该有哪些权限。这里完成的是 Privilege 与 Resource 的对象声明,并没有真正将 Privilege 与具体 Resource 实例联系在一起,形成 Operator 。

2. Administrator 指定 Privilege 与 Resource Instance 的关联 。在这一步, 权限真正与资源实例联系到了一起, 产生了 Operator ( Privilege Instance )。 Administrator 利用 Operator 这个基本元素,来创造他理想中的权限模型。如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等 ... 这些操作都是由 Administrator 来完成的。

3. User 使用 Administrator 分配给的权限使用各个子系统。 Administrator 是用户,在他的心目中有一个比较适合他管理和维护的权限模型。于是,程序员只要回答一个问题,就是什么权限可以访问什么资源,也就是前面说的 Operator 。程序员提供 Operator 就意味着给系统穿上了盔甲。 Administrator 就可以按照他的意愿来建立他所希望权限框架 可以自行增加,删除,管理 Resource 和 Privilege 之间关系。可以自行设定用户 User 和角色 Role 的对应关系。 ( 如果将 Creator 看作是 Basic 的发明者, Administrator 就是 Basic 的使用者,他可以做一些脚本式的编程 ) Operator 是这个系统中最关键的部分,它是一个纽带,一个系在 Programmer , Administrator , User 之间的纽带。

 

4        权限API

   getPermissionByOrgGuid(String orgGuid )

      通过传入一个org的Guid , 拿到当前这个org对象都具有那些访问权限

 getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid)

    通过传入一个org的Guid 和 一个资源的Guid , 返回改Org对当前这个资源的访问权限

 

getPermissionByResourceGuid(String resource)

    通过传入一个资源的Guid , 得到当前资源下都有那些权限定义。

 

havingHeritPermission(String orgGuid , String resouceGuid) : Boolean

    传入一个orgGuid, 资源GUID ,查看改OrgGuid下对资源是否有向下继承的权限。这里继承是资源的继承。即对父栏目权限,可以继承下去对父栏目下的子栏目同样有权限

 

havingPermission(String orgGuid , String resourceGuid) : Boolean

    判断某Org对某一资源是否用权限

 

以上是粗粒度的权限API 。 以下为细粒度的权限

 

getOperationByPermission(String permissionGuid)

    通过permission 的Guid 得到该permission 的所有有效操作。

 

getOperationByGuid(String permissionGuid , String resourceGuid)

    通过permision的Guid , 资源的Guid 得到该资源下所有的有效操作。

 

screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid)

    通过permission , resource , org的Guid 得到改Org对这一资源的有效操作。

 

hasOperation(String operationGuid) : boolean

    通过传入的operationGuid 返回是否具有操作权限

 

5        权限的实现:

1 .表单式认证,这是常用的,但用户到达一个不被授权访问的资源时, Web 容器就发

出一个 html 页面,要求输入用户名" title="用户名" >用户名和密码

2 .用 Filter 防止用户访问一些未被授权的资源, Filter 会截取所有 Request/Response ,

然后放置一个验证通过的标识在用户的 Session 中,然后 Filter 每次依靠这个标识来决定是否放行 Response 。

这个模式分为:

Gatekeeper :采取 Filter 或统一 Servlet 的方式

Authenticator : 在 Web 中使用 JAAS 自己来实现。

 

Filter 拦截只是拦截该用户是否有访问这个页面,或这一资源权限。真正做到显示后拦截是在应用程序内部去做。

 

做显示拦截提供API , 标签这两种方式

标签: IT, 权限, 用户