構建高性能Web環境(linux-nginx-mysql-php-fastcgi)

構建高性能Web環境(linux-nginx-mysql-php-fastcgi)
2012年01月01日
  本文主要是撰寫Linux系統中PHP Web環境的配置,介紹在CentOS系統下安裝:Nginx、MySQL、php-FastCGI,文中用的軟件都是截至2011/6/22最新穩定版。網絡上關於這種配置很多,配置過程相差不大,但是參數有所不同。開始之前先介紹一下nginx:
  Nginx(engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網誌Plurk也使用nginx。
  下面開始敘述詳細配置過程:
  一、Centos系統安裝完畢之後,關閉不需要的服務優化系統,安裝系統更新和所需軟件支持。
  關閉不需要的服務
  chkconfig --level 3 acpid off
  chkconfig --level 3 anacron off
  chkconfig --level 3 apmd off
  chkconfig --level 3 mdmonitor off
  chkconfig --level 3 xinetd off
  chkconfig --level 3 Sendmail off
  chkconfig --level 3 rpcgssd off
  chkconfig --level 3 rawdevices off
  chkconfig --level 3 messagebus off
  chkconfig --level 3 atd off
  chkconfig --level 3 gpm off
  chkconfig --level 3 autofs off
  chkconfig --level 3 cpuspeed off
  chkconfig --level 3 haldaemon off
  chkconfig --level 3 nfslock off
  chkconfig --level 3 portmap off
  chkconfig --level 3 xfs off
  chkconfig --level 3 netfs off
  chkconfig --level 3 smartd off
  chkconfig --level 3 ip6tables off
  chkconfig --level 3 isdn off
  chkconfig --level 3 rpcidmapd off
  chkconfig --level 3 microcode_ctl off
  service acpid stop
  service anacron stop
  service apmd stop
  service mdmonitor stop
  service xinetd stop
  service sendmail stop
  service rpcgssd stop
  service rawdevices stop
  service messagebus stop
  service atd stop
  service gpm stop
  service autofs stop
  service cpuspeed stop
  service haldaemon stop
  service nfslock stop
  service portmap stop
  service xfs stop
  service netfs stop
  service smartd stop
  service ip6tables stop
  service isdn stop
  service rpcidmapd stop
  service microcode_ctl stop
  安裝系統更新和所需軟件支持
  yum -y update
  yum -y install gcc gcc-c++ autoconf 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 openldap openldap-devel nss_ldap openldap-clients openldap-servers NTP rar
  下載需要用到的軟件包(以下地址都是官方下載、也可以自己查找)
  【下載PHP需要的庫】
  wget http://FTP.GNU.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
  wget http://ncu.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
  wget http://ncu.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
  wget http://ncu.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz
  【下載mysql、php、nginx】
  wget http://mysql.mirrors.hoobly.com/Downloads/MySQL-5.1/mysql-5.1.57.tar.gz
  wget http://us.php.net/distributions/php-5.2.17.tar.gz
  wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
  wget http://www.nginx.org/download/nginx-1.0.2.tar.gz
  wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
  【下載php擴展】
  wget http://pecl.php.net/get/Memcache-2.2.6.tgz
  wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
  wget http://bart.eAccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
  wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.7.0-8.tar.gz
  wget http://pecl.php.net/get/imagick-3.0.0.tgz
  二、安裝PHP需要的庫程序
  tar zxvf libiconv-1.13.1.tar.gz
  cd libiconv-1.13.1/ && ./configure --prefix=/usr/local
  make && make install && cd ..
  tar zxvf libmcrypt-2.5.8.tar.gz
  cd libmcrypt-2.5.8/ && ./configure
  make && make install
  /sbin/ldconfig && cd libltdl/ && ./configure --enable-ltdl-install
  make && make install && cd ../..
  tar zxvf mhash-0.9.9.9.tar.gz
  cd mhash-0.9.9.9/ && ./configure
  make && make install && cd ..
  ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
  ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
  ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
  ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
  ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
  ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
  ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
  ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
  ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
  ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
  tar zxvf mcrypt-2.6.8.tar.gz
  cd mcrypt-2.6.8/ && /sbin/ldconfig
  ./configure && make && make install && cd ..
  三、編譯安裝 MySQL
  tar zxvf mysql-5.1.57.tar.gz && cd mysql-5.1.57
  ./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
  make && make install && cd ..
  創建mysql用戶組,創建數據庫、日誌等存儲目錄並賦予權限
  mkdir -p /data/mysqldata
  mkdir -p /data/mysqldata/database
  mkdir -p /data/mysqldata/log
  mkdir -p /data/mysqldata/pid
  groupadd mysql
  useradd -g mysql -d /data/mysqldata/database -s /sbin/nologin mysql
  chgrp -R mysql /usr/local/webserver/mysql/.
  chown -R root:mysql /usr/local/webserver/mysql/*
  chown -R mysql:mysql /data/mysqldata/*
  修改my.cnf文件參數(參數適用於大於2G內存服務器)
  [client]
  port = 3306
  socket = /tmp/mysql.sock
  [mysqld]
  user = mysql
  port = 3306
  socket = /tmp/mysql.sock
  basedir = /usr/local/webserver/mysql
  datadir = /data/mysqldata/database
  log-error = /data/mysqldata/log/mysql_error.log
  pid-file = /data/mysqldata/pid/mysql.pid
  skip-external-locking
  skip-name-resolve
  back_log = 500
  key_buffer_size = 256M
  max_allowed_packet = 32M
  thread_stack = 192K
  table_cache = 256
  sort_buffer_size = 4M
  read_buffer_size = 4M
  join_buffer_size = 4M
  read_rnd_buffer_size = 8M
  myisam_sort_buffer_size = 64M
  thread_cache = 128
  thread_cache_size = 10
  query_cache_size = 32M
  tmp_table_size = 128M
  max_connections = 5000
  wait_timeout = 60
  max_connect_errors = 6000
  expire_logs_days = 30
  server-id = 1
  [mysqldump]
  quick
  max_allowed_packet = 32M
  [mysql]
  no-auto-rehash初始化MySQL服務
  /usr/local/webserver/mysql/bin/mysql_install_db \
  --basedir=/usr/local/webserver/mysql \
  --datadir=/data/mysqldata/database \
  --user=mysql
  啓動MySQL服務
  /usr/local/webserver/mysql/bin/mysqld_safe --user=mysql & //啓動服務
  /usr/local/webserver/mysql/bin/mysqladmin -u root -p shutdown //停止服務
  修改root密碼
  /usr/local/webserver/mysql/bin/mysqladmin -u root password ‘yourpassword’
  四、編譯安裝PHP(FastCGI模式)
  tar zxvf 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/
  ./buildconf --force
  ./configure --prefix=/usr/local/webserver/php \
  --with-config-file-path=/usr/local/webserver/php/etc \
  --with-mysql=/usr/local/webserver/mysql \
  --with-mysqli=/usr/local/webserver/mysql/bin/mysql_config \
  --with-gd \
  --with-jpeg-dir \
  --with-iconv-dir=/usr/local \
  --with-libxml-dir=/usr \
  --with-zlib \
  --with-png-dir \
  --with-curl \
  --with-LDAP \
  --with-xmlrpc \
  --with-openssl \
  --with-mhash \
  --with-mcrypt \
  --with-freetype-dir \
  --with-ldap-sasl \
  --with-curlwrappers \
  --enable-xml \
  --enable-shared \
  --enable-discard-path \
  --enable-safe-mode \
  --enable-bcmath \
  --enable-shmop \
  --enable-sysvsem \
  --enable-inline-optimization \
  --enable-mbregex \
  --enable-fastcgi \
  --enable-fpm \
  --enable-force-cgi-redirect \
  --enable-mbstring=all \
  --enable-gd-native-ttf \
  --enable-pcntl \
  --enable-sockets \
  --enable-zip \
  --enable-soap
  make ZEND_EXTRA_LIBS='-liconv'
  make install && cd ..
  五、安裝PHP擴展模塊
  tar zxvf memcache-2.2.6.tgz
  cd memcache-2.2.6/
  /usr/local/webserver/php/bin/phpize
  ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
  make && make install && cd ..
  tar zxvf PDO_MYSQL-1.0.2.tgz
  cd PDO_MYSQL-1.0.2/
  /usr/local/webserver/php/bin/phpize
  ./configure \
  --with-php-config=/usr/local/webserver/php/bin/php-config \
  --with-pdo-mysql=/usr/local/webserver/mysql
  make && make install && cd ..
  tar jxvf eaccelerator-0.9.6.1.tar.bz2
  cd eaccelerator-0.9.6.1/
  /usr/local/webserver/php/bin/phpize
  ./configure --enable-eaccelerator=shared \
  --with-php-config=/usr/local/webserver/php/bin/php-config
  make && make install && cd ..
  tar zxvf ImageMagick-6.7.0-8.tar.gz
  cd ImageMagick-6.7.0-8/
  ./configure && make && make install && cd ..
  tar zxvf imagick-3.0.0.tgz
  cd imagick-3.0.0/
  /usr/local/webserver/php/bin/phpize
  ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
  make && make install && cd ..
  修改php.ini文件
  vim /usr/local/webserver/php/etc/php.ini
  查找:
  extension_dir = "./"
  修改爲:
  extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"
  並在此行後增加以下幾行,然後保存:
  extension = "memcache.so"
  extension = "pdo_mysql.so"
  extension = "imagick.so"
  再查找:output_buffering = Off
  修改爲:output_buffering = On
  創建緩存目錄,配置eAccelerator加速PHP:
  mkdir -p /usr/local/webserver/eaccelerator_cache
  將以下參數添加到php.ini文件末尾
  zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
  eaccelerator.shm_size="64"
  eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"
  eaccelerator.enable="1"
  eaccelerator.optimizer="1"
  eaccelerator.check_mtime="1"
  eaccelerator.debug="0"
  eaccelerator.filter=""
  eaccelerator.shm_max="0"
  eaccelerator.shm_ttl="3600"
  eaccelerator.shm_prune_period="3600"
  eaccelerator.shm_only="0"
  eaccelerator.compress="1"
  eaccelerator.compress_level="9"修改php-fpm.conf配置文件
  vim /usr/local/webserver/php/etc/php-fpm.conf
  如果安裝 Nginx + PHP 用於程序調試,請將以下的
  0
  改爲
  1
  以便顯示PHP錯誤信息,否則,Nginx 會報狀態爲500的空白錯誤頁
  啓動php-cgi進程,監聽127.0.0.1的9000端口,進程數爲128(如果服務器內存小於3GB,可以只開啓64個進程),用戶爲:www
  Ulimit -SHn 65535
  /usr/local/webserver/php/sbin/php-fpm start //在www用戶創建之後在開啓。
  注:/usr/local/webserver/php/sbin/php-fpm 還有其他參數,包括:start|stop|quit|restart|reload|logrotate,修改php.ini後不重啓php-cgi,重新加載配置文件使用reload。
  六、編譯安裝nginx
  創建www用戶和組,以及網站目錄,日誌目錄
  groupadd www
  useradd -g www -s /sbin/nologin www
  mkdir -p /data/wsdata/wwwroot
  mkdir -p /data/wsdata/wwwroot/error
  echo "404" > /data/wsdata/wwwroot/error/404.html
  echo "server is too busy" > /data/wsdata/wwwroot/error/50x.html
  chmod +w /data/wsdata/wwwroot
  mkdir -p /data/wslogs/wwwroot
  chmod 777 /data/wslogs/wwwroot
  chown -R www:www /data/wsdata/wwwroot
  tar zxvf pcre-8.12.tar.gz && cd pcre-8.12/
  ./configure && make && make install && cd ..
  tar zxvf nginx-1.0.2.tar.gz && cd nginx-1.0.2/
  ./configure \
  --user=www \
  --group=www \
  --prefix=/usr/local/webserver/nginx \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-CC-opt='-O3' \
  --with-cpu-opt=opteron \
  --with-http_gzip_static_module
  make && make install && cd ..
  創建或修改nginx配置文件
  cat nginx.conf
  #user options
  user www www;
  #CPU Core options
  worker_processes 4;
  #nginx Process options
  pid /usr/local/webserver/nginx/nginx.pid;
  # [ debug | info | notice | warn | error | crit ]
  error_log /wslogs/nginx_error.log crit;
  #Specifies the value for maximum file descriptors that can be opened by this process.
  worker_rlimit_nofile 51200;
  events {
  use epoll;
  #maxclient = worker_processes * worker_connections / cpu_number
  worker_connections 51200;
  }
  http {
  include mime.types;
  default_type application/octet-stream;
  #charset gb2312;
  #General options
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  ignore_invalid_headers on;
  recursive_error_pages on;
  server_name_in_redirect off;
  sendfile on;
  #timeouts
  keepalive_timeout 60;
  #TCP options
  tcp_nopush on;
  tcp_nodelay on;
  #fastcgi options
  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;
  fastcgi_intercept_errors on;
  #size limits
  client_max_body_size 300m;
  client_body_buffer_size 256k;
  #gzip compression
  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types text/plain text/css application/x-javascript application/xml;
  gzip_vary on;
  #limit_zone crawler $binary_remote_addr 10m;
  #virtual hosts options
  include vhosts.conf;
  } cat vhosts.conf
  server {
  listen 80;
  server_name www.linuxde.net linuxde.net;
  access_log /data/wslogs/linuxde_www_access.log combined;
  index index.html index.htm index.php;
  root /data/wsdata/wwwroot/linuxde/www;
  #error_page 404 = ./error/404.html;
  #error_page 500 502 503 504 = ./error/50x.html;
  #linuxde.net 重定向到 www.linuxde.net
  if ($host !~ "^www\.linuxde\.net$") {
  rewrite ^(.*) http://www.linuxde.net$1 permanent;
  }
  location ~ .*\.(php|php5)?$ {
  #fastcgi_pass unix:/tmp/php-cgi.sock;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  include enable_fcgi.conf;
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  access_log off;
  expires 30d;
  }
  location ~ .*\.(js|css)$ {
  access_log off;
  expires 1d;
  }
  #wordpress僞靜態
  location / {
  if (-f $request_filename/index.html){
  rewrite (.*) $1/index.html break;
  }
  if (-f $request_filename/index.php){
  rewrite (.*) $1/index.php;
  }
  if (!-f $request_filename){
  rewrite (.*) /index.php;
  }
  }
  }cat enable_fcgi.conf
  #PHP PATH_INFO bugs
  if ($request_filename ~* (.*)\.php) {
  set $php_url $1;
  }
  if (!-e $php_url.php) {
  return 403;
  }
  fastcgi_param GATEWAY_INTERFACE CGI/1.1;
  fastcgi_param SERVER_SOFTWARE nginx;
  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_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  fastcgi_param REQUEST_URI $request_uri;
  fastcgi_param DOCUMENT_URI $document_uri;
  fastcgi_param DOCUMENT_ROOT $document_root;
  fastcgi_param SERVER_PROTOCOL $server_protocol;
  fastcgi_param REMOTE_ADDR $remote_addr;
  fastcgi_param REMOTE_PORT $remote_port;
  fastcgi_param SERVER_ADDR $server_addr;
  fastcgi_param SERVER_PORT $server_port;
  fastcgi_param SERVER_NAME $server_name;
  #for test
  fastcgi_param HTTP_ACCEPT_ENCODING gzip,deflate;
  # PHP only, required if PHP was built with --enable-force-cgi-redirect
  fastcgi_param REDIRECT_STATUS 200;啓動nginx服務
  /usr/local/webserver/nginx/sbin/nginx -t //檢測配置文件是否正確
  /usr/local/webserver/nginx/sbin/nginx //啓動nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章