LNMP环境构建

LNMP(Linux+Nginx+Mysql+Php)就是在Linux系统中,通过编译安装Nginx,Mysql,Php来提供一个支持Php动态网页的Web服务器,构建过程如下:

nginx-1.0.13 + php-5.3.10 +mysql-5.5.20 编译安装过程

一.首先编译安装nginx-1.0.13

1、要解决依赖关系

编译安装nginx事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包:

# yum -y install pcre-devel

2、安装nginx

首先添加用户nginx,实现以之运行nginx服务进程:

# groupadd -r nginx

# useradd -r -g nginx -s /sbin/nologin -M nginx

下载nginx-1.0.13软件包,推荐下载地址为:http://mirrors.sohu.com/,也可以从其他网站获取。

#tar xf nginx-1.0.13.tar.gz   --解压缩软件包

#cd nginx-1.0.13

接着开始编译和安装:

# ./configure \

--prefix=/usr \        --指定安装路径

--sbin-path=/usr/sbin/nginx \    --指定sbin安装路径

--conf-path=/etc/nginx/nginx.conf \   --指定nginx的配置文件路径

--error-log-path=/var/log/nginx/error.log \ --指定错误日志路径

--http-log-path=/var/log/nginx/access.log \ --指定访问日志路径

--pid-path=/var/run/nginx/nginx.pid \  --指定pid路径

--lock-path=/var/lock/nginx.lock \   --指定锁文件路径

--user=nginx \        --指定运行此服务的用户

--group=nginx \        --指定运行此服务的组

--with-http_ssl_module \      --编译安装上ssl模块

--with-http_flv_module \      --编译安装上flv模块

--with-http_stub_status_module \    --编译安装上status模块

--with-http_gzip_static_module \    --编译安装上static模块

--http-client-body-temp-path=/var/tmp/nginx/client/ \

--http-proxy-temp-path=/var/tmp/nginx/proxy/ \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \  --启动fastcgi功能

--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

--http-scgi-temp-path=/var/tmp/nginx/scgi \

--with-pcre

# make

# make install

3、为nginx提供SysV init脚本:

vim /etc/rc.d/init.d/nginx,内容如下:

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig: - 85 15

# description: Nginx is an HTTP(S) server, HTTP(S) reverse \

#    proxy and IMAP/POP3 proxy server

# processname: nginx

# config:  /etc/nginx/nginx.conf

# config:  /etc/sysconfig/nginx

# pidfile:  /var/run/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {

# make required directories

user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

options=`$nginx -V 2>&1 | grep 'configure arguments:'`

for opt in $options; do

if [ `echo $opt | grep '.*-temp-path'` ]; then

value=`echo $opt | cut -d "=" -f 2`

if [ ! -d "$value" ]; then

# echo "creating" $value

mkdir -p $value && chown -R $user $value

fi

fi

done

}

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

make_dirs

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

configtest || return $?

stop

sleep 1

start

}

reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}

configtest() {

$nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

status $prog

}

rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac

而后为此脚本赋予执行权限:

# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx

# chkconfig nginx on

而后就可以启动服务并测试了:

# service nginx start

在浏览器中输入服务主机的IP地址或者网址,如果安装成功则会显示如下图所示的默认网页信息:

193110680.png

二.安装mysql-5.5.20

1.为了mysql数据的安全性,应该让mysql的数据放在一个独立的逻辑卷上,首先要先创建一个新分区,将分区的ID号改为8e,让其开机自动挂载至/mydata目录下

#partprobe /dev/sda

#pvcreate /dev/sda5

#vgcreate myvg /dev/sda5

#lvcreate -L 2G -n mydata myvg

#mke2fs -j /dev/myvg/mydata

#mkdir /mydata

vim /etc/fstab 添加如下一行:

/dev/myvg/mydata /mydata ext3 defaults 0 0

#mount -a

#mount  --此时已经挂载成功

我们应该将mysql的数据专门存储在/mydata的一个特定目录下,于是创建一个目录:

#mkdir /mydata/data

2.新建用户以安全方式运行mysql进程

#groupadd -r mysql

