16、lamp的搭建
搭建web02服务器作为web01的负载均衡服务器:
httpd和nginx配置比较相似,也有虚拟主机,一个http服务需要配置多个站点,基于ip(基本用不到)、端口(内部网站)、域名(外部网站);
yum安装的http只是把把软件做了一些优化,集中了配置:
16.1、http软件的安装:
1、下载httpd软件(web02):
[root@web02 ~]# mkdir -p tools
[root@web02 ~]# mkdir -p /application
[root@web02 ~]# cd tools
[root@web02 tools]# wget http://archive.apache.org/dist/httpd/httpd-2.2.31.tar.gz
[root@web02 httpd-2.2.31]# tar -xzvf httpd-2.2.31.tar.gz
2、查看安装和阅读文档:
[root@web02 httpd-2.2.31]# less README
[root@web02 httpd-2.2.31]# less INSTALL
[root@web02 httpd-2.2.31]# ./configure --help#查看软件的帮助文档;
3、安装扩展库:
(1)php程序运行时会调用一些诸如zlib,gd等函数库,这些lib库也不是必须安装的,默认情况下系统是没有安装的,
目前的企业环境下一般都需要安装。否则,PHP程序运行有问题,例如验证码无法显示等。
[root@web01 nginx]#yum install -y zlib-devel libxml2-devel libjpeg-turbo-devel
[root@web01 nginx]#yum install -y freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
[root@web01 nginx]#rpm -qa zlib-devel libxml2-devel libjpeg-turbo-devel
zlib-devel-1.2.3-29.el6.x86_64
libjpeg-turbo-devel-1.2.1-3.el6_5.x86_64
libxml2-devel-2.7.6-21.el6_8.1.x86_64
[root@web01 nginx]#rpm -qa freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
libxslt-devel-1.1.26-2.el6_3.1.x86_64
libpng-devel-1.2.49-2.el6_7.x86_64
freetype-devel-2.3.11-17.el6.x86_64
gd-devel-2.0.35-11.el6.x86_64
libcurl-devel-7.19.7-53.el6_9.x86_64
(2)其中libiconv-devle包用yum安装不了(手工安装):
[root@web01 tools]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz # (源码包)
[root@web01 tools]# tar -xzvf libiconv-1.14.tar.gz
[root@web01 libiconv-1.14]# ./configure --prefix=/usr/local/libiconv/
[root@web01 libiconv-1.14]# make
[root@web01 libiconv-1.14]# make install
(3)安装动态加载模块库(需要第三方的epel源):
[root@web01 tools]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@web01 application]# yum install -y libmcrypt-devel #这是一个使用动态加载的模块化的库,这个不是必须的库,在开发的时候需要用到;
[root@web01 application]# rpm -qa libmcrypt-devel
libmcrypt-devel-2.5.8-9.el6.x86_64
(4)安装加密扩展库:
[root@web01 application]# yum install -y mhash mcrypt
[root@web01 application]# rpm -qa mhash mcrypt
mcrypt-2.6.8-10.el6.x86_64
mhash-0.9.9.9-3.el6.x86_64
(5)安装openssl(安全套接层协议,安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上):
[root@web02 php-5.5.32]# yum install openssl openssl-devel
[root@web02 php-5.5.32]# rpm -qa openssl openssl-devel
openssl-devel-1.0.1e-57.el6.x86_64
openssl-1.0.1e-57.el6.x86_64
4、配置参数:
[root@web02 httpd-2.2.31]# ./configure --prefix=/application/apache-2.2.31 --enable-deflate --enable-expires --enable-headers \
--enable-modules=most --enable-so --with-mpm=prefork --enable-rewrite #参数配置,注意httpd-2.4版本需要安装相应的api;
(1)参数介绍:
--prefix=/application/apache-2.2.31#安装路径
--enable-deflate #激活数据压缩的功能
--enable-expires #激活客户端缓存的功能
--enable-headers #激活headers
--enable-modules=most #激活模块
--enable-so # 打开so模块
--with-mpm=prefork # 激活模块功能 prefork
--enable-rewrite #激活重定向功能
[root@web02 httpd-2.2.31]# echo $? #查看编译是否存在问题;
0
5、编译:
[root@web02 httpd-2.2.31]# make #编译的过程,时间长,比较消耗cpu的计算
[root@web02 httpd-2.2.31]# echo $?
0
6、安装:
[root@web02 httpd-2.2.31]# make install #安装,拷贝的过程
[root@web02 httpd-2.2.31]# echo $?
0
7、创建软连接:
[root@web02 httpd-2.2.31]# cd /application/
[root@web02 application]# ln -s apache-2.2.31/ apache #创建软连接
8、appache配置文件参数配置:
[root@web02 apache]# cd htdocs/ #apache的站点目录
[root@web02 htdocs]# ls
index.html
[root@web02 htdocs]# mkdir php #创建php站点目录
[root@web02 htdocs]# cd ..
[root@web02 apache]# cd conf/
[root@web02 conf]# ls
extra httpd.conf magic mime.types original #配置文件是httpd.conf, extra目录是包含配置文件的目录
[root@web02 conf]# vim httpd.conf +98 +145 +396 +133 +168 +67
98行:ServerName 127.0.0.1:80 #打开该配置,并修改参数,如果不修改,检查语法时会报,修改主机名
“httpd: Could not reliably determine the server's fully qualified domain name, using 172.16.1.7 for ServerName"的错误;
145 行:Options Indexes FollowSymLinks #优化,取消列目录的功能,如果有报错页面,不会显示列表;
396 行:Include conf/extra/httpd-vhosts.conf #把396行注释的内容打开,表示打开虚拟站点的配置文件 ;
133行:DocumentRoot "/application/apache/htdocs" #配置的新的站点目录;
<Directory "/application/apache/htdocs">
#DocumentRoot指的是apache放web文件的地方,Directory是控制访问服务器的一个固定区域及控制禁止访问服务器的主机(即权限)。
168行:apache的首页文件:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
67行:apache运行时的用户和用户组;
User nginx
Group nginx
说明:http默认自带站点,如果添加virtuhost配置,以该配置优先,包含配置逻辑上和父文在同一个配置文件中;
[root@web02 conf]# vim extra/httpd-vhosts.conf #编辑httpd-vhosts.conf配置文件
<VirtualHost *:80> #虚拟站点,类似于nginx中的server标签,一个标签代表一个虚拟主机站点;监听所有的网卡ip,监听的端口号是80
#如果是基于端口号的访问,需在httpd.conf配置文件中添加端口号列如:Listen 8080,详细配置,可见
#https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_016_virtualhost.html;
#ServerAdmin webmaster@dummy-host.example.com #管理员邮箱地址
DocumentRoot "/application/apache/htdocs" #站点目录,类似于nginx中的 html/php/目录
ServerName www.php1.com #站点域名
#ServerAlias www.dummy-host.example.com #站点别名
ErrorLog "logs/www.php.com_error.log" #错误日志,在apache的站点目录之下
CustomLog "logs/www.php.com-access_log" common #访问日志,在apache的站点目录之下
</VirtualHost>
9、启动apache服务:
[root@web02 conf]# cd ..
[root@web02 apache]# bin/apachectl -t #检查语法是否正确
Syntax OK
[root@web02 apache]# bin/apachectl start #启动服务;bin/apachectl graceful #优雅重启;
[root@web02 apache]# netstat -tunlp | grep httpd
tcp 0 0 :::80 :::* LISTEN 64758/httpd
[root@web02 apache]# echo "welcome access httpd-apache" >htdocs/php/index.html#在站点目录下面添加首页文件
[root@web02 apache] echo '/appllication/php/bin/apachectl start' >>/etc/rc.local #加入到开机自启动中;
10、apache常见的两种工作模式:
线程:
(1)轻型实体。
(2) 独立调度和分派的基本单位。
(3) 可并发执行。
(4) 共享进程资源。
进程:
(1) 进程是程序的一次执行。
(2) 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
(3) 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
在引入了进程实体的概念后,我们可以把传统OS中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”。
(1)worker模式:
线程模式、占用资源少、稳定性略差、并发大;
出于稳定性和安全性考虑,不建议更换apache2的运行方式,使用系统默认prefork即可。
另外很多php模块不能工作在worker模式下,例如redhat linux自带的php也不能支持线程安全。所以最好不要切换工作模式。
如果想用work模式,还不如使用Nginx;
(2)prefork模式:
进程模式、占用资源多、稳定、并发一般;
(3)如何改变apache的工作模式:
[root@web02 conf]# pwd
/application/apache/conf
[root@web02 conf]# vim httpd.conf +381
Include conf/extra/httpd-mpm.conf #打开该配置文件,默认是进程模式;
[root@web02 conf]# cd extra
[root@web02 extra]# vim httpd-mpm.conf
<IfModule mpm_prefork_module> #进程模式;
ServerLimit 256
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 5000
</IfModule>
#<IfModule mpm_worker_module> #线程模式;
#StartServers 5
#ServerLimit 1500
#MaxClients 1500
#MinSpareThreads 25
#MaxSpareThreads 75
#ThreadsPerChild 25 #每个进程有多少线程数
#MaxRequestsPerChild 5000
#</IfModule>
(4)apache工作模式参数详解:
1)ServerLimit
默认的MaxClient最大是256个线程,如果想设置更大的MaxClient值,就的设置这个ServerLimit参数。20000是ServerLimit
这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。生效前提:必须放在其他指令的前面。
如果这个参数设置的值很高,那么就会申请很多的无用共享内存。如果ServerLimit和MaxClients都设置成一个很高的值,超过了
系统的处理范围,那么Apache很可能不会启动或者系统变得不稳定。
2)StartServers
指定服务器启动时建立的子进程数量。因为进程的数量是根据负载来动态控制得,所以这个参数可以不用修改。prefork默认为5。
3)MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产
生新的子进程。此参数不要设的太大。
4)MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
5)MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。
6)MaxRequestsPerChild
每个子进程在其生存期内允许处理的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果 MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
11、在windows主机hosts文件中添加域名解析记录:
172.16.1.7 www.php1.com
在浏览器中测试:
16.2、安装php(web02,同web01安装方式相同):
1、--with-apxs2=/application/apache/bin/apxs
在apache环境中配置php时需要用到此参数,把php以模块的形式嵌套在apache中,因为apache是以模块的形式配置的,
而nginx采用的fastCGI的方式实现;
2、配置参数,编译执行:
./configure \
--prefix=/application/php5.5.32 \
--with-apxs2=/application/apache/bin/apxs \
--with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir=/usr/local/libiconv/ \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr/ \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--enable-ftp
[root@web02 apache] make && make install
[root@web02 application]# cd /root/tools/php-5.5.32
[root@web02 php-5.5.32]# ls -l php.ini*
-rw-r--r-- 1 1001 1001 69236 2月 2 2016 php.ini-development #开发环境的配置文件
-rw-r--r-- 1 1001 1001 69266 2月 2 2016 php.ini-production #生产环境的配置文件
[root@web02 php-5.5.32]# cp php.ini-production /application/php/lib/php.ini #php配置文件默认路径
[root@web02 apache]# vim conf/httpd.conf +54 #安装php完成后会出现如下一行,如果没有需要进行手动添加;
54 LoadModule php5_module modules/libphp5.so
[root@web02 apache]# vim conf/httpd.conf +311 #在apache中的配置文件中添加如下两行,来支持php的解析;
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
[root@web02 apache]# vim conf/httpd.conf +168 #添加php的首页文件;
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
[root@web02 apache]# useradd -Ms -u889 nginx /sbin/nologin #添加一个虚拟用户,和nginx和nfs的虚拟用户保持一致;
[root@web02 apache]# vim conf/httpd.conf +67 #配置appach的虚拟用户
User nginx
Group nginx
[root@web02 apache]# bin/apachectl -t
Syntax OK
3、测试php是否正常:
[root@web02 apache]# cat htdocs/php/test_php.php
<?php
phpinfo();
?>
测试页面:
16.3、数据库(使用web01的db01服务器wordpress数据库)
1、测试数据库连接是否正常:
<?php
$link_id=mysql_connect('172.16.1.51','wordpress','123456') or mysql_error();
if($link_id){
echo "mysql successful by wordpress";
}
else{
echo mysql_error();
}
?>
2、测试页面:
16.4、安装wordpress博客软件(同web01服务器上安装wordpress类似,也可以将web01的wordpress复制过来后直接使用):
[root@web02 apache]# cd ~/tools/
[root@web02 tools]# rz -y
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring wordpress-4.5.1-zh_CN.tar.gz...
100% 7989 KB 7989 KB/sec 00:00:01 0 Errors
[root@web02 tools]# tar -xf wordpress-4.5.1-zh_CN.tar.gz
[root@web02 tools]# \cp -a wordpress/* /application/apache/htdocs/php/
[root@web02 tools]# chown -R nginx:nginx /application/apache/htdocs/php/
[root@web02 tools]# ls -ld /application/apache/htdocs/php/
drwxr-xr-x 5 nginx nginx 4096 11月 29 23:37 /application/apache/htdocs/php/
[root@web02 tools]# cd /application/apache/htdocs/php/
1、在浏览器中输入域名进行数据库参数配置,连接wordpress数据库,表前缀要相同:
2、配置多域名访问参数(即ip参数),否则输入域名www.php1.com会自动跳转到域名www.php.com,添加后域名和站点就会相对应起来;
[root@web02 php]# vim wp-config.php
/** enable multiple domains access */
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
此时访问网页是会出现图片加载不出来的情况,需要做nfs存储共享配置;
16.5、nfs共享存储(web01服务器的nfs01服务器)
1、检查web02的nfs的rpc服务:
[root@web02 php]# rpm -qa rpcbind nfs-utils
nfs-utils-1.2.3-78.el6.x86_64
rpcbind-0.2.0-16.el6.x86_64
[root@web02 php]# chkconfig --list rpcbind
rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@web02 php]# /etc/init.d/rpcbind status
rpcbind (pid 1339) 正在运行...
2、挂载nfs共享存储:
[root@web02 php]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web02 wp-content]# mount -t nfs 172.16.1.31:/data/ /application/apache/htdocs/php/wp-content/uploads/
[root@web02 wp-content]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 57G 2.0G 52G 4% /
tmpfs 296M 0 296M 0% /dev/shm
/dev/sda1 190M 67M 114M 37% /boot
172.16.1.31:/data/ 57G 1.7G 53G 4% /application/apache-2.2.31/htdocs/php/wp-content/uploads
[root@web02 wp-content]# ls uploads/
2018
3、加入开机自启动:
[root@web02 wp-content]# echo 'mount -t nfs 172.16.1.31:/data/ /application/apache/htdocs/php/wp-content/uploads/' >>/etc/rc.local
[root@web02 wp-content]# echo '/etc/init.d/rpcbind start' >>/etc/rc.local
[root@web02 wp-content]# echo '/etc/init.d/httpd start' >>/etc/rc.local
[root@web02 wp-content]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data/ /application/apache/htdocs/php/wp-content/uploads/
/etc/init.d/httpd start
/etc/init.d/rpcbind start
4、在浏览器中进行测试: