Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84510
  • 博文数量: 15
  • 博客积分: 315
  • 博客等级: 二等列兵
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-28 08:37
文章分类
文章存档

2012年(2)

2011年(13)

我的朋友

分类:

2011-12-12 17:34:34

作者:老高 邮箱:ggylqq@gmail.com

外网页面整个站点现已正式上线运行大约1个月了,经过长期运行未发现新的bug和缺陷,为了便于今后的部署和维护将现在整个站点的架设过程记录如下:
声明:为了便于初学者迅速搭建好实验环境,文中每一个命令都是实操截屏所得,但是百密一疏读者如果发现相同环境下有无法执行的命令
可以通过邮件联系作者共同探讨.如果有修改和建议也欢迎来信;
本文为作者原创作品,辛苦分享给大家免费阅读,如有转载请注明作者信息


一、环境描述:
操作系统:RHEL4U6;
部署方式:软件全部采用编译安装,代码是有现有代码或开发单位提供的代码;
软件位置:为便于维护,增强可操作性所有软件放在/opt/install目录中,所有软件的安装位置为/opt下
软件列表:apache-tomcat-6.0.33.tar.gz 、FCGI-ProcManager-0.24.tar.gz 、php-5.3.8.tar.gz、awstats-7.0.tar.gz、jdk-6u27-linux-i586.bin、mysql-5.5.16.tar.gz
awstats插件plugin、cmake-2.8.4.tar.gz、jdk-6u27-linux-x64.bin、nginx-1.1.2.tar.gz、tomcat6033.tar.gz、FCGI-0.74.tar.gz、
辅助工具: jspinfo.jsp用户测试jsp支持的JSP探针程序、nginx.conf示例配置文件、info.php用于测试php支持和数据库连接的页面
下载地址:
tomcat下载地址
php软件下载地址
awstats下载地址
jdk下载地址:这个比较特殊需要注册用户
mysql下载地址
cmake下载地址
nginx下载地址
FCGI和FCGI-ProcManager软件下载地址
二、部署过程:
1、首先开始安装mysql,进入/opt/install目录
cd /opt/install
2、因为我们本次使用的数据库为mysql5.5.16版本,所以安装之前需要单独安装cmake,mysql从5.5.1开始使用cmake创建编译环境取消了原来的./configuration
tar -xzvf mysql-5.5.16.tar.gz #解压mysql安装包,但是暂时还没发使用
tar -xzvf cmake-2.8.4.tar.gz #解压cmake安装包
进入cmake目录开始安装,cmake的安装不需任何配置
cd cmake-2.8.4
./configure 
make;make install
如果以上命令没有报错那么cmake就安装完成了,使用下面的命令查看cmake命令是否执行正常,
cmake -v #执行完后会显示cmake版本
rm -rf cmake-2.8.4 #删掉cmake的安装包,留着原tar包就够了保持install目录干净
开始安装mysql,安装过程如下
cd mysql-5.5.16 #进入刚才解包的mysql目录
执行mysql编译环境检查和编译文件创建,这里涉及一些选项
[root@support-bk mysql-5.5.16]# cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql5516  \ #指定安装完成后mysql所在位置
> -DSYSCONFDIR=/opt/mysql5516/etc \ #指定编译后mysql配置文件my.cnf的位置
> -DWITH_ZLIB=system  \ #指定zlib的位置system代表读取系统位置
> -DMYSQL_TCP_PORT=3306  \ #指定mysql运行的端口默认是3306
> -DEXTRA_CHARSETS=all  \ #指定mysql安装完成后能够支持的数据库语言编码all代表所有已支持的编码
> -DDEFAULT_CHARSET=utf8  \ #指定mysql默认的数据库编码为了更好的兼容这里使用UTF8
> -DDEFAULT_COLLATION=utf8_general_ci \ #指定默认编码对照表不知具体用途一般和前两项一起用
> -DWITH_INNOBASE_STORAGE_ENGINE=1  \ #指定是否打开innodb缓存…………
> -DWITH_READLINE=1  \ #
> -DENABLED_LOCAL_INFILE=1 #
后面的命令都是一样的
[root@support-bk mysql-5.5.16]# make;make install
安装完成后复制mysql配置文件到安装目录下,虽然没有这个文件mysql会自动以默认方式工作但是为了以后搭建主从方式集群还是拷贝一下吧
[root@support-bk mysql-5.5.16]# cp support-files/my-medium.cnf /opt/mysql5516/etc/my.cnf

