WEB平台架构之:LNMP(CentOS6.5+Nginx+MySQL+Php)
为了写Nginx的系列教程,在介绍Nginx的各项功能时,能有个测试的环境,因此于此写一篇LNMP的架构搭建,使那些看文档的人能够搭建自己的环境来测试Nginx的功能。但是通常情况下nginx用作纯web站点不是很多,更多的是将nginx用在反向代理环境中。但是由于nginx处理静态文件的优越性能,也常常会使用nginx配合php来实现动静分离,起到web响应加速的功能.
1.准备工作
OS:CentOS6.5x64
hostname:test2.lxm.com
ip:10.0.10.12
software: /root/soft/
nginx-1.6.1.tar.gz
pcre-8.33.tar.gz
openssl-1.0.1i.tar.gz
mysql-5.5.27.tar.gz
php-5.5.16.tar.gz
libmcrypt-2.5.7.tar.gz
mhash-0.9.9.tar.gz
software install path:/usr/local/
注意:在准备工作中,要准备好一台centos系统,配置好网络环境和yum源,准备好要用的软件包,决定好软件包放置的位置和要安装的位置。其次安装过程全部采用源码包编译安装。
#yum -y install gcc* compact-gcc* autoconf automake make cmake
//安装编译安装需要的编译软件,如果系统已经安装过了,则无需再次安装
#iptables -F;service iptables stop;chkconfig iptables off
//关闭防火墙,生产环境中不建议关闭iptables
//临时关闭selinux
#setenforce 0
如果想永久关闭selinux,则修改配置文件
2.安装nginx
#cd /root/soft
#tar -zxvf openssl-1.0.1i.tar.gz
#tar -zxvf pcre-8.35.tar.gz
#tar -zxvf nginx-1.6.1.tar.gz
#cd nginx-1.6.1
#mkdir -pv /usr/local/nginx {client_body_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp}
#./configure --prefix=/usr/local/nginx/ --with-pcre=/root/soft/pcre-8.35 --with-http_ssl_module --with-openssl=/root/soft/openssl-1.0.1i --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module --http-client-body-temp-path=/usr/local/nginx/client_body_temp/ --http-proxy-temp-path=/usr/local/nginx/proxy_temp/ --http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp/ --http-scgi-temp-path=/usr/local/nginx/scgi_temp/
#make && make install
#make clean
到此,如果没有什么报错,则基本安装成功。不过要注意的是pcre和openssl用的都是源码包
测试nginx:
#/usr/local/nginx/sbin/nginx //启动nginx
#ps aux | grep nginx //查看nginx进程是否启动成功
#netstat -nultp | grep 80 //查看80端口是否监听,nginx默认监听在80端口
浏览器测试;
http://10.0.10.12 //如果正常出现nginx的欢迎页面,则表示nginx安装成功
拓展:
给大家介绍一个linux下的文本浏览器elinks,以后本地测试时,可以直接在linux系统中进行测试。
#yum -y install elinks
#links --dump http://10.0.10.12 //直接打印出web站点的内容,如果想以交互式的界面访问,则直接敲入elinks回车即可。
3.安装MySQL
#yum -y install zlib-devel openssl-devel ncurses-devel bison//因为下面编译mysql用到了这几个开发文件,所以必须安装好
#cd /root/soft/
#tar -zxvf mysql-5.5.27.tar.gz
#cd mysql-5.5.27
#mkdir /usr/local/mysql
#useradd -s /sbin/nologin mysql -M
#cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysqldata (注:这里在企业环境中,通常会用一个单独的目录来存放mysql的数据文件,如果业务小可以不用,默认放在/var/lib/mysql下面)
-DSYSCONFDIR=/etc
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
-DENABLED_LOCAL_INFILE=1
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
-DMYSQL_TCP_PORT=3306
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS:STRING=all
-DMYSQL_USER=mysql
-DWITH_DEBUG=0
#make
#make install
#make clean
#chown -R mysql.mysql /usr/local/mysql
#chown -R mysql.mysql /data/mysqldata
#cd /usr/local/mysql/scripts
#mysql_install_db --datadir=/data/mysqldata --basedir=/usr/local/mysql --user=mysql
#cd ../support-files
#cp my-large.cnf /etc/rc.d/my.cnf
#cp -p mysql.server /etc/rc.d/init.d/mysqld
#chown -R root.mysql /usr/local/mysql
#service mysqld start
#mysqladmin -u root passwod "lxm" //设置MySQL root用户的密码
#mysql -u root -p
输入root密码,测试mysql安装是否成功
到此,如果一切都没有错误,则表示mysql安装成功
4.安装PHP
php的安装和使用,确实是值得一说的技术,但是这里只做简单的安装使用。关于详细的安装使用将在LAMP中详细的聊一聊。。。
安装必须的软件包:
#yum -y install ncurses-devel net-snmp-devel bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel libxml2 libxml2-devel libxslt libxslt-devel zlib zlib-devel expat expat-devel openssl openssl-devel gd php-gd libjpeg libjpeg-devel libtool libtool-ltdl libtool-ltdl-devel
安装libmcrypt和mhash //这两个东西都是为php提供加密算法相关的库文件的
#cd /root/soft
#tar -zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#mkdir /usr/local/libmcrypt
#./configure --prefix=/usr/local/libmcrypt
#make && make install
#make clean
#cd /root/soft
#tar -zxvf mhash-0.9.9.tar.gz
#cd mhash-0.9.9
#mkdir /usr/local/mhash
#./configure --prefix=/usr/local/mhash
#make && make install
#make clean
安装php:
#cd /root/soft/
#tar -zxvf php-5.5.16.tar.gz
#cd php-5.5.16
#mkdir /usr/local/php55
#./configure --prefix=/usr/local/php55/ --with-libxml-dir=/usr/include/libxml2/ --with-config-file-path=/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-gd --enable-gd-native-ttf --with-zlib --with-mcrypt=/usr/local/libmcrypt/ --with-mhash=/usr/local/mhash/ --with-pdo-mysql=mysqlnd --enable-fpm --enable-shmop --enable-soap --enable-sockets --enable-wddx --enable-zip --with-xmlrpc --enable-mbstring --with-zlib-dir=/usr/lib --with-bz2 --with-curl --enable-exif --enable-ftp --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-freetype-dir=/usr/lib --with-pcre-dir --enable-bcmath --with-config-file-scan-dir=/etc/php.d/ --with-openssl
如果没有错误,将会显示下面的内容:
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+
Thank you for using PHP.
config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
#make && make install
如果没有错误将显示下面的内容:
Installing shared extensions: /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
Installing PHP CLI binary: /usr/local/php55/bin/
Installing PHP CLI man page: /usr/local/php55/php/man/man1/
Installing PHP FPM binary: /usr/local/php55/sbin/
Installing PHP FPM config: /usr/local/php55/etc/
Installing PHP FPM man page: /usr/local/php55/php/man/man8/
Installing PHP FPM status page: /usr/local/php55/php/fpm/
Installing PHP CGI binary: /usr/local/php55/bin/
Installing PHP CGI man page: /usr/local/php55/php/man/man1/
Installing build environment: /usr/local/php55/lib/php/build/
Installing header files: /usr/local/php55/include/php/
Installing helper programs: /usr/local/php55/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php55/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php55/lib/php/
[PEAR] Archive_Tar - installed: 1.3.12
[PEAR] Console_Getopt - installed: 1.3.1
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util - installed: 1.2.3
[PEAR] PEAR - installed: 1.9.5
Wrote PEAR system config file at: /usr/local/php55/etc/pear.conf
You may want to add: /usr/local/php55/lib/php to your php.ini include_path
/root/soft/php-5.5.16/build/shtool install -c ext/phar/phar.phar /usr/local/php55/bin
ln -s -f /usr/local/php55/bin/phar.phar /usr/local/php55/bin/phar
Installing PDO headers: /usr/local/php55/include/php/ext/pdo/
#make clean
#cp php.ini-production /etc/php.ini
#cd /usr/local/php55/bin
#./php -m | less // 查看php编译内置的模块,如果没有你需要的则需要额外添加,具体怎么配置请见LAMP
注意:测试php模块时常见的一个错误是提示你不能加载某些模块,例如:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/curl.so' - /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/curl.so: cannot open shared object file: No such file or directory in Unknown on line 0 。出现这样的错误,不要紧张。这是因为你是编译安装的php模块,而这里提示你不能加载的模块通常都是你rpm包安装时需要加载的模块。这些模块的配置文件通常都在/etc/php.d/目录下,你只需要删除这些文件即可,再次测试就不会有错。而你发现未能加载的模块,在php的内置模块中已经可以使用了,这就是php的源码编译。
#cd /usr/local/php55/etc/ //提示:为什么总是用绝对路径,就是怕有些人不知道我切来切去,切哪里去了。笨蛋的技术,必须让你知道所以然。。。。
#cp -p php-fpm.conf.default php-fpm.conf
[root@test2 etc]# /usr/local/php55/sbin/php-fpm //启动fpm进程
[root@test2 etc]# ps aux | grep fpm
root 17161 0.0 0.9 207092 4972 ? Ss 10:38 0:00 php-fpm: master process (/usr/local/php55/etc/php-fpm.conf)
nobody 17162 0.0 0.8 207092 4388 ? S 10:38 0:00 php-fpm: pool www
nobody 17163 0.0 0.8 207092 4388 ? S 10:38 0:00 php-fpm: pool www
root 17165 0.0 0.1 103244 848 pts/0 S+ 10:38 0:00 grep fpm
[root@test2 etc]# netstat -nultp | grep fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 17161/php-fpm
由上面的信息可知,php-fpm已经成功启动,并监管php程序的解释
相关内容介绍:
1.freetype:是一些常用的字体库
2.zlib:是互联网上通用格式的压缩库
3.--enable-sockets:让php可以支持套接字通信
4.mcrypt:支持加密功能的额外加密库
5.如果使用PHP5.3以上版本,为了连接MySQL数据库,可以指定mysqlnd,这样在本机就不用先安装MySQL或MySQL开发包了。mysqlnd从php5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端绑定形成依赖,但从php5.4开始它就是默认的了。
#./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
6.--enalbe-fpm 该选项是将php编译成单独的由php-fpm管理的服务器。nginx没有像apache那样把php集成到内部的功能,因此编译php时必须加上该选项,否则nginx与php将不可通过fastcgi进行整合。也正是由于这个功能,可以将php做成集群。
5.整合nginx和php
nginx和php的整合可以通过proxy_pass和fastcgi两种方式来整合,但是通常是通过fastcgi的方式来进行整合,至于fastcgi的好处,请自行查阅。。。
修改配置文件:/usr/local/nginx/conf/nginx.conf
确保有如下整合php的配置:
location ~ \.php$ {
root /usr/local/nginx/html; //这是指定网站的根目录,在网站根目录以外的php文件是不会被解释的,会提示file not found。
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; // 这是nginx文档里面默认的配置,但是在新版的nginx当中已经无效,会提示招不到根目录
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#service nginx configtest //检查配置文件是否有语法错误
#service nginx restart // 我已经配置nginx的启动文件,如果你也需要,请到nginx的安装部署里面拷贝一个。
#cd /usr/local/nginx/html
创建一个index.php的测试文件,内容如下:
<?php
phpinfo();
?>
测试php页面是否能够正常解析并访问:
浏览器:
http://10.0.10.12/index.php
如果一切正常,会返回php的测试页面,该页面也是查看php相关参数和功能的页面,必须要会
6.测试LNMP架构
安装好了nginx,mysql,php,最后就要测通这三个程序在linux平台上是否能够跑通,这里利用一个简单的php测试文件即可。
#cd /usr/local/nginx/html
#vim index.php
修改该配置文件内容如下:
<?php
$links = mysql_connect('localhost','root','lxm');
if ($links)
echo "yes";
else
echo "no";
?>
流程:当客户端请求该php文件时,nginx会将该php文件提交给后端的php-fpm进行解析,然后php调用mysql_connect对后端数据库进行连接测试,如果成功则返回yes,失败则返回no
测试:
http://10.0.10.12/index.php
此时返回的结果是:no
这是why?查看日志:
看上面的报错,好像是说mysql_connect这个函数没有找到。奇怪为什么?经过多番测试,发现原来是mysql的sock文件的位置问题。在上面编译时,使用了--enable-sockets,php默认是查找/var/lib/mysql下的mysqld.sock文件,这也是mysql默认存放sock的位置,但是此文档在安装mysql时,将sock放到了tmp目录下,因此需要修改php.ini文件指定sock文件的位置。
#vim /etc/php.ini
找到下面的选项并指定soket位置
mysql.default_socket = /tmp/mysqld.sock
重启php-fpm:
#pkill php-fpm
#/usr/local/php55/sbin/php-fpm
此时再次测试,返回yes,表示测试成功,也表示整个LNMP架构已经测通。
到此,LNMP平台就搭建完成,更多技术文档请看下回分解。。。。。
结束!!!
笨蛋的技术------不怕你不会!!!!