这篇文章主要是记录了利用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