注意:经常有时候安装完mysql也配置完却一直无法正常启动,这时需要查看是不是安装了系统自带的mysql包,因为系统自带的mysql会产生/etc/my.cnf文件,造成新安装的mysql尝试按照该文件中不同的配置路径启动,这样肯定会有很多文件不对因此无法启动;
[root@support-bk opt]# rpm -qa|grep mysql #查看是否有已经安装的不同版本mysql数据库
如果有应该用下列命令删除,删除过程中可能还需要删除一些关联包,没关系大胆的删;
rpm -e  包名
下面的内容就是配置mysql了,因为mysql运行需要使用mysql用户来进行因此要创建用户
cd /opt/ #进入/opt目录
[root@support-bk opt]#  useradd -d /opt/mysql5516/ -M -s /sbin/nologin mysql #添加一个用户,主目录指定为/opt/mysql5516即mysql的安装位置
[root@support-bk opt]#  id mysql #查看新添加的mysql用户是否正确
[root@support-bk opt]#  chown mysql:mysql mysql5516/ -R #为了方便将mysql安装目录下的所有文件属主改为mysql用户
[root@support-bk opt]#  cd mysql5516/ #注意:一定不要省略本步骤,因为下面的脚本只能在这个位置执行
[root@support-bk mysql5516]#  scripts/mysql_install_db ##创建mysql基本库,也就是默认的mysql、test两个库
[root@support-bk mysql5516]# ls /data ##查看是否生成了基础库,如果有了mysql和test两个目录就成功了
[root@support-bk mysql5516]# chown mysql:mysql data/ -R #因为新生成的基础库是用root创建的因此需要重新将目录授权给mysql用户
[root@support-bk mysql5516]# /opt/mysql5516/bin/mysqld_safe & #正常启动mysql数据库
[root@support-bk mysql5516]# /opt/mysql5516/bin/mysqladmin -u root password "111111" #为mysql数据库root用户设置密码
[root@support-bk mysql5516]# /opt/mysql5516/bin/mysql -u root -p #登陆mysql数据库试试
至此mysql安装完毕,可为新站点创建一个数据库,也可以都完成了再做;
2、从这一步开始安装页面代理程序也就是处理用户访问请求的nginx,这里用到的是1.1.2版本目前最新版本,nginx有很多有点,也是目前网络上最热门的WEB服务器;
[root@support-bk mysql5516]# cd /opt/install/
[root@support-bk install]# rm -rf mysql-5.5.16
[root@support-bk install]# tar -xzvf nginx-1.1.2.tar.gz #解包安装源代码,最新版的可以在下载
[root@support-bk install]# cd nginx-1.1.2 #进入该目录,nginx的安装参数很多,可以用./configure --help查看
[root@support-bk nginx-1.1.2]# ./configure --prefix=/opt/nginx112 \ #编译参数较多这里不一一介绍首先是指定安装位置
> --conf-path=/opt/nginx112/etc/nginx.conf \ #指定配置文件位置
> --error-log-path=/opt/nginx112/var/err.log \ #报错日志的位置
> --pid-path=/opt/nginx112/var/nginx.pid \ #这个是PID文件位置,该文件记录主程序PID,nginx的停止退出重载都要用到
> --lock-path=/opt/nginx112/var/nginx.lock \ #这里指定锁文件位置,该文件是为了防止重复启动服务进程
> --user=mysql \
> --group=mysql \ #服务程序运行时使用的用户,安全起见这里用我们刚刚创建的mysql
> --with-http_ssl_module \ #ssl安全访问支持
> --with-http_sub_module \
> --with-http_flv_module \
> --with-http_gzip_static_module \
> --with-http_realip_module \
> --with-http_addition_module \
> --with-http_xslt_module \
> --with-http_random_index_module \
> --with-http_secure_link_module \
> --with-http_stub_status_module \
> --http-log-path=/opt/nginx112/var/nginx_access.log \ #访问日志的
> --http-client-body-temp-path=/opt/nginx112/var/client \
> --http-proxy-temp-path=/opt/nginx112/var/proxy \ #这个是代理服务的临时文件存放的目录
> --http-fastcgi-temp-path=/opt/nginx112/var/fastcgi \ #这个比较重要,开启fastcgi支持时会用到
> --with-mail \
> --with-mail_ssl_module \
> --with-pcre \
> --with-md5-asm
[root@support-bk nginx-1.1.2]# make;make install #编译过程中没出现问题就可以开始安装了
[root@support-bk install]# rm -rf nginx-1.1.2 #删掉安装目录这样nginx就安装完了
nginx还需要进行一些配置才能提供jsp和php的代理支持,因为还没安装php解释器和tomcat所以这里先不进行配置
3、安装tomcat,tomcat的安装非常简单,只要简单解包然后移动到指定位置就行了,不过tomcat运行先要安装java环境JDK并配置好JAVA_HOME和JRE_HOME环境变量
JDK现在有多个版本,最新的是JDK7,我们为了较好的兼容性使用JDK6,JDK6是一个以bin结尾的自释放包,只要加上可执行属性直接执行即可;
[root@support-bk install]# chmod 755 jdk-6u27-linux-x64.bin #首先要为JDK6自释放包加可执行属性
[root@support-bk install]# ./jdk-6u27-linux-x64.bin #执行已经赋予可执行属性的自解压包
[root@support-bk install]# mv jdk1.6.0_27/ ../ #将解压出来的JDK1.6.0_27包放到/opt/备用
[root@support-bk install]# vi /etc/profile #编辑全局环境变量配置文件添加JAVA_HOME等内容
需要在文件末尾写入JAVA_HOME=/opt/jdk1.0.0_27和JRE_HOME=$JAVA_HOME/jre编辑完成后使用source /etc/profile命令来使变量生效
[root@support-bk install]# echo $JAVA_HOME #查看环境变量是否正确,
[root@support-bk install]# tar -xzvf apache-tomcat-6.0.33.tar.gz #解压tomcat程序包
[root@support-bk install]# mv apache-tomcat-6.0.33 /opt/tomcat6033 #将解包后的tomcat移到/opt下并命名为tomcat6033
[root@support-bk install]# tomcat6033/bin/startup.sh #试着启动一下tomcat查看JRE_HOME是否正确
 
