nginx +fastcgi搭建高负载服务器

 

一 安装nginx fastcgi 简介

   1 nginx是一个个高性能的 HTTP 和反向代理服务器,并且nginx 占用的系统资源更少
   2 xcache 是一个开源的opcode 缓存器/优化器,能提高服务器上的php 性能,xcache 通过把编译PHP后的数据缓冲到共享内存从而避免重复编译过程,能够直接使用
    缓冲区已编译的代码从而提高速度,降低服务器的负载.
   3  gperftools 是google 开发的一款优秀的LinuxC/C++ 程序的性能剖析及优化工具,他提供了将目标程序运行时所消耗的CPU 时间片进行剖析和图形输出剖析结果的功能。 
     gperftools 包含四个工具,
     分别是:TCMalloc,heap-checker,heap-profiler和cpu-profiler,TCMalloc是gperftools其中一个工具,由于优化C++写的多线程应用,与标准的glibc库的malloc 相比,
     TCMalloc 自啊内存的分配效率和速度要高, 可以在高并发的情况下很好的控制内存的使用,提供服务器的性能,降低负载.
   4 所需软件
      libunwind-1.0.1.tar.gz
      gperftools-2.0.tar.gz
      pcre-8.31.tar.gz
      nginx-1.2.5.tar.gz
      #nginx 第三方模块,开启nginx etag,默认情况下nginx 是没有该模块的
      nginx-static-etags-master.zip        
      php-5.3.19.tar.gz
      xcache-3.0.0.tar.gz
      mysql-5.0.91.tar.gz


二 libunwind 安装配置

     #tar -zxvf libunwind-1.0.1.tar.gz
     #cd libunwind-1.0.1/
     #CFLAGS=-fPIC ./configure
     #make CFLAGS=-fPIC
     #make CFLAGS=-fPIC install
     注:libunwind 库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、
        用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API


三 gperftools安装配置

  1 #tar xf   gperftools-2.0.tar.gz
    #cd   gperftools-2.0
    #./configure --enable-frame-pointers
    #make && make install
    注:如果是32位系统,可以不添加 –enable-frame-pointers,如果是64位系统,并且之前没有安装libunwind,
    那么一定要添加 –enable-frame-pointers 参数


四 pcre 安装

   #tar  xf  pcre-8.31.tar.gz
   #cd   pcre-8.31
   #./configure && make && make install