#useradd -g mysql -s /sbin/nologin -M mysql

#chown -R mysql:mysql /mydata/data

3.安装并初始化mysql-5.5.20,先下载到本地,推荐下载路径http://mirrors.sohu.com/ 也可以在其他网站下载。

然后开始解压编译安装

#tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local

#cd /usr/local

#ln -sv mysql-5.5.20-linux2.6-i686 mysql

#cd mysql

#chown -R mysql:mysql .

#scripts/mysql_install_db --user=mysql --datadir=/mydata/data

#chown -R root .

4.为mysql提供主配置文件

#cd /usr/local/mysql

#cp support-files/my-large.cnf /etc/my.cnf

#vim /etc/my.cnf

修改文件中的thread_concurrency的值为你的CPU个数乘以2,如:

thread_concurrency = 2

并在thread_concurrency下面添加mysql的数据文件存放路径:

datadir=/mydata/data

5.为mysql提供mysql的服务脚本文件

#cd /usr/local/mysql

#cp support-files/mysql.server /etc/rc.d/init.d/mysqld

将mysql添加至服务列表:

#chkconfig --add mysqld

#chkconfig mysqld on

而后就可以启动服务测试使用了,不过此时还不能直接使用mysql命令直接启动mysql,因为编译安装的mysql默认启动路径在/usr/local/mysql/bin 目录之下

只能使用/usr/local/mysql/bin/mysql 才能打开mysql 数据库

6.为了使mysql的安装符合通常系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

(1)输出mysql的man手册至man命令的查找路径:

#vim /etc/man.config 添加如下行:

MANPATH /usr/local/mysql/man

(2)输出mysql的头文件至系统头文件路径/usr/include,这里可以使用创建连接的方式完成:

# ln -sv /usr/local/mysql/include /usr/include/mysql

(3)输出mysql的库文件给系统库查找路径:

# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf

(4)让系统重新载入库文件:

#ldconfig -v

(5)修改PATH环境变量,让系统可以直接使用mysql的相关命令。

vim /etc/profile 添加如下行:

PATH=$PATH:/usr/local/mysql/bin 但此方法不会立即生效

想立即生效就在命令行中输入如下内容:

#export PATH=$PATH:/usr/local/mysql/bin

此时mysql数据库基本配置完成了,可以正常测试了,并给root用户设置访问mysql数据库的密码,如图所示:

192751599.png

三.编译安装php-5.3.10

1.确保配置好yum源(可以是本地系统光盘),如何配置本地yum源,相信大家都很熟悉了,这里不再给出步骤,然后执行如下命令:

# yum -y groupinstall "X Software Development"

如果想让编译的php支持mcrypt、mcrypt、mhash扩展和libevent,此处还需要下载如下几个rpm包并安装之,推荐下载路径http://www.rpmfind.net,也可以到互联网其他网站下载。

libmcrypt-2.5.8-4.el5.centos.i386.rpm

libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm

mhash-0.9.9-1.el5.centos.i386.rpm

mhash-devel-0.9.9-1.el5.centos.i386.rpm

libevent-2.0.17-2.i386.rpm

libevent-devel-2.0.17-2.i386.rpm

mcrypt-2.6.8-1.el5.i386.rpm

使用升级的方式安装上面的rpm包,命令格式如下:

# rpm -Uvh *.rpm

2、编译安装php-5.3.10

首先下载源码包至本地目录,推荐下载地址http://mirrors.sohu.com

# tar xf php-5.3.10.tar.bz2

# cd php-5.3.10

# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc/php --with-config-file-scan-dir=/etc/php --with-bz2 --with-curl

说明:如果前面第1步解决依赖关系时安装mcrypt相关的两个rpm包,此./configure命令还可以带上--with-mcrypt选项以让php支持mcrypt扩展。

{ 补充:如果编译安装了iconv软件包,编译步骤如下:

# tar zxvf libiconv-1.13.1.tar.gz

# cd libiconv-1.13.1

# ./configure

# make

# make install

在编译安装php的时候想更进一步扩展php功能,也可以加上 --with-iconv=/usr/local 让php支持iconv

在make的时候要注意,要使用下面的make命令:

(1)# make ZEND_EXTRA_LIBS='-liconv'

(2)# make install

如果不想扩展此功能,就直接跳过上面补充的操作。}