4、安装php,之前用过php+apache的朋友一定都记得,通常情况先php只是作为一个插件或者模块和apache配合使用,而在php版本到了5.3以后我们可以编译出独立
执行的守护进程php-fpm该守护进程像tomcat一样独立运行,通过特定端口接收和处理php解析请求,也可以与nginx配合使用,这种方式比模块式要稳定的多不存在版本和兼容性问题
[root@support-bk install]# tar -xzvf php-5.3.8.tar.gz #解包php源代码
[root@support-bk install]# cd php-5.3.8
php的变异参数较多,大部分是对一些静态内容的支持,例如jpeg、freetype等,这些一般安装操作系统时只要将开发包全选就会安装了,直接用就行。这里着重介绍几个常用的,如果
php5.3以前的版本需要打补丁才能编译出php-fpm方便起见我们就用5.3.8版本直接编译了
[root@support-bk php-5.3.8]# ./configure --prefix=/opt/php538 \ #指定php安装目录
> --with-config-file-path=/opt/php538/etc \ #指定php配置文件所在目录,注意这里我们需要2个配置文件这个指的是php.ini
> --enable-mbstring \
> --enable-ftp \
> --with-gd \
> --with-jpeg-dir=/usr \
> --with-png-dir=/usr \
> --enable-magic-quotes \
> --with-mysql=/opt/mysql5516 \ #除了上面的gd库支持jpeg和png等支持外这里用到了mysql的位置
> --with-pear \
> --enable-sockets \
> --with-freetype-dir=/usr \
> --with-zlib \
> --enable-sysvsem \
> --enable-sysvshm \
> --with-libxml-dir=/usr/local/libxml2 \
> --with-xmlrpc \
> --enable-zip \
> --enable-fpm \ #这个是最重要的,编译完后会生成php-fpm可执行程序
> --enable-zend-multibyte
[root@support-bk php-5.3.8]# make #开始编译
[root@support-bk php-5.3.8]# make test #php5.3多了一个新的选项,如果对编译过程有兴趣可以通过make test生成一个详细日志
[root@support-bk php-5.3.8]# make install #开始安装
[root@support-bk php-5.3.8]# cp php.ini-production /opt/php538/etc/php.ini #复制目录下的产品配置文件样本到指定目录
[root@support-bk php-5.3.8]# vi /opt/php538/etc/php.ini #在配置文件中添加相关时区信息,否则phpinfo()函数会有个小错误
date.timezone = 'Asia/Chongqing'
[root@support-bk php-5.3.8]# cd /opt/php538/etc
[root@support-bk etc]# cp php-fpm.conf.default php-fpm.conf #只有php.ini还不行,还要为php-fpm单独配置文件
[root@support-bk etc]# vi php-fpm.conf #编辑配置文件,该文件按需要开启一些内存相关参数详见附加内容
######################php-fpm.conf主要参数#####################
###只要具备下面这些参数,php-fpm就可以正常使用了其他的选项自己酌情使用#####
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
emergency_restart_threshold = 0
emergency_restart_interval = 0
process_control_timeout = 0
daemonize = yes
rlimit_files = 1024
rlimit_core = 0
[www]
listen = 127.0.0.1:9000
user = mysql
group = mysql
pm = dynamic
pm.max_children = 50
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 25
pm.max_requests = 500
#####################php-fpm一般只用到这些参数###################
配置文件修改完后就可以试着启动服务了,php-fpm的位置不在bin下而是在单独的sbin下
[root@support-bk etc]# /opt/php538/sbin/php-fpm #启动不会出任何提示,可以同过下面的ps命令查看相关守护进程
php-fpm启动后没有提示,可以通过ps -aux|grep php查看相关的进程信息。至此php的安装也完成;