五 nginx 安装配置

  1 #tar  xf nginx-1.2.5.tar.gz
   #cd nginx-1.2.5
   # useradd -s /sbin/noloin  nginx
   #./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module
    --with-http_ssl_module --with-google_perftools_module --with-pcre --without-mail_pop3_module 
    --without-mail_imap_module  --without-mail_smtp_module --with-http_gzip_static_module 
    --add-module=../nginx-static-etags-master
   #make && make install 
  2 nginx  配置优化
    #vim  nginx.conf
     
   user  nginx nginx ;
   worker_processes  12;
   error_log  logs/error.log  notice;
   pid        logs/nginx.pid;
   #使用google_perftools优化nginx 内存使用
   google_perftools_profiles /tmp/tcmalloc;
   worker_cpu_affinity  000000000001 000000000010 0000000000100 000000001000 000000010000 000000100000 000001000000 000010000000  000100000000 001000000000 010000000000 100000000000;
   worker_rlimit_nofile 819200;
   events {
      use  epoll;
      worker_connections  8000;
   }
 http {
   include       mime.types;
   default_type  application/octet-stream;
   #定义nginx 日志格式
   log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log  logs/access.log  main; 
  #charst
  charset UTF-8;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 2k;
  large_client_header_buffers 4 128k;
  client_max_body_size 8m;
   sendfile        on;
   tcp_nopush     on;
   server_tokens off;
   #keepalive_timeout  0;
   keepalive_timeout  120;   
   #gzip  on;
   gzip  on;
   gzip_proxied  any;
   gzip_min_length   1k;
   gzip_buffers   4 16k;
   gzip_http_version 1.1;
   gzip_comp_level 3;
   gzip_types text/plain  text/css text/xml  text/javascript  application/x-javascript  charset=utf-8 application/x-java-archive application/xml image/gif image/png image/jpeg image/tiff image/x-ms-bmp application/x-shockwave-flash ;
   gzip_vary on;
  #fastcgi  set
   #设置连接后端fastcgi 超时时间
   fastcgi_connect_timeout 180;
   #设置FastCGI传送请求的超时时间
   fastcgi_send_timeout 300;
   #设置 接收FastCGI应答的超时时间
   fastcgi_read_timeout 300;
   #设置于指定读取FastCGI应答第一部分需要多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头)
   #   ,可以设置为fastcgi_buffers选项指定的缓冲区大小。
   fastcgi_buffer_size 128k;
   #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,
    #那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp
    指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。
    一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,
    那么可以把这个值设置为“16 16k”、“4 64k”等。
   fastcgi_buffers 4  256k;
   fastcgi_busy_buffers_size 256k;
   #表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
   fastcgi_temp_file_write_size 256k;
   fastcgi_intercept_errors on;
   fastcgi_ignore_client_abort on ;    
   server {
       listen       80;
       server_name  ad.frank.com.cn;
       #设置只允许访问域名,非域名返回403错误
       if ($host !~ 'ad.frank.com.cn') {
               return 403;
             }
       index index.php index.html  index.htm ;
       root /usr/local/nginx/html;
       #charset koi8-r;
        charset UTF-8;
       #设置允许访问openx 管理后台的IP 地址
        location ^~ /www/admin/ {
            allow  192.168.1.0/24;
            allow  127.0.0.1;
            deny all;       
        location ~ .*\.(php|php5)?$ {
           fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           include  fastcgi_params;
             }
        }
     #设置查看Xcache 状态及允许访问的IP 地址
     #set Xcache status 
       location ^~ /xcache/ {
             allow  192.168.1.0/24;
             deny all;
         
          location ~ .*\.(php|php5)?$ {
           fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           include  fastcgi_params;
              }
         } 
     #设置php-fpm 的状态页面及允许访问的IP 
     #set php-fpm status 
      location ^~ /(status)$ {
         
          allow 192.168.1.0/24;
          deny all;
           fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           include  fastcgi_params;
        }
       #access_log  logs/host.access.log  main;
       location / {
           root   /usr/local/nginx/html;
           index index.php  index.html index.htm;
       }
       #error_page  404              /404.html;
       #定义nginx 40X 错误页面
        error_page  400 = http://img.frank.com.cn/error.html;
        error_page  403 = http://img.frank.com.cn/error.html;
        error_page  404 = http://img.frank.com.cn/error.html;
      #定义 nginx 50X 错误页面
      # redirect server error pages to the static page /50x.html
        error_page  500 = http://img.frank.com.cn/error.html;
        error_page  501 = http://img.frank.com.cn/error.html;
        error_page  502 = http://img.frank.com.cn/error.html;
        error_page  503 = http://img.frank.com.cn/error.html;
       #设置吧php 代理到 php-fpm
       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
       location ~ .*\.(php|php5)?$ {
           root    html;
           fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;   
           include  fastcgi_params;
       }
      #设置在浏览器中缓存的文件类型及时间
     location ~.*\.(jpg|js|css|png|bmp|jpeg|gif|swf)$ 
             {
        #设置防盗链,非允许的域名,返回404错误
             valid_referers none blocked *.frank.com.cn;
               if ($invalid_referer) {
                  return 404;
                 }
             root  html;
             expires 360d;
             #开启nginx etag 标签
             FileETag on;
             etag_format "%X%X";
           }
       #设置产看nginx 运行状态及允许访问的IP 地址
       #Nginx status
       location ~^/NginxStatus {
           allow 192.168.1.0/24;
           deny all;
           stub_status on;
           access_log off;
           if ( -d $request_filename){
            rewrite ^/(.*)([^/])$ http://$host/$1$2 permanent;
             }
            }
     }
  }
  3 配置nginx service启动脚本,并添加开启自动启动
     #vim  /etc/init.d/nginx
      #!/bin/sh
      #
      # nginx - this script starts and stops the nginx daemin
      #
      # chkconfig:   - 85 15
      # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
      #               proxy and IMAP/POP3 proxy server
      # processname: nginx
      # config:      /usr/local/nginx/conf/nginx.conf
      # pidfile:     /usr/local/nginx/logs/nginx.pid
      # Source function library.
      . /etc/rc.d/init.d/functions
      # Source networking configuration.
      . /etc/sysconfig/network
      # Check that networking is up.
      [ "$NETWORKING" = "no" ] && exit 0
      nginx="/usr/local/nginx/sbin/nginx"
      prog=$(basename $nginx)
      NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
      lockfile=/var/lock/subsys/nginx
      start() {
          [ -x $nginx ] || exit 5
          [ -f $NGINX_CONF_FILE ] || exit 6
          echo -n $"Starting $prog: "
          daemon $nginx -c $NGINX_CONF_FILE
          retval=$?
          echo
          [ $retval -eq 0 ] && touch $lockfile
          return $retval
      }
      stop() {
          echo -n $"Stopping $prog: "
          killproc $prog -QUIT
          retval=$?
          echo
          [ $retval -eq 0 ] && rm -f $lockfile
          return $retval
      }
     restart() {
          configtest || return $?
          stop
          start
      }
      reload() {
          configtest || return $?
          echo -n $"Reloading $prog: "
          killproc $nginx -HUP
          RETVAL=$?
          echo
      }
      force_reload() {
          restart
      }
      configtest() {
         $nginx -t -c $NGINX_CONF_FILE
      }
      rh_status() {
          status $prog
      }
      rh_status_q() {
          rh_status >/dev/null 2>&1
      }
      case "$1" in
          start)
              rh_status_q && exit 0
              $1
              ;;
          stop)
              rh_status_q || exit 0
              $1
              ;;
          restart|configtest)
              $1
              ;;
          reload)
              rh_status_q || exit 7
              $1
              ;;
          force-reload)
              force_reload
              ;;
          status)
              rh_status
              ;;
          condrestart|try-restart)
              rh_status_q || exit 0
              ;;
          *)
              echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
              exit 2
      esac
      #chmod 700  /etc/init.d/nginx
      #chkconfig --add nginx
      #chkconfig nginx on
   4 nginx 日志切割,并把其添加到crontable 中让其每天零点零分运行
     #cd /usr/local/nginx/sbin
     #vim   cut.nginx.log.sh
      #!/bin/bash
      #
      ##
      logs_path="/usr/local/nginx/logs/"
      if [ ! -d "$logs_path$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")" ]
        then
            mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
      fi
      mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
      kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
      cd  ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
      gzip -9 access_$(date -d "yesterday" +"%Y%m%d").log