# make

# make test

# make intall

为php提供配置文件:

# cp php.ini-production /etc/php/php.ini

为php-fpm提供Sysv init脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm

不要忘记给它执行权限:

#chmod +x /etc/rc.d/init.d/php-fpm

#chkconfig --add php-fpm

#chkconfig php-fpm on

3、启动fastcgi:

为php-fpm提供配置文件:

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

编辑php-fpm的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置pm.的相关选项为自己所需要的值,并启用pid文件(如下最后一行):

pm.max_children = 50     此项pm的值和虚拟机或者物理机的内存有关,根据自己的内存空间进行适当修改。

pm.start_servers = 5     此项是初启动程序时开启的进程数 pm.min_spare_servers = 2    此项是最小空闲进程数

pm.max_spare_servers = 8    此项是最大空闲进程数

pid = run/php-fpm.pid

接下来就可以启动php-fpm了:

# service php-fpm start

使用如下命令来验正(如果此命令输出的结果中有几个php-fpm进程就说明启动成功了):

# ps aux | grep php-fpm

四、整合nginx和php-5.3.10

1、编辑/etc/nginx/nginx.conf,启用如下选项:

location ~ \.php$ {

root   html;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include  fastcgi_params;

}

2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:

fastcgi_param GATEWAY_INTERFACE CGI/1.1;

fastcgi_param SERVER_SOFTWARE nginx;

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 SCRIPT_FILENAME $document_root$fastcgi_script_name;

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;

并在所支持的主页面格式中添加php格式的主页,类似如下:

location / {

root html;

index index.php index.html index.htm;

}

而后重新载入nginx的配置文件:

# service nginx reload

3、在/usr/html目录下新建index.php的测试页面,测试php是否能正常工作:

# cat > /usr/html/index.php << EOF

<?php

phpinfo();

?>

接着就可以通过浏览器访问此测试页面了,访问成功说明nginx已经能提供php服务了,如下图:

132118258.png

4.如果想使用phpMyAdmin来测试,也可以这样。

(1)推荐下载路径http://www.rpmfind.net,下载后解压并重命名

(2)#cd /usr/html

#tar xf phpMyAdmin-3.4.10.1-all-languages.tar.bz2

#mv phpMyAdmin-3.4.10.1-all-languages pma

(3)在浏览器进行测试的时候在url中追加/pma,就可以看到phpMyAdmin的欢迎页面了。

五、安装xcache,为php加速:

1、安装

# tar xf xcache-1.3.2.tar.gz

# cd xcache-1.3.2

# /usr/local/php/bin/phpize

# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config

# make

# make install

安装结束时,会出现类似如下行:

Installing shared extensions:  /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

2、编辑php.ini,整合php和xcache:

首先将xcache提供的样例配置导入php.ini

# cat xcache.ini >> /usr/local/php/lib/php.ini

说明:xcache.ini文件在xcache的源码目录中。

接下来编辑/usr/local/php/lib/php.ini,找到zend_extension开头的行,修改为如下行:

zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/xcache.so

注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。

3、重新启动php-fpm

# service php-fpm restart

六.nginx功能的一些扩展

如何定义虚拟主机以及其他附加功能的实现

a.在nginx的配置文件/etc/nginx/nginx.conf 中可以定义多个虚拟主机.虚拟主机要定义在http { } 中,如:

server {

listen 80 ;

server_name www.discuz.com;

root /www/discuz;

index index.html;

access_log /www/discuz/logs/discuz.access.log combined; -->定义访问日志

location /status {

stub_status on;

access_log off;

auth_basic "Private";  -->定义访问控制功能

auth_basic_user_file /etc/nginx/.htpasswd;

}

error_page 404 /404.html; -->启用错误提示页面

location =/404.html {

root /www/error_pages; -->也可以将错误提示页面存放在一个独立目录error_pages中

}

location /bbs {

alias /www/bbs;   在nginx中定义别名

index home.html;   如果想使用自定义的主页面,也可以这样定义index home.html,不过要事先在bbs目录下建立home.html

}

}