5、下面是关于访问统计工具awstats的安装,由于默认nginx对cgi支持不好因此我们需要借助一个perl脚本来实现CGI脚本分发
[root@support-bk install]# tar -xzvf awstats-7.0.tar.gz
[root@support-bk install]#  mv awstats-7.0 /opt/awstats70
[root@support-bk install]# cd /opt/awatats70
awstats7的安装不需要编译只需要根据向导创建一个配置文件就行下面是大体过程,为了节省篇幅,中间部分屏显用省略号代替
[root@support-bk awstats70]# tools/awstats_configure.pl 
######################awstats的初始配置#########################
######################以上内容均来自真实截屏######################
----- AWStats awstats_configure 1.0 (build 1.9) (c) Laurent Destailleur -----
This tool will help you to configure AWStats to analyze statistics for
……………………
-----> Running OS detected: Linux, BSD or Unix
…………………… #这一部分内容是告诉你awstats的用途和默认安装的路径等
Do you want to continue setup from this NON standard directory [yN] ? y #问是不是要进行一个非标准的安装当然死yes

-----> Check for web server install
…………………… #这里告诉你一堆常用的web服务器配置文件所在位置
#因为我们用nginx因此这些对我们没意义
Config file path ('none' to skip web server setup): #问你要一个web日志位置,这个位置我们稍后指定这里none
> none

Your web server config file(s) could not be found.
…………………… #询问是否需要创建一个针对监控站点的配置文件当然yes
file (required if first install) [y/N] ? y

-----> Define config file name to create
……………………
> #这里要求输入站点的名字一般是IP或网址

-----> Define config file path
……………………… #告诉你一些新创建的配置文件的位置及文件名信息
/opt/install/awstats70/tools/awstats_updateall.pl now #建议你执行awstats_updateall.pl脚本生成原始数据
Press ENTER to continue... #让你回车以继续配置


A SIMPLE config file has been created: /opt/install/awatats70/awstats..conf
You should have a look inside to check and change manually main parameters.
You can then manually update your statistics for '' with command:
> perl awstats.pl -update -config=
You can also build static report pages for '' with command: #总结了初始化过程并简单告诉你应该如何使用该工具
> perl awstats.pl -output=pagetype -config=

Press ENTER to finish... #让回车完成配置,自动退回到shell提示符下,

[root@support-bk awstats70]# 
[root@support-bk awstats70]# 
########################awstats初始化完成############################
注意:配置过程中不能使用退格键删除输入字符,如果输入有误可以使用del键删除;
使用非标准目录安装awstats后会在启动时报告找不到awstats..conf配置文件的错误,可以通过编辑wwwroot/cgi-bin/awstats.pl大约1714行到1717行
   1713         my @PossibleConfigDir = (
   1714                         "$DIR",
   1715                         "/etc/awstats",
   1716                         "/usr/local/etc/awstats", "/etc",
   1717                         "/etc/opt/awstats"
   1718                 );
