这篇文章主要是记录了利用nginx,php,mysql构建一个web站点的一般过程。系统环境为CentOS6.3,为了避免源码编译过程中众多非预知的错误,linux下的软件大多直接以yum方式安装。

nginx

--------------------

因为最终要构建的是一个可供开发的web站点,安装nginx的时候需要一些软件作铺垫,它们包括:

GCC编译器:用来编译C语言程序,编译nginx源码必需的。

yum install –y gcc

PCRE库:Perl兼容正式表达式,如果在配置文件nginx.conf里面使用了正式表达式,那么在编译nginx时就必需把PCRE库编译进nginx。因为nginx的HTTP模块需要靠它来解析正则表达式。

yum install –y pcrepcre-devel

注:pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译nginx所必需的。

Zlib库:用于对HTTP包的内容做gzip格式的压缩,我们一般会在nginx.conf里面配置gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量。Zlib-devel是二次需要的库也需要。

yum install -y zlibzlib-devel

OpenSSL开发库:用于支持在SSL协议上传输HTTP,另外如果想使用MD5、SHA1等散列函数,那么也需要安装它。

yum install -yopenssl openssl-devel

从http://nginx.org/下载nginx的源码并解压,进入源码目录后,依次执行:

./configure

make

make install

默认安装在/usr/local/nginx目录下。

PHP

--------------------
yum安装php。
yum install –y php
[root@alex ]#rpm -qa | grep -i php
php-5.3.3-27.el6_5.x86_64
php-common-5.3.3-27.el6_5.x86_64                         //php依赖包
php-cli-5.3.3-27.el6_5.x86_64                                     //php依赖包

php就这样安装好了,但此时nginx和php还是两个相对独立的组件,默认情况下没有建立直接的联系,也就是说nginx此时还不能解析php文件。作为一个轻量级的Web Server,nginx本身不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP解析)必须借助于FastCGI接口来调用。那为什么Apache服务器解析PHP的时候没有再额外安装FastCGI呢,因为Apache默认是用自带的mod_php模块运行php,实际上你也可以配置Apache使用FastCGI来执行PHP脚本,本文不作此讨论,这方面可以参考https://www.centos.bz/2011/12/configure-apache-run-php-as-fastcgi/。

fastcgi的优点:

稳定:fastcgi是以独立的进程池运行cgi(可以同时启动多个CGI解释器进程),单独一个进程死掉,系统可以很轻易的将它丢弃,然后重新分配新的进程来运行处理逻辑。

性能:fastcgi把动态逻辑的处理从server中分离出来,大负荷的IO处理还是留给宿主server,这样宿主server可以一心一意作IO,对于一个普通的动态网页来说,逻辑处理可能只有一小部分,大量的图片等静态IO处理完全不需要逻辑程序的参与。

扩展性:fastcgi是一个中立的技术标准,完全可以支持任何语言写的处理程序 (php,java,perl,ruby,c++,python...)。

此外,Fastcgi还支持分布式运算。即运行FastCGI程序的主机可以与运行网站服务器的主机实现分离。

要想nginx服务器使用FastCGI执行PHP脚本解析还需要安装一个FastCGI进程管理器,通过它来维护cgi解释器进程。现在常用的是一个叫PHP-FPM的进程管理器,它是一个第三方的FastCGI进程管理器,作为PHP的一个补丁来开发,在安装的时候需要和PHP源一起编译,也就是说PHP-FPM被编译到PHP内核中。因为我们是通过rpm包的方式来安装,所以这里直接用yum来安装php-fpm就可以了。

yum install –y php-fpm
[root@alex~]# rpm -qa | grep php-fpm
php-fpm-5.3.3-27.el6_5.x86_64
[root@alex~]# rpm -ql php-fpm
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/rc.d/init.d/php-fpm
/etc/sysconfig/php-fpm
/usr/sbin/php-fpm
/usr/share/doc/php-fpm-5.3.3
……

php-fpm有两种执行方式, 与Apache一样,他的进程数也是可以根据设置分为动态和静态两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少;另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限。下面给出我云主机上的php-fpm的配置实例。

[root@alex ~]# cat/etc/php-fpm.d/www.conf | grep -v ';' | grep -v ^$     
[www]
listen = 127.0.0.1:9000                               //监听本地主机9000端口,这个很重要!!
listen.allowed_clients = 127.0.0.1
user = apache
group = apache
pm = dynamic                              //动态方式
pm.max_children = 50                                 //最大可以增加到50个进程
pm.start_servers = 5                                   //起动的时候开起5个进程
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog =/var/log/php-fpm/www-slow.log
php_admin_value[error_log] =/var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] =files
php_value[session.save_path] =/var/lib/php/session

         按照以上配置启动php-fpm,它会监听本主机的9000,拼接收发往该端口的php解析请求。php-fpm已经准备好了,后面还会要配置nginx让它将php文件的解释权转交给9000端口。

