Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67776
  • 博文数量: 14
  • 博客积分: 370
  • 博客等级: 一等列兵
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-12 16:08
文章分类
文章存档

2012年(14)

分类: LINUX

2012-08-15 14:51:09

一.关于LNAMP环境的介绍:

   Lnamp环境是由linux + nginx+apache+mysql+php组成的,Nginx做网站前端,Apache后端处理PHP文件。作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品 结合了Nginx高并发和静态页面高效率以及Apache稳定的动态页面处理特点。这样一来再也不用担心Nginx以FastCGI模式运行PHP时的502问题,也不必担心Apache处理静态页面过慢,负载过高的问题。

 

     是一个基于CentOS版本精简优化过的Linux服务器系统,并集成nginx,apache,php,mysql等web应用环境及wdcp管理系统,可以说安装和使用都非常便利。我这次是选在wdOS的纯系统下安装lnamp环境,但这只是初步的安装,并没有进行mysql以及php的优化。

      LNAMP的安装中php的编译安装比较麻烦,需要分为两次编译,另外nginx以及apache的配置也比较复杂,apache需要开启虚拟主机的功能,使得apache监听非80端口,nginx反向代理php请求与apache协同工作。

二.安装过程:

 第一步:安装前准备工作

创建存放源代码的目录: mkdir      /usr/local/src 

创建apache的安装目录: mkdir     /usr/local/apache

创建php的安装目录:    mkdir    /usr/local/php

创建mysql的安装目录:  mkdir    /usr/local/mysql

创建nginx的安装目录:  mkdir   /usr/local/nginx

第二步:下载安装编译需要用到的库文件:

1. nginx编译时需要用到的编译库文件 

openssl-devel,glib2-devel ,pcre-devel ,bzip2-devel 以及gzip-devel 

不过,wdOS系统下默认安装了openssl-devel这个库文件

所以剩下的使用命令 yum  install glib2-devel  pcre-devel  bzip2-devel  gzip-devel 下载安装即可

2. 检查系统是否安装了编译mysql所需要的工具包gcc gcc-c++ ncurses-develcamkemysql5.5版本后不使用configure安装,而是使用cmake来安装)

我们使用rpm -qa | grep  gcc  和rpm -qa | grep  ncurses-devel进行检查:

也就是说,wdOS系统中还没有安装 ncurses-devel ,所以我们可以使用yum命令进行安装

下载cmake源代码到/usr/local/src下:

wget 

解压缩:tar zxvf cmake-2.8.4.tar.gz

进入/usr/local/src/cmake-2.8.4这个目录下设置,

./bootstrap

gamke

gmake install

3.下载安装php时需要用到的编译库文件:

 yum -y install libevent libevent-devel libxml2 libxml2-devel libmcrypt libmcrypt-devel libmcrypt libmcrypt-devel curl-devel libpng-devel libtool-ltdl-devel  

第三步:源码编译安装mysql5.5.25a