把随便一行改成配置文件所在位置例如下边这样
   1713         my @PossibleConfigDir = (
   1714                         "$DIR",
   1715                         "/opt/awstats70",
   1716                         "/usr/local/etc/awstats", "/etc",
   1717                         "/etc/opt/awstats"
   1718                 );
再启动就不会报配置文件位置错误了;

至此awstats的安装也顺利完成了,下面才是最难缠的部分,配置文件的修改;

三、配置与测试
整个系统需要修改配置的地方主要有三处nginx的配置文件、awstats的配置文件、tomcat的配置文件,至于php的安装时就配置过了和整个系统关系不大下面我们
分布讲解各个配置文件的调整;
1、tomcat的配置文件之前tomcat的安装已经进行完毕了安装目录是/opt/tomcat6033我们需要修改的文件在/opt/tomcat6033/conf/service.xml
在该文件的后半段,找到下面这段配置信息
     
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

修改后变成如下内容,因为我们的应用不是部署在/opt/tomcat6033/webapp下所以这里要去掉appbase的信息重新配置docbase
     
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

        
                docBase="/opt/nginx112/html" debug="5" reloadable="true" crossContext="true">
        

2、开始修改nginx的配置文件,相对于tomcat的配置文件nginx的修改想对复杂,该文件默认只能相应静态页面的访问请求但是其他类型的文件都
给了配置的例子,下面是一个完整的配置文件,我会着重讲解需要注意的部分;

###############nginx配置文件和常用选项####################
user  mysql; #指定想要用哪个用户的权限运行nginx,注意这个不是启动用户
#启动都是用root这个是指对外提供服务的子进程使用的用户
worker_processes  4; #启动时初始进程数量,这个一般与CPU个数相同或二倍
error_log  logs/error.log  info; #启动和运行错误日志存储路径
pid        logs/nginx.pid; #启动后PID文件位置,这个用途和php的pid文件相同
events {
    worker_connections  1024; #工作进程的最大连接数,根据硬件性能而定
} #个人理解也就是一个进程所能处理的最大连接数

http {
    include       mime.types; #反向代理配置,可以打开proxy.conf看看
    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        on;
    keepalive_timeout  65;
    gzip  on;
    server { #从这里开始配置主机,nginx的配置文件很好懂
        listen       80; #监听端口
        server_name  localhost; #这个可以写你的站点例如
        charset gb2312; #站点默认字符集,个人体会可有可无
        location / { #站点根目录配置
            root   html; #如果下面也配置了root这里可以省掉
            index  index.html index.htm; #默认首页文件可以多个用空格隔开
        }
        error_page   500 502 503 504  /50x.html; #报错页面配置,可有可无
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ { #关键部分,php文件的解析,所有以“.php”结尾的
            root           html; #根目录是/opt/nginx112/html的
            fastcgi_pass   127.0.0.1:9000; #全部通过fastcgi交给127.0.0.1:9000来解析
            fastcgi_index  index.php; #首页
            fastcgi_param  SCRIPT_FILENAME  /opt/nginx112/html$fastcgi_script_name; #使用fastcgi的脚本路径
            include        fastcgi_params;
        }
        location ~ \.jsp$ { #关键部分,关于jsp文件的解析
            proxy_pass   #配置很简单,所有的jsp结尾的文件都
        } #交给8080端口的tomcat处理

location ^~/icon/ { #最后关于awstats的图标等静态文件的路径配置
            root   /opt/awstats70/wwwroot; #没有这一项awstats上面所有图片会有变成小叉子
            index  index.html index.htm;
            access_log  off; #为了统计信息准确,对该目录的访问不记录日志
            error_log   off; #同样不记录错误信息
            charset     gb2312; #对图片来说这项没意义
        }
        location ~ ^/.*\.pl$ { #为了使
                root            /opt/awstats70/wwwroot;
                fastcgi_index   index.cgi;
access_log  off; #为了统计信息准确,对该目录的访问不记录日志
error_log   off; #同样不记录错误信息
                auth_basic  "admin"; #为awstats的访问加上访问限制,访问用户名为admin
                auth_basic_user_file        /opt/nginx112/admin.pass; #admin的密码文件存储位置在/opt/nginx112/admin.pass
#这个文件可以通过apache的htpasswd命令生成,别问我哪找apache
                fastcgi_param SCRIPT_FILENAME /opt/awstats70/wwwroot/cgi-bin$fastcgi_script_name; #下面这些都是fastcgi相关的设置
                fastcgi_param SCRIPT_FILENAME /opt/awstats70/wwwroot/cgi-bin$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_param GATEWAY_INTERFACE  CGI/1.1;
                fastcgi_param SERVER_SOFTWARE    nginx; 
                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; 
                include         fastcgi_params;
                fastcgi_read_timeout    5m;
                fastcgi_pass    unix:/opt/nginx112/logs/nginx-fcgi.sock; #这里要注意,需要制定fastcgi套接字文件位置,
        } #方便起见我把它放在nginx的logs下了这个路径要记住一会有用
    }
}

