基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台作者:pkfeiyang 主页:pkfeiyang.cublog.cn首先介绍下支持php的cgi有php-fpm和spawn-fcgi 目前比较常用 对于php-fpm支持cgi的安装lemp安装详解:http://blog.chinaunix.net/u3/103362/showart_2301020.html 下面主要介绍 nginx+php+spawn-fcgi+mysql 什么是spawn-fcgi? spawn-fcgi是一个通用的FastCGI管理服务器 她是lighttpd中的一部份,但目前已经单独成为一个项目,最新的lighttpd没有这一块,但可以在以前版本中找到她在lighttpd-1.4.15( http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz )中就有她Note注:最新的spawn-fcgi可以到lighttpd.net网站搜索“spawn-fcgi”找到她的最新版本发布地址目前她的下载地址是http://redmine.lighttpd.net/news/2 最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz 下载软件包: 下载软件包: pcre 下载 wget http://downloads.sourceforge.net/project/pcre/pcre/8.10/pcre-8.10.tar.gz nginx 下载 wget http://nginx.org/download/nginx-0.8.49.tar.gz gd库下载 wget http://www.libgd.org/releases/gd-latest.tar.gz lib库下载 wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz wget http://cdnetworks-kr-1.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.bz2 算法需要的 wget http://acelnmp.googlecode.com/files/mhash-0.9.9.9.tar.gz wget http://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz wget http://downloads.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.48.tar.gz wget http://php-fpm.org/downloads/php-5.2.13-fpm-0.5.14.diff.gz wget http://cn.php.net/get/php-5.3.3.tar.gz wget http://pecl.php.net/get/memcache-2.2.5.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 添加用户名 71 useradd www 72 groupadd www 73 usermod -a -G www www 74 mkdir -p /website/web001 75 chmod +w /website/web001/ -R 76 chown www:www /website/web001/ -R 77 useradd web001 78 usermod -g web001 www 79 chown -R web001:www /website/web001/ 调节时间 crontab -e 加入:15 3 * * * /usr/sbin/ntpdate 210.72.145.44 >/dev/null 2>&1 安装需要的软件包: yum -y install ntp vim-enhanced gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel ncurses-devel opens sl-devel libtool* zlib-devel libxml2-devel libjpeg-devel libpng-devel libtiff-devel fontconfig-devel freetype-devel libXpm-devel gettext-devel curl curl-devel pam-devel e2fsprogs-devel krb5-devel libidn libidn-devel libevent-devel libevent 安装mysql 157 CFLAGS="-march=nocona -O3 -pipe" 158 CXXFLAGS="{CFLAGS}" 161 tar -xzf mysql-5.1.48.tar.gz 162 cd mysql-5.1.48 ./configure --prefix=/usr/local/mysql5 --localstatedir=/data/mysql/data --with-comment=Source --with-mysqld-u ser=mysql --without-debug --with-big-tables --with-charset=gbk --with-extra-charsets=all --with-pthread --enable-sta tic --with-collation=gbk_chinese_ci --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldfl ags=-all-static --enable-assembler --with-plugins=all --without-ndb-debug make make install useradd mysql -d /data/mysql -s/sbin/nologin /usr/local/mysql/bin/mysql_install_db--user=mysql /usr/local/mysql5/bin/mysqld_safe --user=mysql &(注意) cd /usr/local/mysql chown -R root:mysql . mkdir -p /data/mysql/data chown -R mysql /data/mysql/data cp share/mysql/my-huge.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 /etc/rc.d/init.d/mysqld start 安装php tar -xjf gd-2.0.35.tar.bz2 106 107 cd gd-2.0.35 108 109 ./configure --prefix=/usr/local/gd2 110 make && make install 111 cd .. 112 113 tar -xjf libmcrypt-2.5.8.tar.bz2 114 cd libmcrypt-2.5.8 115 116 ./configure --prefix=/usr 117 118 make && make install 119 122 tar -xzf libiconv-1.13.tar.gz 123 cd libiconv-1.13 124 ls 125 ./configure --prefix=/usr 126 make && make install 127 128 129 tar -xzf mhash-0.9.9.9.tar.gz 130 cd mhash-0.9.9.9 131 ./configure --prefix=/usr 132 make && make install 133 vi /etc/ld.so.conf 加上/usr/lib ldconfig tar zxvf php-5.2.5.tar.gz(注意php-cgi 需要指定--enable-fastcgi和 --enable-force-cgi-redirect,并且好要注意php-cgi的生成和版本有关,5.2.x 的版本是可以的,5.3.x 以上集成了php-fpm 对于生成php-cgi没有多大效果) cd php-5.2.5/ ./configure --prefix=/usr/local/php-fcgi --with-config-file-path=/usr/loca/php-fcgi/etc --with-mysql=/usr/local/mysql5 --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --disable-debug --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --enable-pdo --with-pdo-mysql=shared --with-pdo-sqlite=shared (这个需要加上 如果你用pdo 来连接数据库的话) sed -i 's#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#' Makefile make make install cp php.ini-dist /usr/local/webserver/php/etc/php.ini 编辑php.ini sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\nextension = "gd.so"\n#' /usr/local/php-fcgi/etc/php.ini 安装memache tar -xzf memcache-2.2.5.tgz cd memcache-2.2.5 /usr/local/php-fcgi/bin/phpize ./configure --with-php-config=/usr/local/php-fcgi/bin/php-config make && make install 安装eaccelerator tar -xjf eaccelerator-0.9.6.1.tar.bz2 /usr/local/php-fcgi/bin/phpize cd eaccelerator-0.9.6.1 /usr/local/php-fcgi/bin/phpize ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php-fcgi/bin/php-config 安装PDO_MYSQL tar -xzf PDO_MYSQL-1.0.2.tgz cd PDO_MYSQL-1.0.2 /usr/local/php-fcgi/bin/phpize ./configure --with-php-config=/usr/local/php-fcgi/bin/php-config --with-pdo-mysql=/usr/local/mysql5 make && make install 安装ZendOptimizer 这个版本高,不用安装了 tar -xzf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz 安装spawn-fcgi #tar zvxf spawn-fcgi-1.6.3.tar.gz #cd spawn-fcgi-1.6.3 #./configure --prefix=/usr/local/spawn-fcgi make && make install /usr/local/spawn/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 64 -u www -f /usr/bin/php-cgi 启动php-cgi进程,监听127.0.0.1的10080端口,进程数为64(如果服务器内存小于3GB,可以只开启25个进程),用户为www: 参数含义如下: -f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。 -a <addr> 绑定到地址addr。 -p <port> 绑定到端口port。 -s <path> 绑定到unix socket的路径path。 -C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP) -P <path> 指定产生的进程的PID文件路径。 -u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。 4. 将这行代码加入到/etc/rc.local文件底部,这样系统启动的时候就可以同时启动PHP的FastCGI进程 安装nginx 安装 pcre tar -xzf pcre-8.10.tar.gz cd pcre-8.10 ./configure make && make install wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz tar zxvf ngx_cache_purge-1.0.tar.gz tar -xzf nginx-0.8.49.tar.gz cd nginx-0.8.49 ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-openssl=/usr/lib --add-module=../ngx_cache_purge-1.0 --add-module=/Users/mikewest/Repositories/nginx-static-etags (当nginx需要使用etags 进行页面缓 --add-module=../ngx_cache_purge-1.0 编译ngx_cache_purge-1.0.tar.gz时location / { ) make && make install编辑nginx.conf文件 user www www; worker_processes 50; #worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; pid /var/run/nginx.pid; # [ debug | info | notice | warn | error | crit ] #error_log /dev/null; error_log /var/www/logs/nginx_error.log error; #error_log logs/error.log notice; #error_log logs/error.log info; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 6553; events{ use epoll; #maxclient = worker_processes * worker_connections / cpu_number worker_connections 6553; } http{ include mime.types; default_type application/octet-stream; charset utf-8; log_format main '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' #access_log /dev/null; #General Options server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 64k; 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_temp_path /var/www/tmp/fastcgi_temp_path; fastcgi_cache_methods GET HEAD; fastcgi_cache_min_uses 3; #fastcgi_cache fastcgi_cache; fastcgi_cache_valid 200 302 20m; fastcgi_cache_valid 301 1h; fastcgi_cache_valid any 20m; fastcgi_cache_key 127.0.0.1:9000$request_uri; fastcgi_buffer_size 128k; fastcgi_buffers 4 128k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_intercept_errors on; ###limit limit_zone one $binary_remote_addr 10m; limit_conn one 5; # limit_req_zone $binary_remote_addr zone=one2:10m rate=5r/s; # limit_req zone=one2 burst=5; #size limits client_max_body_size 50m; client_body_buffer_size 256k; #gzip compression gzip on; gzip_min_length 0; gzip_buffers 16 8k; gzip_http_version 1.0; gzip_comp_level 9; gzip_types text/plain text/css image/x-icon image/png; gzip_vary on; #temp files proxy_temp_path /var/www/tmp/proxy_temp_path; # fastcgi_temp_path /var/www/tmp/fastcgi_temp; client_body_temp_path /var/www/tmp/client_body_temp; #client_body_temp_path /usr/local/nginx8/client_body_temp 1 2; #proxy_temp_path /usr/local/nginx8/proxy_temp 1 2; #fastcgi_temp_path /usr/local/nginx8/fastcgi_temp 1 2; #proxy 麓煤?铆禄潞麓忙?猫?? #proxy proxy_buffering on; proxy_cache_min_uses 3; proxy_cache_path /var/www/tmp/proxy_cache_path levels=1:2 keys_zone=cache:500m inactive=30m max_size=10000M; proxy_cache_valid any 10m; proxy_cache_methods GET HEAD; proxy_cache_key "$host:$server_port$uri$is_args$args"; proxy_ignore_client_abort off; proxy_intercept_errors on; proxy_next_upstream error timeout invalid_header; proxy_redirect off; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; #upstream ?枚录炉?潞?? upstream spawn { # ip_hash; server 127.0.0.1:10080; #server 127.0.0.1:9002; # include vhosts/tv.feiyang.com.conf; } # The following includes are specified for virtual hosts include vhosts/tv.feiyang.com.conf; } 编辑tv.feiyang.com.conf server { listen 80; server_name tv.feiyang.com; index index.html index.htm index.php; root /website/web001; error_page 404 500 502 503 504 http://tv.feiyang.com; ##servername chong ding xiang # rewrite ^/(.*) http://192.168.188.133/$1 last; # rewrite ^/(.*) /test.php last; location / { proxy_next_upsteam http_502 http_504 error timeout invalid_header; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_ignore_headers Expires Cache-Control; } location ~ .*\.(php|php5)?$ { # fastcgi_pass spawn; fastcgi_pass 127.0.0.1:10080; include spawn_php5.conf; fastcgi_index index.php; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 3d; } log_format wwwlogs '$http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /var/www/logs/access.feiyang.log wwwlogs; } 编辑spawn_php5.conf
5、启动Nginx ulimit -SHn 51200 /usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf 四、配置开机自动启动Nginx + PHP vi /etc/rc.local 在末尾增加以下内容: 引用 ulimit -SHn 51200 /usr/local/webserver/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 64 -u www -f /usr/local/webserver/php/bin/php-cgi /usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf 五、优化Linux内核参数 vi /etc/sysctl.conf 在末尾增加以下内容: 引用 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 5000 65000 使配置立即生效: /sbin/sysctl -p 六、在不停止Nginx服务的情况下平滑变更Nginx配置 (1)、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确: /usr/local/webserver/nginx/sbin/nginx -t 如果屏幕显示以下两行信息,说明配置文件正确: 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 (2)、这时,输入以下命令查看Nginx主进程号: ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}' 屏幕显示的即为Nginx主进程号,例如: 6302 这时,执行以下命令即可使修改过的Nginx配置文件生效: kill -HUP 6302 |