mysql数据库添加用户和用户组:(我这里假设为mysql用户以及mysql用户组

下载mysql源代码:

wget  -c  

tar xvf mysql-5.5.25a.tar.gz  进行解压缩:

 设置编译时的环境参数:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  -----指定mysql的安装目录

编译  make

安装: make install

在当前目录下,建立配置文件:

 cp support-files/my-medium.cnf /etc/my.cnf

说明:在展开的源码包目录中的“support-files”文件夹下,提供了多个MySQL服务器的配置文件,分别适用于不同负载的数据库服务器,一般选择my-medium.cnf文件即可,该配置文件适用于中等负载的数据库,可以满足大多数企业的应有需求。

设置软连接使mysqlmysqladminbin命令能在shell中直接运行:


创建用于存放mysql数据和日志的目录,并修改目录所有者和属组为mysql:

现在到/etc/my.cnf配置文件下,做下面的修改:


进入mysql安装目录下的脚本目录下的脚本目录:/tmp/mysql-5.5.25a/scripts 

 先修改mysql_install_db这个文件的权限:

然后,利用mysql_install_db脚本生成新的mysql授权表

./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/var/mysql/data &

添加启动脚本:

 cp /usr/local/src/mysql-5.5.25a/support-files/mysql.server  /etc/rc.d/init.d/mysqld

修改启动脚本:添加basedir以及datadir的路径:

修改启动脚本的权限:

启动数据库:

检查数据库的默认侦听端口 3306是否开启:

第四步:源码安装apache-2.2.22

先下载apache源代码到目录/usr/local/src下:(我这里下载的apache版本为2.2.22

 wget -c     

下载完成之后开始解压缩:(这里给出部分截图)

tar -zxvf  httpd-2.2.22.tar.gz

进入解压缩后的httpd-2.2.22这个目录下,设定编译时的参数:

./configure --prefix=/usr/local/apache    ----apache安装在这个目录下

--enable-vhost-alias                  ----支持虚拟主机的功能

--enable-rewrite                     -----允许重写

--enable-info 

开始进行编译:make

编译完进行安装 :make install

在当前目录下,复制apache初始化文件到/etc/init.d目录下,并命名为httpd,修改其权限:

cp  build/rpm/httpd.init /etc/init.d/httpd 

设置Apache开机自启动:(我这里使用的是方法一)

方法一:输入下列命令:

chconfig --add httpd

chkconfig -- level 345 httpd on 

方法二:

 编辑 vi  /etc/init.d/httpd

找到 chkconfig:这句,添加3 4 5
找到description: 这句,添加Apache  httpd

设置完之后你可以输入 chkconfig --list | grep httpd   检查一下3,4,5是否为on

修改apache服务器的配置文件
  vi /usr/local/apache/conf/httpd.conf找到ServerName那一行,去掉前面的注释 

为了适应启动脚本,我们创建一些符号链接:


重启一下apache服务器:

/etc/init.d/httpd start 

第五步:源码编译安装nginx-1.0.4

进入/usr/local/src 这个目录下载nginx源码:

wget -c 

解压缩nginx 源代码包:

tar -zxvf nginx-1.0.4.tar.gz

进入解压好的nginx-1.0.4 这个目录配置相应的编译参数:

 ./configure      --user=nginx     --group=nginx    --prefix=/usr/local/nginx     --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf     --error-log-path=/var/log/nginx/error.lo--http-log-path=/var/log/nginx/access.log     --pid-path=/var/log/run/nginx.pid --lock-path=/var/log/lock/subsys/nginx --with-http_ssl_module     --with-http_realip_module     --with-http_addition_module     --with-http_sub_module     --with-http_dav_module     --with-http_flv_module     --with-http_gzip_static_module     --with-http_stub_status_module     --with-http_perl_module     --with-mail     --with-mail_ssl_module --with-http_flv_module     --with-http_gzip_static_module      --with-http_perl_modul--with-mail --without-http_rewrite_module   --with-pcre

make 进行编译:

编译完就可以进行安装:make install

第六步:源码编译安装php-5.3.10

   说明:php的编译这一步要分为两部分进行,要先编译支持apache模块的,然后再编译支持nginx模块的。如果同时进行编译就会报错:You've configured multiple SAPIs to be build(见下图:)

所以,我们就先编译支持apache

这一部分的php编译设置的参数:

 ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-mbstring --enable-fpm --with-iconv-dir=/usr/local/libiconv --enable-xml --with-curl --with-curlwrappers  --with-mhash --with-gd --enable-gd-native-ttf --with-xmlrpc --with-zlib  --with-apxs2=/usr/local/apache/bin/apxs  --with-config-file-path=/usr/local/php/etc

make

make imstall

完成后,就可以继续设置支持nginx的编译参数了:

 ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-mbstring --enable-fpm --with-iconv-dir=/usr/local/libiconv --enable-xml --with-curl --with-curlwrappers  --with-mhash --with-gd --enable-gd-native-ttf --with-xmlrpc --with-zlib 

然后重复与上面apache相似的步骤,make & make install

建立php配置文件:

复制php.iniphp安装目录 php.ini-development /usr/local/php/lib 这个目录下并重命名为php.ini

说明:php.ini  是 PHP 在启动时会读取的配置文件,我这里没有做配置。另外,php5.0版本之后文件的名字发生了改变,其中php.ini-production对应于php.ini-recommended;而php.ini-development对应于php.ini-dist php.ini-dist 适合开发程式使用(也就是测试使用), php.ini-recommended 拥有较高的安全性设定,适合上线当产品使用

做方便php的运行的链接,不用配置环境变量


 完成之后,我们就可以查看php的版本:


步:整合nginx和php:

 修改进程管理器php-fpm的配置:

     说明:在LAMP平台下,php是被编译成为模块然后被apache所调用;而在LNMP平台下,php是被编译成二进制文件执行,这样就需要通过fastCGI技术来实现nginxphp的整合。这里通过使用fastCGI的一个进程管理器php-fpmphp5.3.3以后的版本已经内置了php-fpm,使用的时候只需要加入参数--enable-fpm就可以由此整合phpnginx

 进入php-fpm的主配置文件 php-fpm.conf,找到图中的部分做相应的修改:

最后就是在/usr/local/nginx/html 这个目录下创建一个文件命名为info.php,在里面添加以下测试内容:

完成后可以使用/usr/sbin/nginx来重启nginx服务,如果启动的时候提示:nginx: [emerg] getpwnam("nginx") failed

这时,你只需要 vi /etc/nginx/nginx.conf 进入到这个文件,将配置文件的第一行中的user nobody 这一行的注释去掉即可。

第八步:为apache设置虚拟主机,使得apache侦听非80端口

 (我这里以同一个ip对应两个不同的端口为例)

vi 编辑httpd的主配置文件/usr/local/apache/conf/httpd.conf,修改原来的80端口为8080以及8081端口:

同时注释下面这句:

使Apache支持rewrite(伪静态),注释原来的apache文件根目录:

 

修改Directory模块内容(相当是全局的,以后httpd-vhosts.conf也会用到这个设置) ,将AllowOverride  none改为all ,注释掉下面的order.....

开启了httpd-vhosts虚拟主机文件: 

修改完主配置文件,下面就是虚拟配置文件的修改:

vi  /usr/local/apache/conf/extra/httpd-vhosts.conf

增加8080以及8081这两个侦听端口:

仿照下图,做相应的修改:(由于我这里没有配置dns服务器,所以servername 这句可以用localhost代替)

说明:上图中配置的ErrotLog以及CustomLog中的文件请确保存在,像我这里8081端口中的ErrotLog以及CustomLog中的文件我还没有建立,所以这里先进入到/usr/local/apache/logs目录下然后创建文件:

另外,虚拟主机中用到的文件根目录以及测试文件也应该相应的创建:(cd /usr/local/apache/htdocs

mkdir 8080

mkdir 8081

同时将该目录下的index.html 复制到8080以及8081这两个目录下:

cp index.html  8080

cp index.html  8081

然后创建一个文件命名为test.php,在里面添加以下测试内容,用以测试mysql是否能与php协同工作:

将这个文件复制到8080以及8081这两个目录下:

cp test.php   8080

cp test.php   8081

第九步 Nginx采用反Nginx采用反向代理的方式接收Apache的处理结果

    说明:Nginx采用反向代理的方式接收Apache的处理结果,需要先写一些代理的参数,可以将下面的配置保存为proxy_params,以后每个用到proxy_pass的地方都proxy_params这些参数include进来 

在/etc/nginx/ 这个目录下新建一个proxy_params文件(touch  proxy_params),然后添加下面的代理参数:

附:代理参数的注解

proxy_redirect  http// $scheme://   #重定向

proxy_set_header Host $host;                   #转发IPHTTP头信息  

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   #与后端发起握手等待响应超时时间

proxy_connect_timeout 30;    #与后端连接成功后等待响应时间(已进入处理队列等候处理)

proxy_read_timeout 60;  #后端服务器回传数据时间(后端必须在指定时间内将数据传送完毕)

proxy_send_timeout 30;   #保存用户的头信息大小

proxy_buffers 8  128k;   #高负载时可请求更大proxy_buffers(一般设为proxy_buffers的两倍)

然后在/etc/nginx/nginx.conf这个文件中用到proxy_pass的地方都proxy_params这些参数include进来

下面是我从网上搜来的rewrite规则:(规则要放在配置文件的location /{ }外面,server{ }里面 )

try_files $uri $uri/ @apache;

location @apache {

    proxy_pass     -----这里的127.0.0.1改为自己的ip地址

    include proxy_params;

}

说明:LNMP相比,rewrite规则显得麻烦很多,因为NginxrewriteApacherewrite是串行处理的,即Nginx 进行rewrite之后,如果处理后的请求被交给Apache,那么Apache又会再根据自己的rewrite rule再处理;相反Apacherewrite结果不会再交回Nginx处理。所以,避免麻烦的方法是,只让Nginxrewrite,因为Nginxrewrite效率比Apache的高

 

另外,NginxRewrite功能需要用到PCRE(正式表达式库) 可以使用

wget  下载pcre源码包,然后编译安装(make, make install)

安装完之后,在nginx的配置参数中加入 --with pcre ,然后重新编译安装即可。否则会报nginx: [emerg] the using of the regex "\.php$" requires PCRE library in /etc/nginx/nginx.conf:68 这样的错,如下图:

第十步:为apache安装rpaf模块

说明:rpaf这个模块用于apache做后端时可以获取访客真实的IP 

先下载源码到/usr/local/src这个目录下:

 wget  

解压缩这个源码包:

tar -zxf  mod_rpaf-0.6.tar.gz 

进入 mod_rpaf-0.6 这个目录下:

 /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c 

这样rpaf模块就安装完成了。

修改httpd主配置文件/usr/local/apache/conf/httpd.conf:

找到LoadModule添加加载rpaf模块的语句:

LoadModule rpaf_module modules/mod_rpaf-2.0.so 

同时在IfModule添加下面这段:

全部设置完成后重启一下各项服务:

/usr/sbin/nginx  启动(/usr/sbin/nginx -s  reload重启)nginx服务

service httpd restart  重启httpd 服务

重启完成后可以输入 netstat -lnpt 查看下端口是否开启

 其中3306mysqld的侦听端口,9000php-fpm进程管理器的侦听端口,80nginx的侦听端口,80808081均为httpd的侦听端口

三.测试结果:

虚拟主机的测试:(8081端口

8081端口中关于mysqlphp协同工作的测试:

8080端口的测试:

8080端口中关于mysqlphp系统工作的测试:

Nginx侦听的80端口的测试:

附:关于rewrite语法的一些介绍:

rewrite 的语法

语法: rewrite regex replacement flag

默认: none

作用域: server, location, if

这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。

rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,我们只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。

nginxrewrite规则参考:

为区分大小写匹配

~* 为不区分大小写匹配

!~!~*分别为区分大小写不匹配及不区分大小写不匹

-f!-f用来判断是否存在文件

-d!-d用来判断是否存在目录

-e!-e用来判断是否存在文件或目录

-x!-x用来判断文件是否可执行

last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的

break 终止匹配不再匹配后面的规则

10 redirect 返回302临时重定向 地址栏会显示跳转后的地址

11 permanent 返回301永久重定向 地址栏会显示跳转后的地址

阅读(3670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~