server {        -->定义默认虚拟主机,在输入IP地址或者输入错误域名的时候显示该默认页面

listen 80 default;

server_name _;

root /www/default;

index index.html;

}

在server中可以定义多个location,但是生效是由先后次序的。

location /status {

stub_status on;

access_log off;

auth_basic "Private";

auth_basic_user_file /etc/nginx/.htpasswd;

}

以上命令是在nginx中定义状态监控和基于用户的认证功能。不过nginx的用户认证功能要借助于apache的htpasswd来建立。所以要使用此功能

必须也要安装上httpd

#htpasswd -cm /etc/nginx/.htpasswd gentoo

#htpassw -m /etc/nginx/.htpasswd centos

#service nginx configtest

#service nginx reload

再次访问www.discuz.com/status的时候就需要输入gentoo和centos以及密码才能访问了。

b.有时候可能不止添加一个虚拟主机,当添加多个虚拟主机时,都添加到nginx.conf中会比较乱,可以额外加载一个配置文件,专门添加需要的虚拟主机。

#vi /etc/nginx/nginx.conf

在http { 与第一个server { 中间的空白行添加一行include,如下:

# Load config files from the /etc/nginx/conf.d directory

include /etc/nginx/conf.d/*.conf;

编译安装的nginx网页文件存放路径在/usr/html ,所以修改nginx.conf中的root后面的html为/usr/html

如下:

# Load config files from the /etc/nginx/conf.d directory

include /etc/nginx/conf.d/*.conf;

server {

listen  80;

server_name www.nginx3.com;     //定义多个主机,就需要使用域名了,改为域名即可


#charset koi8-r;


#access_log logs/host.access.log main;

location / {

root /usr/html;       //之前root后面是html,修改为/usr/html,编译安装的nginx,网页默认是/usr/html

index index.php index.html index.htm;

}


#error_page 404    /404.html;


# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;        //此处可以不做修改

}


# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#

#location ~ \.php$ {

# proxy_pass http://127.0.0.1;

#}


# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#

location ~ \.php$ {

root   /usr/html;          //此处之前root后是html,修改为/usr/html

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /usr/html$fastcgi_script_name; //$fastcgi_script_name之前也修改为/usr/html

include  fastcgi_params;

}

然后保存退出!

创建include后面的路径

#mkdir /etc/nginx/conf.d

创建虚拟主机网页文件存放路径

#mkdir -pv /www/html

创建虚拟主机的配置文件

#vi /etc/nginx/conf.d/virtual.conf  添加如下信息:

#

# A virtual host using mix of IP-, name-, and port-based configuration

#


server {

listen  80;

#listen  somename:8080;

server_name www.nginx4.com;       //添加虚拟主机的域名


location / {

root /www/html;        //虚拟主机网页存放路径

index index.php index.html index.htm;   //添加index.php解析php网页

}

location ~ \.php$ {

root   /www/html;     //虚拟主机网页存放路径

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /www/html$fastcgi_script_name; //$fastcgi_script_name前也是虚拟主机网页路径

include  fastcgi_params;

}

}

保存退出!重启nginx服务

#service nginx restart   没有报错就开始进行测试

在自己物理机测试,就要额外添加host解析,如果有解析,就不需要在host添加解析了。

在host中添加如下解析:

192.168.1.71 www.nginx3.com

192.168.1.71 www.nginx4.com

在浏览器中进行测试:输入www.nginx3.com 显示如下:

133436280.png

输入www.nginx4.com ,显示如下:

133526603.png

遇到的一些问题:

启动nginx报错:
/usr/sbin/nginx 
/usr/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

解决办法:
#cd /usr/local/lib
#ll libpcre.so*
找到libpcre.so.1之后,创建软连接
#ln -sv /usr/local/lib/libpcre.so.1 /lib/libpcre.so.1
#ldconfig
再次启动nginx就OK了

如有不足之处,请多多指点!