六 mysql 安装配置

 1 创建mysql 用户
 #groupadd mysql
  #useradd -g mysql mysql 
 
   2 编译安装mysql  #tar zxvf mysql-5.0.91.tar.gz #cd mysql-5.0.91 #./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-plugins=innobase --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=utf8 --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-unix-socket-path=/var/lib /mysql/mysql.sock #make&&make install 3 初始化mysql #cd /usr/local/mysql #bin/mysql_install_db –user=mysql #chown –R root:mysql . #chown –R mysql /var/lib/mysql #cp share/mysql/my-medium.cnf /etc/my.cnf #cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld #chmod 755 /etc/rc.d/init.d/mysqld #chkconfig –add mysqld #chkconfig mysqld on 4 优化mysql 配置,再次省略了


七 libmcrypt 安装配置

  #tar  xf libmcrypt-2.5.8.tar.gz
  #./configure --prefix=/usr/local/libmcrypt
  #make  && make install


八 libiconv 安装配置

  #tar  xf libiconv-1.14.tar.gz
  #cd libiconv-1.14
  #./configure  --prefix=/usr/local/libiconv
  #make && make install 
 


九 php 安装配置

 1 #tar xf php-5.3.19.tar.gz
   #cd php-5.3.19
   #./configure  --prefix=/usr/local/php --with-freetype-dir --with-jpeg-dir --with-png-dir 
    --with-zlib --with-libxml-dir --enable-xml --disable-debug --enable-fpm --enable-mbstring
    --with-gd --enable-gd-native-ttf  --with-openssl --with-curl --with-curlwrappers 
    --enable-sockets --with-xmlrpc --with-mhash --with-mcrypt=/usr/local/libmcrypt/ 
    --with-mysqli=/usr/bin/mysql_config --with-mysql --enable-zend-multibyte 
    --with-iconv-dir=/usr/local/libiconv/
   #make && make install
 2 #cp   php.ini-production  /usr/local/php/lib/php.ini
 3 配置service启动php-fpm 的脚本
   #cd  sapi/fpm
   #cp  init.d.php-fpm.in   /etc/init.d/php-fpm
   #chmod 700 /etc/init.d/php-fpm
   #chkconfig --add php-fpm
   #chkconfig php-fpm on
 4 开启php 的短标签,并修改php 的时区
  #vim php.ini
    #开启php 短标签
    short_open_tag = On
    #设置php时区
    date.timezone = Asia/Hong_Kong
 5  优化php-fpm
    #cd  /usr/local/php/etc
    #cp  php-fpm.conf.default  php-fpm.conf
     修改下面的参数, 并取消注释
    #php-fpm进程文件
     pid = run/php-fpm.pid
    #设定php-fpm日志级别
     log_level =notice
    #设定php-fpm 子进程最大数目
     process.max = 300
    #设定 master process 打开的文件数目
      rlimit_files = 819200
    #指定fpm mechanism event 方式
       events.mechanism = epoll
    #指定php-fpm 运行的用户
      user = nginx 
      group = nginx
    #指定php-fpm 监听的端口
       listen = 127.0.0.1:9000
    #指定 php-fpm 监听的队列长度,默认情况下是不限制的
       listen.backlog = 2048
    #设定允许访问PHP-fpm 的IP 地址
       listen.allowed_clients = 127.0.0.1
    #指定php-fpm 的运行方式,分为static 和dynamic两种
       pm = dynamic
    # 设定最大的子进程
        pm.max_children = 300
    #设定php-fpm启动是,开启的子进程数目
        pm.start_servers = 65
    #设定php-fpm 最小空闲进程数目
        pm.min_spare_servers = 50
    #设定php-fpm,最大空闲进程数目
        pm.max_spare_servers = 80
    #设定每个子进程处理的请求数
        pm.max_requests = 1000
    #设定查看php-fpm运行状态
        pm.status_path = /status
        ping.path = /ping
        ping.response = pong
    #设定响应超时时间
        request_slowlog_timeout = 30(s)
    # 设定slow request 日志文件
        slowlog = /usr/local/php/var/log/$pool.slow.log


十 xcache 安装配置

 1 #tar  xf  xcache-3.0.0.tar.gz
   #cd  xcache-3.0.0
   #/usr/local/php/bin/phpize --clean
   #/usr/local/php/bin/phpize
   #./configure --enable-xcache --enable-xcache-optimizer 
     --with-php-config=/usr/local/php/bin/php-config
   #make && make install 
 2 在php配置文件尾部添加xcache 的配置文件,内容如下
   ;;Xcache
   ;; this is an example, it won't work unless properly configured into php.ini
   ;[xcache-common]
   ;;; non-Windows example:
   # 加载xcache.so模块路径
   extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/xcache.so
   ;;; Windows example:
   ;; extension = php_xcache.dll
   ;
   ;[xcache.admin]
   #设置xcache 管理界面(在此用户名和密码都是frank, 在此处设置的密码为md5 加密后的密码,md5为php计算出来的)
   xcache.admin.enable_auth = On
   xcache.admin.user = "frank"
   ;; set xcache.admin.pass = md5($your_password)
   ;; login use $your_password
   xcache.admin.pass = "712e5d9c46784262937bc4b2215c3beb"
  ;
  ;[xcache]
  ;; ini only settings, all the values here is default unless explained
  ;
  ;; select low level shm/allocator scheme implemenation
  xcache.shm_scheme =        "mmap"
  ;; to disable: xcache.size=0
  ;; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
  xcache.size  =        64M
  ;; set to cpu count (cat /proc/cpuinfo |grep -c processor)
  xcache.count =         12
  ;; just a hash hints, you can always store count(items) > slots
  xcache.slots =                4K
  ;; ttl of the cache item, 0=forever
  xcache.ttl   =                 0
  ;; interval of gc scanning expired items, 0=no scan, other values is in seconds
  xcache.gc_interval =           0
  ;
  ;; same as aboves but for variable cache
  xcache.var_size  =            4M
  xcache.var_count =             12
  xcache.var_slots =            4K
  ;; default value for $ttl parameter of xcache_*() functions
  xcache.var_ttl   =             0
  ;; hard limit ttl that cannot be exceed by xcache_*() functions. 0=unlimited  
  xcache.var_maxttl   =          0
  xcache.var_gc_interval =     300
  ;
  ;; mode:0, const string specified by xcache.var_namespace
  ;; mode:1, $_SERVER[xcache.var_namespace]
  ;; mode:2, uid or gid (specified by xcache.var_namespace)
  ;xcache.var_namespace_mode =    0
  ;xcache.var_namespace =        "" 
  ;
  ;; N/A for /dev/zero
  ;xcache.readonly_protection = Off
  ;; for *nix, xcache.mmap_path is a file path, not directory. (auto create/overwrite)
  ;; Use something like "/tmp/xcache" instead of "/dev/*" if you want to turn on ReadonlyProtection
  ;; different process group of php won't share the same /tmp/xcache
  ;; for win32, xcache.mmap_path=anonymous map name, not file path
  xcache.mmap_path =    "/dev/zero"
  ;
  ;
  ;; leave it blank(disabled) or "/tmp/phpcore/"
  ;; make sure it's writable by php (open_basedir is not checked)
  ;xcache.coredump_directory =   ""
  ;; disable cache after crash
  ;xcache.disable_on_crash =    Off
  ;
  ;; enable experimental documented features for each release if available
  ;xcache.experimental =        Off 
  ;
  ;; per request settings. can ini_set, .htaccess etc
  xcache.cacher =               On
  xcache.stat   =               On
  ;xcache.optimizer =           Off
  ;
  ;[xcache.coverager]
  ;; enabling this feature will impact performance
  ;; enabled only if xcache.coverager == On && xcache.coveragedump_directory == "non-empty-value"
  ;
  ;; per request settings. can ini_set, .htaccess etc
  ;; enable coverage data collecting and xcache_coverager_start/stop/get/clean() functions
  ;xcache.coverager =           Off
  ;xcache.coverager_autostart =  On
  ;
  ;; set in php ini file only
  ;; make sure it's readable (open_basedir is checked) by coverage viewer script
  ;xcache.coveragedump_directory = ""
 3 重启php-fpm
  #service php-fpm stop
  #service php-fpm  start









本文转自 freehat08 51CTO博客,原文链接:http://blog.51cto.com/freehat/1177298,如需转载请自行联系原作者
上一篇:六大理由告诉你为什么 GNOME仍然是最好的Linux桌面环境


下一篇:Android 使用 SoftReference 解决 Activity 存栈的内存泄漏问题