到这里nginx的配置全部完成,nginx有一个非常方便的功能能够检查nginx的语法错误,并且能够在服务运行中动态重载配置文件
[root@support-bk nginx112]# sbin/nginx -t #-t参数测试配置文件问题,如果有问题会提示哪行有错误
nginx: the configuration file /opt/nginx112/etc/nginx.conf syntax is ok #没问题就OK了
nginx: configuration file /opt/nginx112/etc/nginx.conf test is successful
[root@support-bk nginx112]# sbin/nginx -s reload #执行-s reload重载配置文件

现在php和js解析应该没有问题了但是cgi还有一步要做,因为本身nginx没有cgi脚本解释能力所以需要借助一个perl脚本来完成并且需要安装两个CGI相关工具
一个FCGI一个FCGI-procManager,因为是perl的插件所以安装时编译过程稍有不同
 [root@support-bk opt]# cd install/
 [root@support-bk install]# tar -xzvf FCGI-0.74.tar.gz 
 [root@support-bk install]#  cd FCGI-0.74
 [root@support-bk FCGI-0.74]#  perl Makefile.PL #编译时使用perl命令来做makefile
 [root@support-bk FCGI-0.74]  make ;make install
 
 [root@support-bk install]#  tar -xzvf FCGI-ProcManager-0.24.tar.gz 
 [root@support-bk install]#  cd FCGI-ProcManager-0.24
 [root@support-bk FCGI-ProcManager-0.24]#  perl Makefile.PL 
 [root@support-bk FCGI-ProcManager-0.24]#  make; make install

安装完上述两个辅助包后将下列内容保存到一个文件中,这是一个现成的perl编写的CGI分发脚本,负责处理CGI程序,
整个脚本只有一处地方需要修改,就是在nginx配置中提到过的那个套接字文件路径;
[root@support-bk opt]# vi cgiwrap-fcgi.pl 

#############################CGI脚本开始############################

#!/usr/bin/perl -w 
use FCGI; 
use Socket; 
use FCGI::ProcManager; 
sub shutdown { FCGI::CloseSocket($socket); exit; } 
sub restart  { FCGI::CloseSocket($socket); &main; } 
use sigtrap 'handler', \&shutdown, 'normal-signals'; 
use sigtrap 'handler', \&restart,  'HUP'; 
require 'syscall.ph'; 
use POSIX qw(setsid); 
 