[root@alex ~]#/etc/init.d/php-fpm start

查看打开9000端口的php-fpm进程,好是1个主进程,5个子进程。

[root@alex ~]#lsof -i:9000
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
php-fpm26340   root    7u IPv4 3342038      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 26341apache    0u  IPv4 3342038      0t0 TCP localhost:cslistener (LISTEN)
php-fpm 26342apache    0u  IPv4 3342038      0t0 TCP localhost:cslistener (LISTEN)
php-fpm 26343apache    0u  IPv4 3342038      0t0 TCP localhost:cslistener (LISTEN)
php-fpm 26344apache    0u  IPv4 3342038      0t0 TCP localhost:cslistener (LISTEN)
php-fpm 26345apache    0u  IPv4 3342038      0t0 TCP localhost:cslistener (LISTEN)

接一来,我们将修改nginx的配置文件nginx.conf,使nginx通过FastCGI支持PHP。具体是删除location~\.php${…}设置段前面的”;”注释符。

[root@alex ]# vim/usr/local/nginx/conf/nginx.conf
# pass the PHP scriptsto 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;
        }

注意:fastcgi_param为脚本文件请求的路径,nginx.conf默认情况下该行内容为:

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 

需要修改/scripts字段为$document_root。

通过上面的设置,并重新reload配置文件,nginx就知道把php文件传递到本机的9000端口上由fastcgi来处理了。

MySQL

--------------------

安装myql涉及到的软包括:

mysql:mysql客户端;

mysql-server:mysql服务器端;

php-mysql:为php扩展mysql提供库文件;

mysql-libs:mysql开发包;

通过下面的命令进行快速安装。

yum install –y mysql*
yum install –y php-mysql
[root@alex ~]# rpm -qa | grep mysql
mysql-5.1.73-3.el6_5.x86_64
mysql-server-5.1.73-3.el6_5.x86_64
php-mysql-5.3.3-27.el6_5.x86_64
mysql-libs-5.1.73-3.el6_5.x86_64

启动mysql服务器。

[root@alex ~]# /etc/init.d/mysqld start

[root@alex ~]# lsof -i:3306

COMMAND  PID  USER   FD  TYPE  DEVICE SIZE/OFF NODE NAME

mysqld 19492 mysql   10u  IPv4 2203509      0t0 TCP *:mysql (LISTEN)

[root@alex ~]# ps aux | grep mysql | grep-v grep

root     2427  0.0  0.2 106060 1316 ?        S    May15  0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql--socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid--basedir=/usr --user=mysql

mysql    2558  0.0  4.4 584452 22244 ?        Sl  May15   1:17 /usr/libexec/mysqld--basedir=/usr --datadir=/var/lib/mysql --user=mysql--log-error=/var/lib/mysql/alex.err --pid-file=/var/run/mysqld/mysqld.pid--socket=/var/lib/mysql/mysql.sock --port=3306

可以看出mysql数据库服务器已成功启动,并监听3306端口。

Mysql安装成功后,mysql管理员默认为root用户,但此root用户不同于Linux系统的root用户,它登陆mysql的初始密码为空,当客户端连接mysql时,只需要输入mysql命令即可,安全性太差。所以,有必要通过mysqladmin命令修改一下root用户连接mysql服务器时的密码。

[root@alex ~]#mysqladmin –u root passwordxxxxxxxx

现在用root帐户重新连接。

[root@alex ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.1.73 Source distribution
mysql> show databases;                                               //显示已存在的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)
mysql> use mysql;                               //打开mysql数据库
Database changed
 
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
…..省略…..
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
23 rows in set (0.00 sec)

在nginx主目录下建立一个用php连接mysql的测试文件index.php。

[root@localhost html]vim index.php
<html>
<body>
<?php
           echo "<br \>---------------mysql-------------<br\>";
           $link = mysql_connect("localhost", "root","xxxxxx");
           if ($link) echo "connect to mysql..........ok";
           else echo "connect to mysql..........failed";
           mysql_close();
?>
</body>
</html>

运行结果:

浏览器:http://ip地址/

---------------mysql-------------

connect tomysql..........ok