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-devel和camke(mysql5.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文件即可,该配置文件适用于中等负载的数据库,可以满足大多数企业的应有需求。
设置软连接使mysql和mysqladmin的bin命令能在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.log --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_module --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.ini到php安装目录 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技术来实现nginx和php的整合。这里通过使用fastCGI的一个进程管理器php-fpm,php5.3.3以后的版本已经内置了php-fpm,使用的时候只需要加入参数--enable-fpm就可以由此整合php与nginx
进入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; #转发IP等HTTP头信息
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规则显得麻烦很多,因为Nginx的rewrite和Apache的rewrite是串行处理的,即Nginx 进行rewrite之后,如果处理后的请求被交给Apache,那么Apache又会再根据自己的rewrite rule再处理;相反Apache的rewrite结果就不会再交回Nginx处理。所以,避免麻烦的方法是,只让Nginx做rewrite,因为Nginx的rewrite效率比Apache的高。
另外,Nginx的Rewrite功能需要用到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 查看下端口是否开启:
其中3306为mysqld的侦听端口,9000为php-fpm进程管理器的侦听端口,80为nginx的侦听端口,8080和8081均为httpd的侦听端口
三.测试结果:
虚拟主机的测试:(8081端口)
在8081端口中关于mysql与php协同工作的测试:
8080端口的测试:
在8080端口中关于mysql与php系统工作的测试:
Nginx侦听的80端口的测试:
附:关于rewrite语法的一些介绍:
rewrite 的语法
语法: rewrite regex replacement flag
默认: none
作用域: server, location, if
这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。
注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。
rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,我们只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。
nginx的rewrite规则参考:
1 ~ 为区分大小写匹配
2 ~* 为不区分大小写匹配
3 !~和!~*分别为区分大小写不匹配及不区分大小写不匹
4 -f和!-f用来判断是否存在文件
5 -d和!-d用来判断是否存在目录
6 -e和!-e用来判断是否存在文件或目录
7 -x和!-x用来判断文件是否可执行
8 last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
9 break 终止匹配, 不再匹配后面的规则
10 redirect 返回302临时重定向 地址栏会显示跳转后的地址
11 permanent 返回301永久重定向 地址栏会显示跳转后的地址