精华内容
下载资源
问答
  • php高级开发教程说明

    2008-11-27 11:39:22
    大的项目如果缺乏计划将导致多的错误,在开发后期,可能会遇到没有或无法预见的 困难,这是由于缺乏计划的时间和工作,这些困难可能会严重到让你彻底地重组整个项目。例 如,对一个依赖额外数据库提取层的数据库...
  • 你的测试样本太简单了,不足以得出 * * 要比sqrt快的结论,只能说明在CPython2.6.6,对1234567890这一个数字 * * 要比sqrt快。或许这样的测试代码会有说服力:import timeimport mathdef test1():start = time...

    你的测试样本太简单了,不足以得出 * * 要比sqrt快的结论,只能说明在CPython2.6.6中,对1234567890这一个数字 * * 要比sqrt更快。或许这样的测试代码会更有说服力:

    import time

    import math

    def test1():

    start = time.time()

    for i in xrange(100000):

    z = i**.5

    print "x**0.5 took %f secs" % time.time() - start

    def test2(f=math.sqrt): # 不要在for*里面*用math.sqrt, 查询函数的时间可能使结果有误差

    start = time.time()

    for i in xrange(100000):

    z = f(i)

    print "x**0.5 took %f secs" % time.time() - start

    另外,请在你需要的python解释器中测试,不同的解释器及版本结果都不同。这里有一些别人的测试结果。大体来说sqrt更快(CPython[2.4.6, 2.5.5, 2.6.6, 2.7, 3.0.1, 3.1.2], Pypy1.4.1, CPython[2.5, 2.6]+Psyco2.0), 只有在Jython2.5.1中**更快。

    至于为什么。。* *(与pow函数等价)的参数可以是复数,所以额外的类型检查之类可能带来开销;而Guido说sqrt是直接连接到C中的sqrt函数的,所以会非常快。

    展开全文
  • 另外我去网上搜索了,java做进销存的应用,比php要多很多,那么是不是说明对于数学运算一些的应用,java强类型语言有优势一些呢?而php流行的应用,多是互联网应用,以内容为主的,而不是数据为主的? 所以我...
  • nginx中文手册内容说明

    千次阅读 2015-03-03 21:51:56
    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接的响应,感谢 Nginx 为我们选择了 epoll...

    1.什么是nginx?

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

    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

    作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

    作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

    Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

    2、如何源码编译安装nginx?

     

    nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息。

    正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好。

    ububtu平台编译环境可以使用以下指令

    apt-get install build-essential
    apt-get install libtool

    centos平台编译环境使用如下指令

    安装make:

    yum -y install gcc automake autoconf libtool make

    安装g++:

    yum install gcc gcc-c++

    下面正式开始
    ---------------------------------------------------------------------------
    一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。
    1.选定源码目录
    可以是任何目录,本文选定的是/usr/local/src

    cd /usr/local/src

    2.安装PCRE库
    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:

    cd /usr/local/src
    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz 
    tar -zxvf pcre-8.34.tar.gz
    cd pcre-8.34
    ./configure
    make
    make install

    3.安装zlib库
    http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:

    cd /usr/local/src
    
    wget http://zlib.net/zlib-1.2.8.tar.gz
    tar -zxvf zlib-1.2.8.tar.gz
    cd zlib-1.2.8
    ./configure
    make
    make install

    4.安装ssl(某些vps默认没装ssl)

    cd /usr/local/src
    wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
    tar -zxvf openssl-1.0.1c.tar.gz

    5.安装nginx

    Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:

    cd /usr/local/src
    wget http://nginx.org/download/nginx-1.4.2.tar.gz
    tar -zxvf nginx-1.4.2.tar.gz
    cd nginx-1.4.2
    
    ./configure --sbin-path=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf \
    --pid-path=/usr/local/nginx/nginx.pid \
    --with-http_ssl_module \
    --with-pcre=/usr/local/src/pcre-8.34 \
    --with-zlib=/usr/local/src/zlib-1.2.8 \
    --with-openssl=/usr/local/src/openssl-1.0.1c
    
    make
    make install

    --with-pcre=/usr/src/pcre-8.34 指的是pcre-8.34 的源码路径。
    --with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。

    安装成功后 /usr/local/nginx 目录下如下

    fastcgi.conf            koi-win             nginx.conf.default
    fastcgi.conf.default    logs                scgi_params
    fastcgi_params          mime.types          scgi_params.default
    fastcgi_params.default  mime.types.default  uwsgi_params
    html                    nginx               uwsgi_params.default
    koi-utf                 nginx.conf          win-utf

    6.启动
    确保系统的 80 端口没被其他程序占用,运行/usr/local/nginx/nginx 命令来启动 Nginx,

    netstat -ano|grep 80

    如果查不到结果后执行,有结果则忽略此步骤(ubuntu下必须用sudo启动,不然只能在前台运行)

    sudo /usr/local/nginx/nginx

    打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。

    -----------------------------------------------------
    到这里nginx就安装完成了,如果只是处理静态html就不用继续安装了

    如果你需要处理php脚本的话,还需要安装php-fpm

    下面安装排错

    附:可能遇到的错误和一些帮助信息

    1.1编译pcre错误

    libtool: compile: unrecognized option `-DHAVE_CONFIG_H'
    libtool: compile: Try `libtool --help' for more information.
    make[1]: *** [pcrecpp.lo] Error 1
    make[1]: Leaving directory `/usr/local/src/pcre-8.34'
    make: *** [all] Error 2

    解决办法:安装g++,别忘了重新configure

    apt-get install g++
    apt-get install build-essential
    make clean
    ./configure
    make

    1.2 make出错

    make: *** No rule to make target `build', needed by `default'.  Stop.
    ./configure: error: SSL modules require the OpenSSL library.
    You can either do not enable the modules, or install the OpenSSL library
    into the system, or build the OpenSSL library statically from the source
    with nginx by using --with-openssl= option.

    按照第4步的安装方法或
    ubuntu下

    apt-get install openssl
    apt-get install libssl-dev

    centos下

    yum -y install openssl openssl-devel

    2.nginx编译选项

    make是用来编译的,它从Makefile中读取指令,然后编译。

    make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

    configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:

    • --prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。
    • --sbin-path=path 设置nginx的可执行文件的路径,默认为  prefix/sbin/nginx.
    • --conf-path=path  设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.
    • --pid-path=path  设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.
    • --error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.
    • --http-log-path=path  设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.
    • --user=name  设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。
    • --group=name  设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。
    • --with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
    • --with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
    • --without-http_gzip_module — 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
    • --without-http_rewrite_module  不编译重写模块。编译并运行此模块需要PCRE库支持。
    • --without-http_proxy_module — 不编译http_proxy模块。
    • --with-http_ssl_module — 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。
    • --with-pcre=path — 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
    • --with-pcre-jit —编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
    • --with-zlib=path —设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。
    • --with-cc-opt=parameters — 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".
    • --with-ld-opt=parameters —设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".

    典型实例(下面为了展示需要写在多行,执行时内容需要在同一行)

    ./configure
        --sbin-path=/usr/local/nginx/nginx
        --conf-path=/usr/local/nginx/nginx.conf
        --pid-path=/usr/local/nginx/nginx.pid
        --with-http_ssl_module
        --with-pcre=../pcre-4.4
        --with-zlib=../zlib-1.1.3
    
    3.nginx简单配置详解(从welcome to nginx开始上手)
    #运行用户
    user nobody;
    #启动进程,通常设置成和cpu的数量相等
    worker_processes  1;
    
    #全局错误日志及PID文件
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    #工作模式及连接数上限
    events {
        #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
        #仅用于linux2.6以上内核,可以大大提高nginx的性能
        use   epoll; 
    
        #单个后台worker process进程的最大并发链接数    
        worker_connections  1024;
    
        # 并发总数是 worker_processes 和 worker_connections 的乘积
        # 即 max_clients = worker_processes * worker_connections
        # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
        # 为什么上面反向代理要除以4,应该说是一个经验值
        # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
        # worker_connections 值的设置跟物理内存大小有关
        # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
        # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
        # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
        # $ cat /proc/sys/fs/file-max
        # 输出 34336
        # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
        # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
        # 使得并发总数小于操作系统可以打开的最大文件数目
        # 其实质也就是根据主机的物理CPU和内存进行配置
        # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
        # ulimit -SHn 65535
    
    }
    
    
    http {
        #设定mime类型,类型由mime.type文件定义
        include    mime.types;
        default_type  application/octet-stream;
        #设定日志格式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
    
        #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
        #对于普通应用,必须设为 on,
        #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
        #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
        sendfile     on;
        #tcp_nopush     on;
    
        #连接超时时间
        #keepalive_timeout  0;
        keepalive_timeout  65;
        tcp_nodelay     on;
    
        #开启gzip压缩
        gzip  on;
        gzip_disable "MSIE [1-6].";
    
        #设定请求缓冲
        client_header_buffer_size    128k;
        large_client_header_buffers  4 128k;
    
    
        #设定虚拟主机配置
        server {
            #侦听80端口
            listen    80;
            #定义使用 www.nginx.cn访问
            server_name  www.nginx.cn;
    
            #定义服务器的默认网站根目录位置
            root html;
    
            #设定本虚拟主机的访问日志
            access_log  logs/nginx.access.log  main;
    
            #默认请求
            location / {
                
                #定义首页索引文件的名称
                index index.php index.html index.htm;   
    
            }
    
            # 定义错误提示页面
            error_page   500 502 503 504 /50x.html;
            location = /50x.html {
            }
    
            #静态文件,nginx自己处理
            location ~ ^/(images|javascript|js|css|flash|media|static)/ {
                
                #过期30天,静态文件不怎么更新,过期可以设大一点,
                #如果频繁更新,则可以设置得小一点。
                expires 30d;
            }
    
            #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
            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;
            }
    
            #禁止访问 .htxxx 文件
                location ~ /.ht {
                deny all;
            }
    
        }
    }
    
    4.nginx平滑升级
    
    
    1. Nginx命令行选项
    2. 启动、停止、重启nginx命令
    3. 如何重新加载nginx配置文件
    4. nginx程序不重启平滑升级可执行文件

     

    nginx命令行参数

    不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置

    -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。

    -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

    -v 显示 nginx 的版本。

    -V 显示 nginx 的版本,编译器版本和配置参数。

     

    nginx控制信号

    可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。

    主进程可以处理以下的信号:

    TERM, INT 快速关闭
    QUIT 从容关闭
    HUP 重载配置
    用新的配置开始新的工作进程
    从容关闭旧的工作进程
    USR1 重新打开日志文件
    USR2 平滑升级可执行程序。
    WINCH 从容关闭工作进程

    尽管你不必自己操作工作进程,但是,它们也支持一些信号:

    TERM, INT 快速关闭
    QUIT 从容关闭
    USR1 重新打开日志文件

     

    nginx 启动、停止、重启命令

    nginx启动

    sudo /usr/local/nginx/nginx     (nginx二进制文件绝对路径,可以根据自己安装路径实际决定)

     

    nginx从容停止命令,等所有请求结束后关闭服务

    ps -ef |grep nginx

    kill -QUIT  nginx主进程号

     

    nginx 快速停止命令,立刻关闭nginx进程

    ps -ef |grep nginx

    kill -TERM nginx主进程号 

    如果以上命令不管用,可以强制停止

    kill -9 nginx主进程号

     

    如果嫌麻烦可以不用查看进程号,直接使用命令进行操作
    其中/usr/local/nginx/nginx.pid 为nginx.conf中pid命令设置的参数,用来存放nginx主进程号的文件
    kill -信号类型(HUP|TERM|QUIT) `cat /usr/local/nginx/nginx.pid` 
    例如

    kill -QUIT `cat /usr/local/nginx/nginx.pid`

    nginx重启命令

    nginx重启可以分成几种类型

    1.简单型,先关闭进程,修改你的配置后,重启进程。
    kill -QUIT `cat /usr/local/nginx/nginx.pid`
    sudo /usr/local/nginx/nginx
    2.重新加载配置文件,不重启进程,不会停止处理请求
    3.平滑更新nginx二进制,不会停止处理请求

     

    使用信号加载新的配置

    Nginx 支持几个信号,能在它运行时控制其操作。其中最普通的是 15 ,用来中止运行的进程:

    # <strong>ps aux | egrep '(PID|nginx)'</strong>
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -/etc/nginx/nginx.conf
    # <strong>kill -15 2213</strong>

    而最有趣的是能平滑改变 nginx 配置的选项(请注意,在重载前,要先测试一下配置文件):

     

    #<strong> nginx -t -c /etc/nginx/nginx.conf</strong>
    2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok
    2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully
    #<strong> ps aux | egrep '(PID|nginx)'</strong>
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root      2213  0.0  0.0   6784  2036 ?        Ss   03:01   0:00 nginx: master process /usr/sbin/nginx -/etc/nginx/nginx.conf
    <strong># kill -HUP 2213</strong>

    当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。

     

    平滑升级到新的二进制代码

    你可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

    首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送 USR2 (kill -USR2 pid)信号给主进程。主进程将重命名它的 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:

     

      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
    33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    在这时,两个 nginx 实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:

     

      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
    33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)
    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了:

     

      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器:

    • 发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
    • 发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
    • 发送 TERM 信号给新的主进程,迫使其退出
    • 如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号

    新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。

    如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行:

     

          PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
        36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
        36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
        36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
        36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

    5.nginx重要指令之location

    location匹配命令

    ~      #波浪线表示执行一个正则匹配,区分大小写
    ~*    #表示执行一个正则匹配,不区分大小写
    ^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
    =      #进行普通字符精确匹配
    @     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

     

    location 匹配的优先级(与location在配置文件中的顺序无关)
    = 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
    普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
    ^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
    最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

    location 优先级官方文档

    1. Directives with the = prefix that match the query exactly. If found, searching stops.
    2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
    3. Regular expressions, in order of definition in the configuration file.
    4. If #3 yielded a match, that result is used. Else the match from #2 is used.
    1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
    2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
    3. 正则表达式,在配置文件中定义的顺序。
    4. 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

     

    例如

    location  = / {
      # 只匹配"/".
      [ configuration A ] 
    }
    location  / {
      # 匹配任何请求,因为所有请求都是以"/"开始
      # 但是更长字符匹配或者正则表达式匹配会优先匹配
      [ configuration B ] 
    }
    location ^~ /images/ {
      # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
      [ configuration C ] 
    }
    location ~* \.(gif|jpg|jpeg)$ {
      # 匹配以 gif, jpg, or jpeg结尾的请求. 
      # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
      [ configuration D ] 
    }

    请求URI例子:

    • / -> 符合configuration A
    • /documents/document.html -> 符合configuration B
    • /images/1.gif -> 符合configuration C
    • /documents/1.jpg ->符合 configuration D

    @location 例子
    error_page 404 = @fetch;

    location @fetch(
    proxy_pass http://fetch;
    )

    6.nginx重要指令之upstream

    7.nginx rewrite功能

    nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。

    该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录,nginx安装方法

    nginx rewrite指令执行顺序:

    1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
    2.执行location匹配
    3.执行选定的location中的rewrite指令
    如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件

    如果循环超过10次,则返回500 Internal Server Error错误

     

    break指令

    语法:break;
    默认值:无
    作用域:server,location,if

    停止执行当前虚拟主机的后续rewrite指令集
    break指令实例:

     if ($slow) {
         limit_rate 10k;
         break;
     }

    if指令

    语法:if(condition){...}
    默认值:无
    作用域:server,location
    对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
    if条件(conditon)可以是如下任何内容:

    • 一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
    • 使用= ,!= 比较的一个变量和字符串
    • 是用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
    • 使用-f ,!-f 检查一个文件是否存在
    • 使用-d, !-d 检查一个目录是否存在
    • 使用-e ,!-e 检查一个文件、目录、符号链接是否存在
    • 使用-x , !-x 检查一个文件是否可执行

    if指令实例

     if ($http_user_agent ~ MSIE) {
         rewrite ^(.*)/msie/$1 break;
     }
    
     if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
         set $id $1;
     }
    
     if ($request_method = POST) {
         return 405;
     }
    
     if ($slow) {
         limit_rate 10k;
     }
    
     if ($invalid_referer) {
         return 403;
     }

    return指令

    语法:return code;

    return code URL;

    return URL;
    默认值:无
    作用域:server,location,if

    停止处理并返回指定状态码(code)给客户端。
    非标准状态码444表示关闭连接且不给客户端发响应头。
    从0.8.42版本起,return 支持响应URL重定向(对于301,302,303,307),或者文本响应(对于其他状态码).
    对于文本或者URL重定向可以包含变量

    rewrite指令

    语法:rewrite regex replacement [flag];
    默认值:无
    作用域:server,location,if
    如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写。
    rewrite按配置文件中出现的顺序执行。flags标志可以停止继续处理。
    如果replacement以"http://"或"https://"开始,将不再继续处理,这个重定向将返回给客户端。
    flag可以是如下参数
    last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
    break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
    redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
    permant 返回301永久重定向
    最终完整的重定向URL包括请求scheme(http://,https://等),请求的server_name_in_redirect和 port_in_redirec三部分 ,说白了也就是http协议 域名 端口三部分组成。

    rewrite实例

     server {
         ...
         rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
         rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
         return 403;
         ...
     }

    如果这些rewrite放到 “/download/” location如下所示, 那么应使用break而不是last , 使用last将循环10次匹配,然后返回 500错误:

     location /download/ {
         rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
         rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
         return 403;
     }

    对于重写后的URL(replacement)包含原请求的请求参数,原URL的?后的内容。如果不想带原请求的参数 ,可以在replacement后加一个问号。如下,我们加了一个自定义的参数user=$1,然后在结尾处放了一个问号?,把原请的参数去掉。

    rewrite ^/users/(.*)/show?user=$1? last;

    如果正则表达regex式中包含 “}” 或 “;”, 那么整个表达式需要用双引号或单引号包围.

    rewrite_log指令


    语法:rewrite_log on|off;
    默认值:rewrite_log off;
    作用域:http,server,location,if
    开启或关闭以notice级别打印rewrite处理日志到error log文件。

    nginx打开rewrite log例子

    rewrite_log on;
    error_log logs/xxx.error.log notice;

    1.打开rewrite on
    2.把error log的级别调整到 notice

    set指令


    语法:set variable value;
    默认值:none
    作用域:server,location,if
    定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。

    uninitialized_variable_warn指令


    语法:uninitialized_variable_warn on | off;
    默认值:uninitialized_variable_warn on
    作用域:http,server,location,if

    控制是否输出为初始化的变量到日志

    8.nginx的虚拟主机功能(nginx多站点,绑定多个域名)

    两个虚拟主机(纯静态-html 支持) - Two Virtual Hosts, Serving Static Files

     

    http {
        server {
            listen          80;
            server_name     www.domain1.com;
            access_log      logs/domain1.access.log main;
            location / {
                index index.html;
                root  /var/www/domain1.com/htdocs;
            }
        }
        server {
            listen          80;
            server_name     www.domain2.com;
            access_log      logs/domain2.access.log main;
            location / {
                index index.html;
                root  /var/www/domain2.com/htdocs;
            }
        }
    }

     

    虚拟主机标准配置(简化) - A Default Catchall Virtual Host

     

    http {
        server {
            listen          80 default;
            server_name     _ *;
            access_log      logs/default.access.log main;
            location / {
                index index.html;
                root  /var/www/default/htdocs;
            }
        }
    }

     

    在父文件夹中建立子文件夹以指向子域名 - Wildcard Subdomains in a Parent Folder

    这是一个添加子域名(或是当DNS已指向服务器时添加一个新域名)的简单方法。需要注意的是,我已经将FCGI配置进该文件了。如果你只想使服务器为静态文件服务,可以直接将FCGI配置信息注释掉,然后将默认主页文件变成index.html。

    这个简单的方法比起为每一个域名建立一个 vhost.conf 配置文件来讲,只需要在现有的配置文件中增加如下内容:

    This is just a really easy way to keep adding new subdomains, or to add new domains automatically when DNS records are pointed at the server. Note that I have included FCGI here as well. If you want to just serve static files, strip out the FCGI config and change the default document to index.html. Rather than creating a new vhost.conf file for every domain, just create one of these:

     

    server {
            # Replace this port with the right one for your requirements
            # 根据你的需求改变此端口
            listen       80;  #could also be 1.2.3.4:80 也可以是1.2.3.4:80的形式
            # Multiple hostnames seperated by spaces.  Replace these as well.
            # 多个主机名可以用空格隔开,当然这个信息也是需要按照你的需求而改变的。
            server_name  star.yourdomain.com *.yourdomain.com www.*.yourdomain.com;
            #Alternately: _ *
            #或者可以使用:_ * (具体内容参见本维基其他页面)
            root /PATH/TO/WEBROOT/$host;
            error_page  404              http://yourdomain.com/errors/404.html;
            access_log  logs/star.yourdomain.com.access.log;
            location / {
                root   /PATH/TO/WEBROOT/$host/;
                index  index.php;
            }
            # serve static files directly
            # 直接支持静态文件 (爱月说:???从配置上看来不是直接支持啊~有问题有问题~)
            location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html){
                access_log        off;
                expires           30d;
            }
            location ~ .php$ {
              # By all means use a different server for the fcgi processes if you need to
              # 如果需要,你可以为不同的FCGI进程设置不同的服务信息
              fastcgi_pass   127.0.0.1:YOURFCGIPORTHERE;
              fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME  /PATH/TO/WEBROOT/$host/$fastcgi_script_name;
              fastcgi_param  QUERY_STRING     $query_string;
              fastcgi_param  REQUEST_METHOD   $request_method;
              fastcgi_param  CONTENT_TYPE     $content_type;
              fastcgi_param  CONTENT_LENGTH   $content_length;
              fastcgi_intercept_errors on;
            }
            location ~ /\.ht {
                deny  all;
            }
         }
    
    9.nginx反向代理功能

    nginx作为web服务器一个重要的功能就是反向代理。

    当然你也可以使用nginx配置正向代理,本是介绍如何配置nginx的反向代理。

    nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。

    配置前的准备工作,后端跑apache服务的ip和端口,也就是说可以通过http://ip:port能访问到你的网站。

    然后就可以新建一个vhost.conf,加入如下内容,记得修改ip和域名为你的ip和域名。

    修改nginx.conf,添加 include quancha.conf 到http{}段, reload nginx就可以了。

    nginx反向代理模板

     

    
    ## Basic reverse proxy server ##
    ## Apache backend for www.quancha.cn ##
    upstream apachephp  {
        server ip:8080; #Apache
    }
    
    ## Start www.quancha.cn ##
    server {
        listen 80;
        server_name  www.quancha.cn;
    
        access_log  logs/quancha.access.log  main;
        error_log  logs/quancha.error.log;
        root   html;
        index  index.html index.htm index.php;
    
        ## send request back to apache ##
        location / {
            proxy_pass  http://apachephp;
    
            #Proxy Settings
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
    
            proxy_temp_file_write_size 64k;
       }
    }
    ## End www.quancha.cn ##
    
    


    10.nginx负载均衡功能

    使用负载均衡的话,可以修改配置http节点如下:#设定http服务器,利用它的反向代理功能提供负载均衡支持

    http {
    
        #设定mime类型,类型由mime.type文件定义
        include             /etc/nginx/mime.types;
        default_type    application/octet-stream;
    
        #设定日志格式
        access_log        /var/log/nginx/access.log;
    
        #省略上文有的一些配置节点
        #。。。。。。。。。。
    
        #设定负载均衡的服务器列表
        upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.1x:3128 weight=5;
            #本机上的Squid开启3128端口,不是必须要squid
            server 192.168.8.2x:80    weight=1;
            server 192.168.8.3x:80    weight=6;
        }
            
        upstream mysvr2 {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.x:80    weight=1;
            server 192.168.8.x:80    weight=6;
        }
    
        #第一个虚拟服务器
        server {
            #侦听192.168.8.x的80端口
            listen             80;
            server_name    192.168.8.x;
    
            #对aspx后缀的进行负载均衡请求
            location ~ .*\.aspx$ {
                #定义服务器的默认网站根目录位置
                root     /root; 
                #定义首页索引文件的名称
                index index.php index.html index.htm;
                
                #请求转向mysvr 定义的服务器列表
                proxy_pass    http://mysvr ;
    
                #以下是一些反向代理的配置可删除.
    
                proxy_redirect off;
    
                #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
                #允许客户端请求的最大单文件字节数
                client_max_body_size 10m; 
    
                #缓冲区代理缓冲用户端请求的最大字节数,
                client_body_buffer_size 128k;
    
                #nginx跟后端服务器连接超时时间(代理连接超时)
                proxy_connect_timeout 90;
    
                #连接成功后,后端服务器响应时间(代理接收超时)
                proxy_read_timeout 90;
    
                #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                proxy_buffer_size 4k;
    
                #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
                proxy_buffers 4 32k;
    
    
                #高负荷下缓冲大小(proxy_buffers*2)
                proxy_busy_buffers_size 64k; 
    
                #设定缓存文件夹大小,大于这个值,将从upstream服务器传
                proxy_temp_file_write_size 64k;    
    
            }
        }
    }
    
    11.nginx web缓存功能

    为什么要做web cache,我想大家最主要的是解决流量的压力。随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力。与此同时某些网站的页面内容并不是经常变化,因此我们可以分两层架构来组织网站。前端web缓存+后端web服务器,可以参看这里配置nginx反向代理配置

    前端web缓存有多重方式实现,原理就是队请求结果页面静态化并设置一个超时期限,缓存页面过期后,新请求到达时重新到后端web服务器获取内容更新;没有nginx前比较流行的方法是squid,但squid不能充分利用处理器的多核特性,越来越多的网站选用nginx来做前端的web缓存。

    要想使用nginx的缓存功能要保证nginx添加了proxy模块。我们可以使用-V选项(大写的V,小写的v是看版本号的)来查看nginx的编译参数。我使用的是默认的参数编译的,如下所示:

     

    root@SNDA-172-17-12-117:/usr/local/nginx# ./nginx -V
    nginx version: nginx/1.2.3
    built by gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
    TLS SNI support enabled
    configure arguments: --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.21 --with-zlib=/usr/local/src/zlib-1.2.7

    nginx的所有模块必须在编译的时候添加,不能再运行的时候动态加载,默认的编译选项下包含的模块,如果你不是显示的用参数关闭它。

    nginx默认安装的模块如下

    模块名称 描述 版本 如何禁用
    Core Control ports, locations, error pages, aliases, and other essentials.   --without-http
    Access Allow/deny based on IP address.   --without-http_access_module
    Auth Basic Basic HTTP authentication.   --without-http_auth_basic_module
    Auto Index Generates automatic directory listings.   --without-http_autoindex_module
    Browser Interpret "User-Agent" string. 0.4.3 --without-http_browser_module
    Charset Recode web pages.   --without-http_charset_module
    Empty GIF Serve a 1x1 image from memory. 0.3.10 --without-http_empty_gif_module
    FastCGI FastCGI Support.   --without-http_fastcgi_module
    Geo Set config variables using key/value pairs of IP addresses. 0.1.17 --without-http_geo_module
    Gzip Gzip responses.   --without-http_gzip_module
    Headers Set arbitrary HTTP response headers.  
    Index Controls which files are to be used as index.  
    Limit Requests Limit frequency of connections from a client. 0.7.20 --without-http_limit_req_module
    Limit Zone Limit simultaneous connections from a client. Deprecated in 1.1.8, use Limit Conn Instead. 0.5.6 --without-http_limit_zone_module
    Limit Conn Limit concurrent connections based on a variable.   --without-http_limit_conn_module
    Log Customize access logs.  
    Map Set config variables using arbitrary key/value pairs. 0.3.16 --without-http_map_module
    Memcached Memcached support.   --without-http_memcached_module
    Proxy Proxy to upstream servers.   --without-http_proxy_module
    Referer Filter requests based on Referer header.   --without-http_referer_module
    Rewrite Request rewriting using regular expressions.   --without-http_rewrite_module
    SCGI SCGI protocol support. 0.8.42 --without-http_scgi_module
    Split Clients Splits clients based on some conditions 0.8.37 --without-http_split_clients_module
    SSI Server-side includes.   --without-http_ssi_module
    Upstream For load-balancing.   --without-http_upstream_ip_hash_module (ip_hash directive only)
    User ID Issue identifying cookies.   --without-http_userid_module
    uWSGI uWSGI protocol support. 0.8.40 --without-http_uwsgi_module
    X-Accel X-Sendfile-like module.  

    proxy模块中常用的指令时proxy_pass和proxy_cache.

    nginx的web缓存功能的主要是由proxy_cache、fastcgi_cache指令集和相关指令集完成,proxy_cache指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache主要用来处理FastCGI动态进程缓存(这里我不是很清楚这两个指令的区别,好像功能上都差不多,尤其后面这句话的意思,是我翻译过来的)。

    确认proxy模块安装好后,下面对nginx的配置文件进行设置,重点部分如标红字体所示。

    这是我的nginx.conf配置文件。

    user www-data;
    worker_processes 1;

    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid logs/nginx.pid;
    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" "$host"';

    #access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #Compression Settings
    gzip on;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    # Some version of IE 6 don't handle compression well on some mime-types,
    # so just disable for them
    gzip_disable "MSIE [1-6].(?!.*SV1)";
    # Set a vary header so downstream proxies don't send cached gzipped
    # content to IE6
    gzip_vary on;
    #end gzip

    #cache begin
    proxy_buffering on;
    proxy_cache_valid any 10m;
    proxy_cache_path /data/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
    proxy_temp_path /data/temp;
    proxy_buffer_size 4k;
    proxy_buffers 100 8k;
    #cache end

    ## Basic reverse proxy server ##
    ## Apache (vm02) backend for www.example.com ##
    upstream apachephp {
    server www.quancha.cn:8080; #Apache1
    }

    ## Start www.quancha.cn ##
    server {
    listen 80;
    server_name *.quancha.cn;

    access_log logs/quancha.access.log main;
    error_log logs/quancha.error.log;
    root html;
    index index.html index.htm index.php;

    ## send request back to apache1 ##
    location / {
    proxy_pass http://apachephp;
    proxy_cache my-cache;
    proxy_cache_valid 200;

    #Proxy Settings
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_max_temp_file_size 0;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    ##End Proxy Settings
    }
    }
    ## End www.quancha.cn ##

    }

    配置文件中以proxy_开头的指令我们大都可以字面意思得到理解。请务必注意一点proxy_cache_path和proxy_temp_path设置的目录需要在同一分区,因为它们之间是硬链接的关系。

    最后启动nginx,来迎接着激动人心的时刻吧。我已经迫不及待了。如果文章哪里有问题或者你遇到了什么麻烦,可以留言让我知道。

    12.nginx php-fpm 配置

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

    nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx

    本文以php-fpm为例介绍如何使nginx支持PHP

    一、编译安装php-fpm

    什么是PHP-FPM

    PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.

    PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

    新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里

    安装前准备
    centos下执行

    yum -y install gcc automake autoconf libtool make
    
    yum -y install gcc gcc-c++ glibc
    
    yum -y install libmcrypt-devel mhash-devel libxslt-devel \
    libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
    zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
    ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
    krb5 krb5-devel libidn libidn-devel openssl openssl-devel

    新版php-fpm安装(推荐安装方式)

    wget http://cn2.php.net/distributions/php-5.4.7.tar.gz
    tar zvxf php-5.4.7.tar.gz
    cd php-5.4.7
    ./configure --prefix=/usr/local/php  --enable-fpm --with-mcrypt \
    --enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath \
    --enable-inline-optimization --with-bz2  --with-zlib --enable-sockets \
    --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
    --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
    --with-gd --with-jpeg-dir
    
    make all install

    旧版手动打补丁php-fpm安装(旧版程序已经没有了,大家新版的吧,这里做个展示)
    wget http://cn2.php.net/get/php-5.2.17.tar.gz
    wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
    tar zvxf php-5.2.17.tar.gz
    gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1
    cd php-5.2.17
    ./configure --prefix=/usr/local/php -with-config-file-path=/usr/local/php/etc\
    -with-mysql=/usr/local/mysql\
    -with-mysqli=/usr/local/mysql/bin/mysql_config -with-openssl -enable-fpm -enable-mbstring\
    -with-freetype-dir -with-jpeg-dir -with-png-dir -with-zlib-dir -with-libxml-dir=/usr -enable-xml\
    -with-mhash -with-mcrypt -enable-pcntl -enable-sockets  -with-bz2 -with-curl -with-curlwrappers\
    -enable-mbregex -with-gd -enable-gd-native-ttf -enable-zip -enable-soap -with-iconv -enable-bcmath\
    -enable-shmop -enable-sysvsem -enable-inline-optimization -with-ldap -with-ldap-sasl -enable-pdo\
    -with-pdo-mysql
    make all install

    以上两种方式都可以安装php-fpm,安装后内容放在/usr/local/php目录下

    以上就完成了php-fpm的安装。

    下面是对php-fpm运行用户进行设置

    cd /usr/local/php
    cp etc/php-fpm.conf.default etc/php-fpm.conf
    vi etc/php-fpm.conf

    修改
    user = www-data
    group = www-data

    如果www-data用户不存在,那么先添加www-data用户
    groupadd www-data
    useradd -g www-data www-data

    二、编译安装nginx

    然后按照http://www.nginx.cn/install 安装nginx

    三、修改nginx配置文件以支持php-fpm

    nginx安装完成后,修改nginx配置文件为,nginx.conf

    其中server段增加如下配置,注意标红内容配置,否则会出现No input file specified.错误

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    四、创建测试php文件

    创建php文件

    在/usr/local/nginx/html下创建index.php文件,输入如下内容

    <?php
        echo phpinfo();
    ?>

    五、启动服务

    启动php-fpm和nginx

    /usr/local/php/sbin/php-fpm 
    #手动打补丁的启动方式/usr/local/php/sbin/php-fpm start
    
    sudo /usr/local/nginx/nginx

    php-fpm关闭重启见文章结尾

    六、浏览器访问

    访问http://你的服务器ip/index.php,皆可以见到php信息了。

    安装php-fpm时可能遇到的错误:

    1. php configure时出错

    configure: error: XML configuration could not be found

    apt-get install libxml2 libxml2-dev  (ubuntu下)
    yum -y install libxml2 libxml2-develcentos下)

    2. Please reinstall the BZip2 distribution

    wget http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz
    tar -zxvf bzip2-1.0.5.tar.gz
    cd bzip2-1.0.5
    make
    make install

    3. php的配置文件中有一行--with-mysql=/usr
    安装的时候提示:
    configure: error: Cannot find MySQL header files under yes.
    Note that the MySQL client library is not bundled anymore.

    这是由于安装mysql时没有安装mysql头文件,或者是路径指定不正确,php找不到mysql的头文件引起的错误提示。
    解决方法。
    (1.) 查看你的系统有没有安装mysql header
    find / -name mysql.h
    如果有。请指定--with-mysql=/跟你的正常路径。
    如果没有。请看下一步。
    (2.)redhat安装
    rpm -ivh MySQL-devel-4.1.12-1.i386.rpm
    (3.)ubuntu安装
    apt-get install libmysqlclient15-dev
    (4.)最后一步php的配置选项添加--with-mysql=/usr即可!

    4.No input file specified.

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

    5. 如果php configure时缺库,可以先安装库(ubuntu下)

    sudo apt-get install make bison flex gcc patch autoconf subversion locate
    sudo apt-get install libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev

    6. mcrypt.h not found. Please reinstall libmcrypt

    apt-get install libmcrypt-dev

    或者

    cd /usr/local/src
    wget http://softlayer.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz
    tar -zxvf libmcrypt-2.5.8.tar.gz
    cd /usr/local/src/libmcrypt-2.5.8
    ./configure --prefix=/usr/local
    make
    make install

    7. php-fpm 5.4.7 如何关闭 重启?

    php 5.4.7 下的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,需要使用信号控制:

    master进程可以理解以下信号

    INT, TERM 立刻终止 QUIT 平滑终止 USR1 重新打开日志文件 USR2 平滑重载所有worker进程并重新载入配置和二进制模块

    示例:

    php-fpm 关闭:

    kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

    php-fpm 重启:

    kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

    查看php-fpm进程数:

    ps aux | grep -c php-fpm

    8.命令行下执行php,提示找不到命令

    -bash: /usr/bin/php: No such file or directory

    vi /etc/profile

    在文件底部增加一行配置
    export PATH=/usr/local/php/bin:$PATH

    保存退出

    source /etc/profile

    13.nginx屏蔽ip

    采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走。

    本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现。

    1.查找要屏蔽的ip

    awk '{print $1}' nginx.access.log |sort |uniq -c|sort -n

    nginx.access.log 为日志文件,

    会到如下结果,前面是ip的访问次数,后面是ip,很明显我们需要把访问次数多的ip并且不是蜘蛛的ip屏蔽掉,本例当中我们屏蔽掉165.91.122.67

     ...
      13610 202.112.113.192
      95772 180.169.22.135
     337418 219.220.141.2
     558378 165.91.122.67

    2.在nginx的安装目录下面,新建屏蔽ip文件,命名为blockip.conf,以后新增加屏蔽ip只需编辑这个文件即可。 加入如下内容

    deny 165.91.122.67; 

    保存一下。

    3.在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit_except语句块,需要注意相对路径,本例当中nginx.conf,blocksip.conf在同一个目录中。

    include blockip.conf; 

     

    4.重启一下nginx的服务:/usr/local/nginx/nginx -s reload 就可以生效了。

    高级用法:

    屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。

    # 屏蔽单个ip访问

    deny IP; 

    # 允许单个ip访问

    allow IP; 

    # 屏蔽所有ip访问

    deny all; 

    # 允许所有ip访问

    allow all; 

    #屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令

    deny 123.0.0.0/8

    #屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令

    deny 124.45.0.0/16

    #屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令

    deny 123.45.6.0/24

    如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
    那需要你在blockip.conf中这样写

    allow 1.1.1.1; 
    allow 1.1.1.2;
    deny all; 

    单独网站屏蔽IP的方法,把include blocksip.conf; 放到网址对应的在server{}语句块,
    所有网站屏蔽IP的方法,把include blocksip.conf; 放到http {}语句块。

    展开全文
  • 公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目又搞定了,但是当你拿过来合同(或者任务委托书)一看,关于项目范围的说明只有寥寥行,要么是一些高举打的套话,要么只说项目都包含什么样的...
          凡是做过不止一个国内的项目的项目主管人员可能都经历过这种场合:公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目又搞定了,但是当你拿过来合同(或者任务委托书)一看,关于项目范围的说明只有寥寥数行,要么是一些高举高打的套话,要么只说项目都包含什么样的模块,而对具体的业务只是一两句话就完事儿了,如果是一位身经百战的管理者并且对于项目的具体业务很熟悉还可以,如果不是那该如何开始这个项目呢?还有一种情况,客户在项目进程中,不断对移交的系统提出修改意见,更可气的是,有些问题开始提出更改,某一天客户突然就发现情况不对,又要求你给改回来,看起来客户的需求总是无穷无尽,作为项目的承担者该如何应对这种令人沮丧的局面呢?

      一、客户需求为何过渡膨胀

      作为项目的承担着,在规定时间用有限的资源来保质保量的完成项目,让公司和最终客户都满意是项目组的神圣职责。但是为了让客户满意就要满足客户所有的需求吗?因为不断满足客户的需求会不会导致项目失败怎么办呢?为了弄清楚这些原因,首先应该找到这些问题发生的根源。

      1. 签订合约的时候,项目范围描述不清楚。这是最常见的问题之一,也正是早期的这些问题没有引起项目组的足够重视,导致后期项目无穷无尽的修改。

      2. 客户和项目组对写成纸面文件的需求理解不一致。这种情况也较常见,虽然客户已经确认了项目组提交的项目范围说明书,项目组也是完全按照这个文件规定的内容做的,但是客户还要求改,当项目组拿着纸面的文件与客户对质的时候,才发现客户也认可这需求,但是同一件事情,客户的认知和项目组的认知完全不同。举个简单的例子:客户要求系统能够电子签名,项目组的成员就模拟了一个,自动产生客户的签名在系统中,但是当移交给客户的时候才发现,客户要求的电子签名实际上是想把原来手写签名的工作也移植到电子化的系统中,让领导能够通过画图的方式产生一个手写的签名在文档中应该落签字的地方!有时候就是当初一点点疏忽,导致项目后期大量修改甚至项目延期。

      3. 客户总有在结项之前把每一件事情都做得淋漓尽致的初衷。一般来讲,在项目结项之前,客户都会把所有的想法尽量逼着项目组解决,因为一般的客户心理都会认为:一旦结项了,再想找项目组成员对业务系统进行修改可就难了,因为IT公司人员流动性强的特点,即便以后能够找到承包商,当初做项目的项目组成员也不一定在了,或者很多公司因为业务繁忙,已经顾不得原来已经结款的客户了。

      4. 项目组人员总是无条件迁就客户,客户有求必应。这种做法的出发点是好的,目的是要客户完全满意,但是实际上这种做法不一定能达到目的。一般的客户需求都是无底洞,这样做对整个项目经常也会带来很多负面影响。当然,如果过分控制客户的需求,客户肯定也不会满意。

      二、解决办法

      针对上述项目问题以及发生的原因,结合以前一些项目的教训经验,我感觉可以通过以下几点来有效屏蔽客户需求过渡膨胀的问题,让项目完成得更加漂亮。

      未雨绸缪:

      项目初期一定要制定清晰的目标和项目范围,并且让项目主要干系人(最重要的当然是最终客户了)确认。
      不管通过什么途径得到的项目,作为项目主管,在项目前期,可以分三步走。

      第一个想到的问题应该是“为什么”,也就是客户做项目有什么目的,知道这些以后,才能在以后的工作中更加想客户之所想,不至于项目方向错误,最终争取达到双赢得局面。

      知道了“为什么”以后,接下来就要非常清晰的知道“做什么”,有一个比较好的办法就是用一两句非常简洁的话概括出来整个项目,并且能够用这种方法概括出项目中的各个子任务,并且能够让前台业务人员和后台研发人员都能够心领神会,那么说明项目主管对项目的内容在大方向上已经有很好的把握了。

      最后就要弄明白“怎么做”了,对于比较陌生的项目来讲,这一阶段工作量比较大也很重要,在这个阶段多花点精力绝对值得,当然,根据具体的情况,也可以在这个需求调研阶段简化一些不必要的工作,这需要项目主管具备平衡那些彼此冲突的项目目标的能力。在实际的工作中,这需要一个过程,值得注意的是,在需求整理完毕形成文档以后,最好先让项目组人员把自己总结的需求跟客户比较详细的讲一遍,在实际的操作中,这种做法不仅能够把项目人员与客户在业务层面的歧义问题数量大大降低,还可以很好的发先潜在的问题,并且掌握一些沟通技巧,也会让客户更能深刻的感觉到承包商对他们的重视。另外,如果项目前期得需求人员对技术非常不了解,根据实际情况最好在需求每次提交给客户前与研发人员沟通,以避免不必要的给客户的承诺,更加准确的界定工作量。总之,有效的计算出项目范围将会占用一定的时间,但是同样会节省资源、资金以及解决项目今后令人头疼的问题,例如:需求(范围)变更。

      另外一个很值得注意的问题是:项目的需求经过几次确认以后,要让有权力的客户明确确认,最好有书面签字,这个有说服力的文件会在以后客户发生需求变更的时候起到很好的作用,很显然,因为客户已经签字确认,总是反悔肯定理亏呀,即便因为业务变化不得不对项目进行大的调整以至于项目延期,这种情况下也会是项目组处于有利地位,不至于让自己的公司非常不满,甚至可以以此为依据来要求客户重新考虑项目经费。当然,对于客户来讲,通过这些很好理解的需求的阐述,也会以此作为以后交付产品的依据,做到心里有数,消除不必要的疑虑,这个对双方有同等的约束力,很有好处。

      灵活应变:遇到变更要与客户沟通

      经常有这种情况,项目都已经执行到最后阶段,客户突然提出了新的要求或者要求对已有需求进行更改,这会让项目主管非常为难:一方面要尽量满足客户的需求,另一方面又不能对系统做太大的改动,影响进度计划。这种情况发生除了和需求阶段有关以外,同时说明在实施过程中没有与客户有密切的联系,缺乏沟通。

      从客户的心理来分析。由于软件的特殊性,客户通常非常关注后期的服务,尤其是在国内大家做的软件绝大多数都是与实际业务紧密相连的。作为项目管理者,非常忌讳的是在做项目的过程中对客户置之不理,而最后交付的时候才与客户突然发生大量接触,本来后期的实施过程出现问题的可能性最大,之前与客户又比较生疏,很可能会造成非常大的风险。比较稳妥的办法就是在项目进程中也要让项目组与客户保持联系,相互了解,建立更加融洽和谐的沟通气氛,为以后关键的实施移交阶段可能与客户发生的冲突做好准备。值得一提的是:在项目进程中阶段性的给客户呈现一下项目的进展状况,让客户对项目有一个更加直接可视化的认识,更能及早的发现解决问题免除后患,在不断的沟通过中,应该让客户认识到项目组时时站在客户角度着想,让客户的主要负责人也能深深的感觉到他们是项目组的重要组成部分、荣辱与共,并且项目组能为客户提供完善持续的后续服务,这样可以有效的避免客户绞尽脑汁想把所有的事情在第一次结项之前做完。

      即便前期工作做得再好,很多情况下,需求变更是不可避免的。项目主管通过良好的沟通机制随时掌握变更情况和可能发生的变更,一旦发生了变更,项目组一定要冷静处理这些问题,一般可以按照产品分析—〉成本/收益分析—〉备选方案—〉专家判断这四个步骤来首先评估需求变更,并且尽快形成项目范围变更书面的说明书,它是以后项目决策的基础,当然比较稳妥地办法还是让客户对明显发生的变更做出确定(选择签字最好),尤其是在评估了变更可能导致的工作量增加以后,让客户认识到过多的变更很显然会造成项目延期,客户对此也要负责任。

      在客户提出需求变更的时候,一定要掌握一定的沟通技巧,一定不要总是无条件迁就客户。一般来讲客户对IT都不太熟悉,他们认为很简单的事情,可能要花费项目组大量的无谓得多余精力,所以千万不要认为客户所说的就一定是他想得到的!大部分客户都是第一时间突然脑海里面冒出的火花,所以项目组人员要冷静的分析一下:客户到底想要实现什么目的,抓住问题得本质。一般来讲,实现客户本质的需求有很多种办法。在与客户的沟通中,一定避免与客户正面冲突。在初期认真倾听客户意见,多问一些“您还有什么想法”之类的问题,等客户把他的想法都表述清楚以后,项目组成员成员最好迅速评估一下客户的建议,如果实现起来实在太困难,可以给客户一些更加中肯的提议,多问些“您看这样行不行?其实可以达到同样的目的。”之类的问题,最后还有一个重要的过程就是要与客户确认这次沟通的结论。

      总之,项目整体管理是平衡那些彼此冲突的项目目标的一种能力。看起来简单,但是实际上很复杂,项目主管在项目进程中要学会如何对常见变更进行控制,控制客户需求的肆意膨胀,保证项目健康稳定的进行。

      1. 在项目启动时,公司会批准一个新的项目阶段的开始。

      2. 在范围计划编制的过程中,将制定一份说明书来描述在项目中将做什么。

      3. 在范围定义中,项目的主要部分被分成更小的部分。

      4. 在范围审核时,需要验收项目的范围。

      5. 在范围变更控制中,随着时间的过去,需要对项目范围变更进行监督。

    展开全文
  • * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成帅的曲线函数) * * 高中的数学公式咋都忘了涅,写出来 * 正弦型函数解析式:y=Asin(ωx+φ)+b * 各常数值对函数图像的影响: * A:...
  • 公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目已经搞定了,但是当你拿过来合同(或者任务委托书)一看,关于需求,项目范围的说明只有寥寥行,要么是一些高举打的套话,要么只说项目都包含...
     
       做项目管理经常会遇到这样的场景:公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目已经搞定了,但是当你拿过来合同(或者任务委托书)一看,关于需求,项目范围的说明只有寥寥数行,要么是一些高举高打的套话,要么只说项目都包含什么样的模块,而对具体的业务只是一两句话就完事儿了,如果是一位身经百战的管理者并且对于项目的具体业务很熟悉还可以,如果不是那该如何开始这个项目呢?还有一种情况,客户在项目进程中,不断对阶段交付的系统提出各种修改意见,更令人气愤的是,有些问题开始提出更改,也有个能进行反复的更改,但是某一天客户突然就发现情况不对,又要求你给改回来,看起来客户的需求总是无穷无尽,作为项目的管理者该如何应对这种令人沮丧的局面呢?
     
    一、客户需求为何过渡蔓延
     
      作为项目的管理着,在规定时间用有限的资源来保质保量的完成项目,让公司和最终客户都满意是项目组的神圣职责。但是为了让客户满意就要满足客户所有的需求吗?因为不断满足客户的需求会不会导致项目失败怎么办呢?为了弄清楚这些原因,首先应该找到这些问题发生的根源。
     
      1.签订合同的时候,项目范围描述不清楚。这是最常见的问题之一,也正是早期的这些问题没有引起项目组的足够重视,导致后期项目无穷无尽的修改。
     
      2.客户和项目组对写成纸面文件的需求理解不一致。这种情况也较常见,虽然客户已经确认了项目组提交的项目范围说明书,项目组也是完全按照这个文件规定的内容做的,但是客户还要求改,当项目组拿着纸面的文件与客户对质的时候,才发现客户也认可这需求,但是同一件事情,客户的认知和项目组的认知完全不同。举个简单的例子:客户要求系统能够电子签名,项目组的成员就模拟了一个,自动产生客户的签名在系统中,但是当移交给客户的时候才发现,客户要求的电子签名实际上是想把原来手写签名的工作也移植到电子化的系统中,让领导能够通过画图的方式产生一个手写的签名在文档中应该落签字的地方!有时候就是当初一点点疏忽,导致项目后期大量修改甚至项目延期。
     
      3.客户总有在结项之前把每一件事情都做得淋漓尽致的初衷。一般来讲,在项目结项之前,客户都会把所有的想法尽量逼着项目组解决,因为一般的客户心理都会认为:一旦结项了,再想找项目组成员对业务系统进行修改可就难了,因为IT公司人员流动性强的特点,即便以后能够找到承包商,当初做项目的项目组成员也不一定在了,或者很多公司因为业务繁忙,已经顾不得原来已经结款的客户了。
     
      4.项目组人员总是无条件迁就客户,客户有求必应。这种做法的出发点是好的,目的是要客户完全满意,但是实际上这种做法不一定能达到目的。一般的客户需求都是无底洞,这样做对整个项目经常也会带来很多负面影响。当然,如果过分控制客户的需求,客户肯定也不会满意。
     
    二、解决办法
     
      针对上述项目问题以及发生的原因,结合以前一些项目的教训经验,我感觉可以通过以下几点来有效屏蔽客户需求过渡膨胀的问题,让项目完成得更加漂亮。
         
            1、未雨绸缪

     
      项目初期一定要制定清晰的目标和项目范围,并且让项目主要干系人(最重要的当然是最终客户了)确认。
     
      不管通过什么途径得到的项目,作为项目主管,在项目前期,可以分三步走。
     
      第一个想到的问题应该是“为什么”,也就是客户做项目有什么目的,知道这些以后,才能在以后的工作中更加想客户之所想,不至于项目方向错误,最终争取达到双赢得局面。
     
      知道了“为什么”以后,接下来就要非常清晰的知道“做什么”,有一个比较好的办法就是用一两句非常简洁的话概括出来整个项目,并且能够用这种方法概括出项目中的各个子任务,并且能够让前台业务人员和后台研发人员都能够心领神会,那么说明项目主管对项目的内容在大方向上已经有很好的把握了。
     
      最后就要弄明白“怎么做”了,对于比较陌生的项目来讲,这一阶段工作量比较大也很重要,在这个阶段多花点精力绝对值得,当然,根据具体的情况,也可以在这个需求调研阶段简化一些不必要的工作,这需要项目主管具备平衡那些彼此冲突的项目目标的能力。在实际的工作中,这需要一个过程,值得注意的是,在需求整理完毕形成文档以后,最好先让项目组人员把自己总结的需求跟客户比较详细的讲一遍,在实际的操作中,这种做法不仅能够把项目人员与客户在业务层面的歧义问题数量大大降低,还可以很好的发先潜在的问题,并且掌握一些沟通技巧,也会让客户更能深刻的感觉到承包商对他们的重视。另外,如果项目前期得需求人员对技术非常不了解,根据实际情况最好在需求每次提交给客户前与研发人员沟通,以避免不必要的给客户的承诺,更加准确的界定工作量。总之,有效的计算出项目范围将会占用一定的时间,但是同样会节省资源、资金以及解决项目今后令人头疼的问题,例如:需求(范围)变更。
     
      另外一个很值得注意的问题是:项目的需求经过几次确认以后,要让有权力的客户明确确认,最好有书面签字,这个有说服力的文件会在以后客户发生需求变更的时候起到很好的作用,很显然,因为客户已经签字确认,总是反悔肯定理亏呀,即便因为业务变化不得不对项目进行大的调整以至于项目延期,这种情况下也会是项目组处于有利地位,不至于让自己的公司非常不满,甚至可以以此为依据来要求客户重新考虑项目经费。当然,对于客户来讲,通过这些很好理解的需求的阐述,也会以此作为以后交付产品的依据,做到心里有数,消除不必要的疑虑,这个对双方有同等的约束力,很有好处。
     
          2、灵活应变:遇到变更要与客户沟通
     
      经常有这种情况,项目都已经执行到最后阶段,客户突然提出了新的要求或者要求对已有需求进行更改,这会让项目主管非常为难:一方面要尽量满足客户的需求,另一方面又不能对系统做太大的改动,影响进度计划。这种情况发生除了和需求阶段有关以外,同时说明在实施过程中没有与客户有密切的联系,缺乏沟通。
     
      从客户的心理来分析。由于软件的特殊性,客户通常非常关注后期的服务,尤其是在国内大家做的软件绝大多数都是与实际业务紧密相连的。作为项目管理者,非常忌讳的是在做项目的过程中对客户置之不理,而最后交付的时候才与客户突然发生大量接触,本来后期的实施过程出现问题的可能性最大,之前与客户又比较生疏,很可能会造成非常大的风险。比较稳妥的办法就是在项目进程中也要让项目组与客户保持联系,相互了解,建立更加融洽和谐的沟通气氛,为以后关键的实施移交阶段可能与客户发生的冲突做好准备。值得一提的是:在项目进程中阶段性的给客户呈现一下项目的进展状况,让客户对项目有一个更加直接可视化的认识,更能及早的发现解决问题免除后患,在不断的沟通过中,应该让客户认识到项目组时时站在客户角度着想,让客户的主要负责人也能深深的感觉到他们是项目组的重要组成部分、荣辱与共,并且项目组能为客户提供完善持续的后续服务,这样可以有效的避免客户绞尽脑汁想把所有的事情在第一次结项之前做完。
     
      即便前期工作做得再好,很多情况下,需求变更是不可避免的。项目主管通过良好的沟通机制随时掌握变更情况和可能发生的变更,一旦发生了变更,项目组一定要冷静处理这些问题,一般可以按照产品分析—〉成本/收益分析—〉备选方案—〉专家判断这四个步骤来首先评估需求变更,并且尽快形成项目范围变更书面的说明书,它是以后项目决策的基础,当然比较稳妥地办法还是让客户对明显发生的变更做出确定(选择签字最好),尤其是在评估了变更可能导致的工作量增加以后,让客户认识到过多的变更很显然会造成项目延期,客户对此也要负责任。
     
      在客户提出需求变更的时候,一定要掌握一定的沟通技巧,一定不要总是无条件迁就客户。一般来讲客户对IT都不太熟悉,他们认为很简单的事情,可能要花费项目组大量的无谓得多余精力,所以千万不要认为客户所说的就一定是他想得到的!大部分客户都是第一时间突然脑海里面冒出的火花,所以项目组人员要冷静的分析一下:客户到底想要实现什么目的,抓住问题得本质。一般来讲,实现客户本质的需求有很多种办法。在与客户的沟通中,一定避免与客户正面冲突。在初期认真倾听客户意见,多问一些“您还有什么想法”之类的问题,等客户把他的想法都表述清楚以后,项目组成员成员最好迅速评估一下客户的建议,如果实现起来实在太困难,可以给客户一些更加中肯的提议,多问些“您看这样行不行?其实可以达到同样的目的。”之类的问题,最后还有一个重要的过程就是要与客户确认这次沟通的结论。
           项目范围管理流程:
              
      总之,基本上所有的项目都会遇到项目范围的问题,项目范围管理是平衡那些彼此冲突的项目目标的一种能力。看起来简单,但是实际上很复杂,项目主管在项目进程中要学会如何对常见变更进行控制,控制客户需求的肆意蔓延,保证项目健康稳定的进行。
      1.在项目启动时,公司会批准一个新的项目阶段的开始。
      2.在范围计划编制的过程中,将制定一份说明书来描述在项目中将做什么。
      3.在范围定义中,项目的主要部分被分成更小的部分。
      4.在范围审核时,需要验收项目的范围。
      5.在范围变更控制中,随着时间的过去,需要对项目范围变更进行监督。
            
            在实际项目中遇到需求的问题,你又是怎么处理的呢?
     

           转载请注明原文地址:http://www.cnblogs.com/chenliangcl/p/7420321.html 

    转载于:https://www.cnblogs.com/chenliangcl/p/7420321.html

    展开全文
  • 公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目又搞定了,但是当你拿过来合同(或者任务委托书)一看,关于项目范围的说明只有寥寥行,要么是一些高举打的套话,要么只说项目都包含什么样的...
  • 公司的销售人员兴冲冲的拿来一份与客户签订的合同交给你,声称这项目又搞定了,但是当你拿过来合同(或者任务委托书)一看,关于项目范围的说明只有寥寥行,要么是一些高举打的套话,要么只说项目都包含什么样的...
  • IT项目如何好的控制客户需求

    千次阅读 2005-01-06 13:16:00
    关于项目范围的说明只有寥寥行,要么是一些高举打的套话,要么只说项目都包含什么样的模块,而对具体的业务只是一两句话就完事儿了,如果是一位身经百战的管理者并且对于项目的具体业务很熟悉还
  • 数字越小说明处理器集成电路的精细度越高,在同样的单位面积的IC可以有更多的电路,功耗越低,温度也更低,芯片面积更小,处理器频率可以提升的更高。 为什么低制程工艺芯片成本急剧提升,量产困难呢? 一个原因...
  • 面试十人有感

    2020-11-28 06:20:45
    一个机器建造出来可以通过说明书的方式让流水线工人去使用,就算一批工人走了,还可以再去招一批,你并没有什么核心竞争力。但是对于会修理机器的或者会造机器的人来说,找工作会很好找&#...
  • 游标卡尺是工业上常用的测量长度的仪器,可直接用来测量精度较...卡尺的各部位名称M型标准卡尺ABS显卡尺▼游标卡尺用前说明01量具非工具尽量别超范围使用拿来当锤子、飞镖、烧烤钳子、油漆搅拌器……你在说什么?...
  • 文章目录1.关于节点个说明2.ZooKeeper集群的容错3 ZooKeeper集群可用...ZooKeeper的单机服务 (也就是单节点, 或着单进程) 虽然便于开发与测试, 但并不适合在生产环境使用 —— 生产环境为了服务的可用以及...
  •   流提供了一种让我们可以比集合更高级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现他。我们将操作的调度留给具体实现去解决。例如,假设我们想要计算某个属性的平均...
  •  《圣经》“肋骨造人”的故事说明了男性与女性本应是地位平等且权力一致,然而又是什么使得“男尊女卑”的传统观念影响了我们的社会千年,直到现在女性依旧处于劣势地位呢? 今天我方认为,当今社会,女性比...
  • 什么是VLAN

    2013-10-23 09:59:12
     成本高昂的网络升级需求减少,现有带宽和上行链路的利用率更高,因此可节约成本。 性能提高  将第二层平面网络划分为多个逻辑工作组(广播域)可以减少网络上不必要的流量并提高性能。 提高IT员工效率  VLAN为...
  • 史上超高压缩软件2009

    2009-09-04 14:46:16
    4-6模式时间较长20%,压缩率更高,需内存多20%.另外修正非默认模式的文件列表错误. 0.211 修正了文件属性和时间的还原及目录属性的还原,目录时间的还原还没有解决. 0.212 加入了一些细节问题,如文件,压缩率,压缩...
  • 你的工资与邻居家的工资

    热门讨论 2019-06-17 21:09:09
    因此,平均工资并不能说明什么,一个公司或阶层的的工资数更有说服力。 在我们的日常生活还有一种工资叫做朋友的朋友的工资或邻居家的工资。茶余饭后常听朋友或朋友的朋友说某人在某某公司从事什么岗位,工资...
  • 通过这一点我们自然而然地想到梯度应该是导数向高维的推广。换句话说,梯度是矢量,而某点的导数是个常量。 梯度下降算法 如果函数 f(θ)f(\theta )f(θ)是凸函数,那么就可以使用梯度下降算法进行

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 376
精华内容 150
关键字:

中数更高说明什么