#&daemonize; we don't daemonize when running under runsv 
#this keeps the program alive or something after exec'ing perl scripts 
END()   { } 
BEGIN() { } 
    no warnings; 
    *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; }; 
}; 
eval q{exit}; 
if ($@) { 
    exit unless $@ =~ /^fakeexit/; 
&main; 
 
sub daemonize() { 
    chdir '/' or die "Can't chdir to /: $!"; 
    defined( my $pid = fork ) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid() or die "Can't start a new session: $!"; 
    umask 0; 
 
sub main { 
 
#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets 
#$socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!! 
#foreach $item (keys %ENV) { delete $ENV{$item}; } 
    $proc_manager = FCGI::ProcManager->new( {n_processes => 5} ); 
####################该脚本只有下面一行需要改,其他完全照搬复制即可########################
    $socket = FCGI::OpenSocket( "/opt/nginx112/logs/nginx-fcgi.sock", 10 ) 
        ; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!! 
    $request = 
        FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket, 
        &FCGI::FAIL_ACCEPT_ON_INTR ); 
    $proc_manager->pm_manage(); 
    if ($request) { request_loop() } 
    FCGI::CloseSocket($socket); 
 
sub request_loop { 
    while ( $request->Accept() >= 0 ) { 
        $proc_manager->pm_pre_dispatch(); 
 
        #processing any STDIN input from WebServer (for CGI-POST actions) 
        $stdin_passthrough = ''; 
        { no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; }; 
        if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) && ( $req_len != 0 ) ) 
        { 
            my $bytes_read = 0; 
            while ( $bytes_read < $req_len ) { 
                my $data = ''; 
                my $bytes = read( STDIN, $data, ( $req_len - $bytes_read ) ); 
                last if ( $bytes == 0 || !defined($bytes) ); 
                $stdin_passthrough .= $data; 
                $bytes_read += $bytes; 
            } 
        } 
 
        #running the cgi app 
        if ( 
            ( -x $req_params{SCRIPT_FILENAME} ) &&    #can I execute this? 
            ( -s $req_params{SCRIPT_FILENAME} ) &&    #Is this file empty? 
            ( -r $req_params{SCRIPT_FILENAME} )       #can I read this file? 
            ) 
        { 
            pipe( CHILD_RD,   PARENT_WR ); 
            pipe( PARENT_ERR, CHILD_ERR ); 
            my $pid = open( CHILD_O, "-|" ); 
            unless ( defined($pid) ) { 
                print("Content-type: text/plain\r\n\r\n"); 
                print 
"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n"; 
                next; 
            } 
            $oldfh = select(PARENT_ERR); 
            $|     = 1; 
            select(CHILD_O); 
            $| = 1; 
            select($oldfh); 
            if ( $pid > 0 ) { 
                close(CHILD_RD); 
                close(CHILD_ERR); 
                print PARENT_WR $stdin_passthrough; 
                close(PARENT_WR); 
                $rin = $rout = $ein = $eout = ''; 
                vec( $rin, fileno(CHILD_O),    1 ) = 1; 
                vec( $rin, fileno(PARENT_ERR), 1 ) = 1; 
                $ein    = $rin; 
                $nfound = 0; 
 
                while ( $nfound = 
                    select( $rout = $rin, undef, $ein = $eout, 10 ) ) 
                { 
                    die "$!" unless $nfound != -1; 
                    $r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1; 
                    $r2 = vec( $rout, fileno(CHILD_O),    1 ) == 1; 
                    $e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1; 
                    $e2 = vec( $eout, fileno(CHILD_O),    1 ) == 1; 
 
                    if ($r1) { 
                        while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) { 
                            print STDERR $errbytes; 
                        } 
                        if ($!) { 
                            $err = $!; 
                            die $!; 
                            vec( $rin, fileno(PARENT_ERR), 1 ) = 0 
                                unless ( $err == EINTR or $err == EAGAIN ); 
                        } 
                    } 
                    if ($r2) { 
                        while ( $bytes = read( CHILD_O, $s, 4096 ) ) { 
                            print $s; 
                        } 
                        if ( !defined($bytes) ) { 
                            $err = $!; 
                            die $!; 
                            vec( $rin, fileno(CHILD_O), 1 ) = 0 
                                unless ( $err == EINTR or $err == EAGAIN ); 
                        } 
                    } 
                    last if ( $e1 || $e2 ); 
                } 
                close CHILD_RD; 
                close PARENT_ERR; 
                waitpid( $pid, 0 ); 
            } else { 
                foreach $key ( keys %req_params ) { 
                    $ENV{$key} = $req_params{$key}; 
                } 
 
                # cd to the script's local directory 
                if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/ ) { 
                    chdir $1; 
                } 
                close(PARENT_WR); 
 
                #close(PARENT_ERR); 
                close(STDIN); 
                close(STDERR); 
 
                #fcntl(CHILD_RD, F_DUPFD, 0); 
                syscall( &SYS_dup2, fileno(CHILD_RD),  0 ); 
                syscall( &SYS_dup2, fileno(CHILD_ERR), 2 ); 
 
                #open(STDIN, "<&CHILD_RD"); 
                exec( $req_params{SCRIPT_FILENAME} ); 
                die("exec failed"); 
            } 
        } else { 
            print("Content-type: text/plain\r\n\r\n"); 
            print 
"Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n"; 
        } 
    } 

###############################CGI脚本结束##############################

脚本文件完成后赋予脚本可执行权限
[root@support-bk opt]# chmod 755 cgiwrap-fcgi.pl #给脚本赋予可执行权限
[root@support-bk opt]#  ./cgiwrap-fcgi.pl & #启动CGI解析服务

