源代码搭建LNMP

 

开发环境:
Red Hat Enterprise Linux 5.4
# yum grouplist |less 
确保以下包已被安装:
  Development Libraries 开发库
  Development Tools 开发工具
  Legacy Software Development 老的软件开发
  X Software Development  X软件开发
  GNOME Software Devleopment  GNOME软件开发
  KDE Software Development KDE软件开发
需要安装的源码包:
pcre-8.12.tar.gz
libevent-2.0.16-stable.tar.gz
nginx-1.0.11.tar.gz
php-5.4.0.tar.gz
mysql-5.5.22.tar.gz
cmake-2.8.7.tar.gz
 
步骤:
解压:
[root@lu ~]# tar -zxvf pcre-8.12.tar.gz -C /usr/src
[root@lu ~]# tar -zxvf libevent-2.0.16-stable.tar.gz -C /usr/src
[root@lu ~]# tar -zxvf nginx-1.0.11.tar.gz -C /usr/src
[root@lu ~]# tar -zxvf php-5.4.0.tar.gz -C /usr/src
[root@lu ~]# tar -zxvf mysql-5.5.22.tar.gz -C /usr/src
[root@lu ~]# tar -zxvf cmake-2.8.7.tar.gz -C /usr/src

 

 

安装pcre
PCREperl所用到的正则表达式,目的是让所装的软件支持正则表达式。默认情况下,Nginx只处理静态的网页请求,也就是html.如果是来自动态的网页请求,比如*.php,那么Nginx就要根据正则表达式查询路径,然后把*.PHP交给PHP去处理
# 查询系统中有没有安装PCRE,一般装系统是默认装有,所以我们要删掉系统自带的
[root@lu ~]# rpm -qa |grep pcre  
pcre-6.6-2.el5_1.7
# 在删除系统自带的PCRE之前,要先备份一下libpcre.so.0这个文件,因为RPM包的关联性太强,在删除后没libpcre.so.0这个文件时我们装PCRE是装不上的
[root@lu ~]# cp /lib/libpcre.so.0 /    
[root@lu Server]# rpm -e --nodeps pcre  //删除系统自带的PCRE
[root@lu /]# cp /libpcre.so.0 /lib/   //把我们删除系统自带的PCRE之前备份的libpcre.so.0拷贝到/lib 目录下
 
[root@lu lib]# mv libpcre.so.0 libpcre.so.0.0.1
[root@lu lib]# ln -s libpcre.so.0.0.1 libpcre.so.0
 
[root@lu ~]# cd /usr/src
[root@lu src]# cd pcre-8.12
[root@lu pcre-8.12]# ./configure  //配置PCRE,因为PCRE是一个库,而不是像pachephppostfix等这样的程序,所以我们安装时选择默认路径即可,这样会在后面安装其它东西时避免一些不必要的麻烦
[root@lu pcre-8.12]# make  //编译
[root@lu pcre-8.12]# make install   //安装
 
安装libevent
[root@lu src]# cd /usr/src/libevent-2.0.16-stable
[root@lu libevent-2.0.16-stable]# ./configure 
[root@lu libevent-2.0.16-stable]# make
[root@lu libevent-2.0.16-stable]# make install
[root@lu src]# cd /usr/local
将库文件连接到系统默认的位置:
[root@lu local]# vim /etc/ld.so.conf.d/libevent.conf
/usr/local/lib
测试是否成功导入
[root@lu local]# ldconfig -v |grep libevent 
        libevent_core-2.0.so.5 -> libevent_core.so
        libevent_pthreads-2.0.so.5 -> libevent_pthreads.so
        libevent-2.0.so.5 -> libevent.so
        libevent_extra-2.0.so.5 -> libevent_extra.so
        libevent_openssl-2.0.so.5 -> libevent_openssl.so
        libevent-1.1a.so.1 -> libevent-1.1a.so.1.0.2
 
 [root@lu local]# ldconfig -v |grep pcre
        libpcreposix.so.0 -> libpcreposix.so.0.0.0
        libpcrecpp.so.0 -> libpcrecpp.so.0.0.0
        libpcre.so.0 -> libpcre.so.0.0.1
        libpcre.so.0 -> libpcre.so.0.0.1
 