[root@support-bk opt]#   cd nginx112/logs #到配置好的路径下看是否出现了相应的sock文件
由于上面的脚本使用的是root用户执行,因此生成的sock文件属主也是root,而此时nginx的运行用户是mysql,这将导致nginx没有权限使用该scok文件解析CGI
因此需要将文件属主改为mysql
[root@support-bk logs]#  chown mysql:mysql nginx-fcgi.sock #修改文件属性
有时还需要重启nginx命令为 kill -HUP `cat /opt/nginx/112/logs/nginx.pid`
Nginx的相关配置到这里结束,下面就开始配置awstats7.0了

3、awstats的配置,主要是修改刚刚生成的配置文件awstats..conf,该文件中内容很多但是需要修改的不多,不需要动的部分都用…………省略;
[root@support-bk awstats70]# cat awstats.192.168.129.234.conf |grep -v '^#'
………………
LogFile="/opt/nginx112/logs/access.log" #第一个要改的地方就是这个日志位置,这能让awstats找到需要分析的日志
#如果有多个站点需要生成多个这样的配置文件
LogType=W
LogFormat=1
LogSeparator=" "
SiteDomain="192.168.129.234" #要分析的站点域名
HostAliases="192.168.129.234 127.0.0.1 localhost" #可以配置该站点别名
DNSLookup=2
DirData="/opt/awstats70/awstats" #分析完成后的数据存在哪个目录,我配置的这个目录需要手都创建
DirCgi="/cgi-bin"
………………………… #其他选项就是不配置也能让awstats正常跑起来
[root@support-bk awstats70]# 

[root@support-bk awstats70]# wwwroot/cgi-bin/awstats.pl -update -config= #跟新一下awstats的数据内容就可以看图了
为了能够自动执行分析日志,将这个命令加入到计划任务
05 01 * * * /opt/awstats7/wwwroot/cgi-bin/awstats.pl -update -config=

4、站点的测试

为了验证我们配置的站点是否工作正常可以编辑一个jsp文件和一个php文件看看是否能返回正确结果,这里有2个现成的例子,大家复制代码保存成
对应jsp和php文件就行了,其中第一个PHP文件中用户名和密码都需要自己配置,如果数据库连接成功会在页面结尾显示Success!!字样;
[root@support-bk install]# cat laogao.php 
        phpinfo();
        $link=mysql_connect('localhost','root','111111');
        if(!$link)
                echo "Fail !!";
        else
                echo "Success !!";
        mysql_close();
?>
[root@support-bk install]# cat jspinfo.jsp 
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
JSP Info

  
 
    
  
  
 
    
  
  
 
    
  
  
 
    
    
  
  
 
    
    
  
  
 
    
    
  
  
 
    
    
  
  
 
    
  
  <%
        ServletContext context = getServletContext();
        Enumeration en = context.getAttributeNames();
        while (en.hasMoreElements()) {
            String key = (String)en.nextElement();
            Object value = context.getAttribute(key);
            out.println("
");
        }

%>
  
 
    
  
JSP Info v1.0
Author: Snowman       Web: 
      
 
Environment (环境)Values (值)
Server name (服务器名称)<%= request.getServerName() %>
Server port (服务器端口)<%= request.getServerPort() %>
Remote IP address (客户端IP地址)<%= request.getRemoteAddr() %>
Context attributes (相关属性)
" + key + "" + value + "
End (结束)
[root@support-bk install]# 
[root@support-bk install]#   cp /opt/install/jspinfo.jsp /opt/nginx112/html/
[root@support-bk install]#   cp /opt/install/laogao.php /opt/nginx112/html/
最后通过浏览器看看自己的劳动成果吧
http:///jspinfo.jsp #将显示出JSP相关信息
http:///laogao.php #显示php相关信息
http:///awstats.pl?config= #将提示输入密码,正确输入后显示访问统计页面信息


后记:
整个NGINX+php+jsp+cgi+mysql+awstats搭建过程就完成了,本文档所有操作均来自实际环境,如果你不想费劲理解相关内容,那么复制粘贴各条命令就
能够创建一个功能完善的站点,当然这只是最初环境的搭建,nginx和php、mysql、tomcat都有很多优化参数可调,限于篇幅原因这里不做叙述。
至于很多人头疼的awstats安装插件的问题个人认为如果需求不是很强烈的话不装也行,现有分析数据足够日常用作使用,如有时间后续会补充插件安装相关文档

阅读(2674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~