安装nginx
[root@lu ~]# cd /usr/src/nginx-1.0.11/
[root@lu nginx-1.0.11]# groupadd -r nginx
[root@lu nginx-1.0.11]# useradd -r -g nginx -s /bin/false -M nginx   //-r系统用户 -M不创建家目录
[root@lu nginx-1.0.11]# ./configure \
> --prefix=/usr \  安装起始位置
> --sbin-path=/usr/sbin/nginx \  服务命令位置
> --conf-path=/etc/nginx/nginx.conf \  配置文件位置
> --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 \  指定服务以nginx用户运行
> --group=nginx \  指定服务以nginx组运行
> --with-http_ssl_module \  起用ssl模块
> --with-http_flv_module \  起用流模块
> --with-http_stub_status_module \
> --with-http_gzip_static_module \  压缩模块,方便网络传输
> --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/ \
> --with-pcre
[root@lu nginx-1.0.11]# make
[root@lu nginx-1.0.11]# make install
 
[root@lu nginx-1.0.11]# mkdir -pv /var/tmp/nginx/client/
mkdir: 已创建目录 /var/tmp/nginx
mkdir: 已创建目录 /var/tmp/nginx/client
 
[root@lu nginx-1.0.11]# nginx
[root@lu nginx-1.0.11]# netstat -tupln |grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      20322/nginx: master
 
在启动完NGINX后,我们可以在浏览器中输入http://localhost查看,如下图:

 

 

安装mysql
mysql5.5已经改用cmake编译,编译前安装cmake
安装cmake
[root@lu ~]# cd /usr/src
[root@lu src]# cd cmake-2.8.7/
[root@lu cmake-2.8.7]# ./configure
[root@lu cmake-2.8.7]# gmake
[root@lu cmake-2.8.7]# gmake install
安装mysql
[root@lu ~]# cd /usr/src
[root@lu src]# cd mysql-5.5.22/
[root@lu mysql-5.5.22]# groupadd mysql
[root@lu mysql-5.5.22]# useradd -r -M -g mysql mysql
[root@lu mysql-5.5.22]# cmake \
>-DDCMAKE_INSTALL_PREFIX=/=/usr/local/mysql \  安装路径
>-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ 连接数据库socket的路径
>-DDEFAULT_CHARSET=utf8 \  默认字符
>-DDEFAULT_COLLATION=utf8_general_ci \  矫正字符集
>-DWITH_EXTRA_CHARSETS=all \  额外字符集
>-DWITH_MYISAM_STORAGE_ENGINE=1 \   储存引擎
>-DWITH_INNOBASE_STORAGE_ENGINE=1 \  
>-DWITH_MEMORY_STORAGE_ENGINE=1 \  
>-DWITH_READLINE=1 \        使用readline library
>-DENABLED_LOCAL_INFILE=1 \   允许访问本地数据
>-DMYSQL_DATADIR=/data/mysql \   数据库路径
>-MYSQL_USER=mysql \  用户
>-DMYSQL_TCP_PORT=3306   mysql端口
[root@lu mysql-5.5.22]# make
[root@lu mysql-5.5.22]# make install
 
[root@lu local]# chmod +w /usr/local/mysql
[root@lu local]# chown -R mysql:mysql /usr/local/mysql
[root@lu local]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
 
[root@lu local]# mkdir -p /var/mysql
[root@lu local]# mkdir -p /var/mysql/data/
[root@lu local]# mkdir -p /var/mysql/log/
[root@lu local]# chown -R mysql:mysql /var/mysql/
 
[root@lu local]# cd /usr/local/mysql/support-files
[root@lu support-files]# cp my-large.cnf /etc/my.cnf  mysql配置文件拷过来
mysql 初始化安装:
[root@lu support-files]# /usr/local/mysql/scripts/mysql_install_db \ 
> --defaults-file=/etc /my.cnf \
> --basedir=/usr/local/mysql \
> --datadir=/var/mysql/data \
> --user=mysql
mysql 加入开机启动:
[root@lu support-files]# cp mysql.server /etc/init.d/mysqld  设置启动配置文件
[root@lu support-files]# chmod +x /etc/init.d/mysqld
[root@lu support-files]# vi /etc/init.d/mysqld
 

 

[root@lu support-files]# chkconfig --add mysqld  将服务加入chkconfig控制之列
[root@lu support-files]# chkconfig --level 345 mysqld on
[root@lu mysql]# chkconfig --list |grep mysql
mysqld          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
此后可以用 service mysqld 来管理mysqld服务
[root@lu support-files]# service mysqld start    启动 mysql
Starting MySQL....                                         [确定]
[root@lu support-files]# netstat -tupln |grep mysqld
tcp        0      0 :::3306                     :::*                        LISTEN      7636/mysqld   
 
[root@lu mysql]# vim /etc/profile  修改系统搜索变量,定义搜索路径

 

[root@lu mysql]# . /etc/profile  重新读取
[root@lu mysql]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/usr/local/mysql/bin
 
mysql的操作:
[root@lu mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql> show datebase;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'datebase' at line 1
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
 
mysql> \q
Bye
 
安装php
如果想让编译的php支持mcryp,此处还需要下载两个rpm包并安装之:
php-mcrypt-5.1.6-5.el5.i386.rpm 
libmcrypt-2.5.7-5.el5.i386.rpm   php-mcrypt 依赖的模块
 
[root@lu ~]# yum localinstall php-mcrypt-5.1.6-5.el5.i386.rpm  libmcrypt-2.5.7-5.el5.i386.rpm –nogpgcheck
--nogpgcheck 取消gpg签名验证
 
[root@lu ~]# cd /usr/src
[root@lu php-5.4.0]# cd php-5.4.0/
[root@lu php-5.4.0]# ./configure \
>--prefix=/usr/local/php \
> --with-mysql=/usr/local/mysql \
> --with-openssl \
> --enable-fpm \
> --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-config-file-path=/etc/php \
> --with-config-file-scan-dir=/etc/php \
> --with-bz2 --with-curl
[root@lu php-5.4.0]# make
[root@lu php-5.4.0]# make test
[root@lu php-5.4.0]# make install
 
php提供配置文件:
[root@lu php-5.4.0]# cp php.ini-production /etc/php.ini
php-fpm提供Sysv init脚本,并将其添加至服务列表:
[root@lu php-5.4.0]# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
[root@lu php-5.4.0]# chkconfig --add php-fpm
[root@lu php-5.4.0]# chkconfig php-fpm on
php-fpm提供配置文件:
[root@lu php-5.4.0]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
编辑php-fpm的配置文件:
[root@lu php-5.4.0]# vim /usr/local/php/etc/php-fpm.conf
配置pm.的相关选项为你所需要的值,并启用pid文件:
201
pm.max_children = 50
206
pm.start_servers = 5
211
pm.min_spare_servers = 2
216
pm.max_spare_servers = 8
25
pid = /var/run/php-fpm.pid
接下来就可以启动php-fpm了:
[root@lu php-5.4.0]# /usr/local/php/sbin/php-fpm
用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
[root@lu php-5.4.0]# ps aux | grep php-fpm
root     20533  0.0  0.5  34364  2684 ?        Ss   19:46   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody   20534  0.0  0.4  34364  2308 ?        S    19:46   0:00 php-fpm: pool www         
nobody   20535  0.0  0.4  34364  2308 ?        S    19:46   0:00 php-fpm: pool www         
nobody   20536  0.0  0.4  34364  2308 ?        S    19:46   0:00 php-fpm: pool www         
nobody   20537  0.0  0.4  34364  2308 ?        S    19:46   0:00 php-fpm: pool www         
nobody   20538  0.0  0.4  34364  2308 ?        S    19:46   0:00 php-fpm: pool www         
root     20544  0.0  0.1   5016   688 pts/1    R+   19:47   0:00 grep php-fpm
 
整合nginxphp
编辑/etc/nginx/nginx.conf:
[root@lu php-5.4.0]cd /etc/nginx
[root@lu nginx]# cp nginx.conf nginx.conf.back
[root@lu nginx]# vim 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;
        }
在所支持的主页面格式中添加php格式的主页,如下:
location / {
            root   html;
            index  index.php index.html index.htm;
        }
 
编辑/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;
        
[root@lu nginx]# pkill nginx
[root@lu nginx]# nginx
 
测试:
/usr/html新建index.php的测试页面,测试php是否能正常工作:
[root@lu nginx]# cd /usr/html
[root@lu html]# cp index.html index.php
[root@lu html]# vim index.php
 

接着就可以通过浏览器访问此测试页面了
mysql连接:
[root@lu html]# vim index.php

测试

[root@lu html]# service mysqld stop  将连接失败