Apache+Php+Mariadb+NFS+discuz
安装LAMP服务器,并利用discuz做测试
nfs + discuz 192.168.108.158
php + DNS 192.168.108.160
apache 192.168.108.131 -->web1
apache 192.168.108.132 -->web2
mariadb 192.168.108.133
实验目标:
1,两台前端apache和php都挂载nfs文件系统中的php程序。
2,mysql 为单独一台服务器,为php页面程序提供数据库存储
3,静态页面文件都放在nfs服务器上
4,需要dns轮循为两台前端服务器分配访问请求
缺点: 压力都在文件存储服务器上
优点:不用考虑两台web服务器静态页面一致性的问题。
实验步骤:
1、nfs : 在/etc/exprots 配置文件中写明,允许两台apache和php服务器访问本机的nfs服务;
2、php:编译安装以fpm方式启动进程,进程监听本机的通信ip。根据实现情况调整进程数量,使用的软件级版本;
3、dns:添加DNS域名解析服务器,定义正向和反向区域。
4、apache: 两台web服务器,挂载nfs。编译安装apache,添加支持fcgi协议的模块,把php类型的请求都代理到php服务器,站点根目录为挂载的文件。根据实际情况调整进程启动数量;
5、mariadb:需要授权一个用户从php服务器访问mysql中的一个数据库,此库给discuz使用;
第一步:在IP为192.168.108.158的主机上安装NFS服务(nfs和rpc详细信息请参考https://www.cnblogs.com/hanshanxiaoheshang/p/9236951.html)
#rpcinfo -p //查看启动状态
#rpm -ql nfs-utils | less //查看安装包
#yum imstall nfs-utils //安装nfs软件
#ss -tnl 或者 #rpcinfo -p //查看是否有2049端口
#mkdir /shared //创建共享的目录
# vim /etc/exports //文件中的项的格式相当简单,要共享一个文件系统,只需要编辑/etc/exports并使用下面的格式给出这个文件系统(和选项即可);
/webdata 192.168.160(rw,no_root_squash) 192.168.108.131(rw,no_root_squash) 19 2.168.108.132(rw,no_root_squash)
# exportfs -ar //重启到处所有的文件系统
# showmount -e 192.168.108.158 //查看共享的文件
第二步:定义DNS域名服务器(可参考https://www.cnblogs.com/hanshanxiaoheshang/p/9249877.html)(参考:http://blog.51cto.com/9164364/1541250)
1、先配置成缓存服务器
#yum install bind 安装bind
#yum list bind*
#vim /etc/named.conf //可以修改监听的地址,如果把listen-on这一行用//注释掉,和当前效果一样,监听所有地址
#vim /etc/named.conf
options {
11 listen-on port 53 { 127.0.0.1; };
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named"; //定义工作目录,即区域解析库文件
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 allow-query { localhost; }; 这里可以注释掉或者把localhost改为any,允许所有主机查询
18 recursion yes; //这里表示本地主机支持做递归查询,如果本地主机不支持,就改为no
19
20 // dnssec-enable yes;
21 // dnssec-validation yes;
22
23 /* Path to ISC DLV key */
24 // bindkeys-file "/etc/named.iscdlv.key";
25
26 // managed-keys-directory "/var/named/dynamic"; 20-26行需要注释掉
27 };
#service named start
# ss -tunlp | grep :53 //查看监听端口
# named-checkconf //修改主配置后,检查配置文件语法错误
2、添加正向和反向解析区域
(1)添加正向解析区域
#vim /etc/named.rfc1912.zones
zone "forum.com" IN {
type master; //区域类型:主服务器
file "forum.com.zone"; //区域解析库相对路径,相对与/var/named目录
};
(2)添加反向解析区域
#vim /etc/named.rfc1912.zones
zone "108.168.192.in-addr.arpa" IN {
type master;
file "192.168.108.zone";
};
#named-checkconf //检查配置文件语法错误
3、添加区域解析库文件
(1) 定义正向区域解析库文件
#cd /var/named
#vim forum.com.zone
#named-checkzone "magedu.com" /var/named/magedu.com.zone //利用named-checkzone命令区域和区域库文件是否有错误
(2) 添加反向区域解析文件
#vim /var/named/192.168.108.zone
#named-checkzone 108.168.192.in-addr.arpa 192.168.108.zone //
4、属主属组问题
#ps aux | grep named //查看named进行是谁的身份执行的
#ls -l /etc/named.conf //查看named的主配值文件的属住属组
#ls -l /var/named //应该让属主为root,属组为named
# chmod 640 forum.com.zone
# chmod 640 192.168.108.zone
# chown :named forum.com.zone
# chown :named 192.168.108.zone
# service named restart
5、测试定义的DNS解析
# host -t A bbs.forum.com 192.168.108.160 //使用host工具进行测试,连续两次,实现轮询
# dig -t A bbs.forum.com @192.168.108.160 //使用dig命令测试轮询效果
以上此时可以达到预期。
第三步:在主机IP:192.168.108.160上安装编译安装php-5.4.26
1、解决依赖关系:
#yum -y groupinstall "Desktop Platform Development"
# yum -y install bzip2-devel libmcrypt-devel libxml2-devel
编译安装php报错PHP configure: error: mcrypt.h not found. Please reinstall libmcrypt.
请参考:https://i.cnblogs.com/EditPosts.aspx?postid=9221072&update=1
2、安装php-5.4.26
# tar xf php-5.4.26.tar.bz2 解压php压缩包
# cd php-5.4.26
#./configure --prefix=/usr/local/php --with-mysql --with-mysqli --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --enable-sockets --enable-fpm --with-bz2 --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-mcrypt //编译安装
//编译成功提示
#make && make install
3、安装完成后,需要为php提供配置文件和 Sysv 脚本文件。这些文件的模板在php解压后的源代码包下。
php-5.4.26]# cp php.ini-production /etc/php.ini //提供主配置文件,位于源代码目录中。
php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php //提供服务控制脚本到/etc/rc.d/init.d目录中
php-5.4.26]# ls -ld /etc/rc.d/init.d/php //这里是没有执行权限的
php-5.4.26]# chmod u+x /etc/rc.d/init.d/php
php-5.4.26]# chkconfig --add php //设置开机启动,把php启动脚本添加到/etc/rc.d/init.d/目录下,可在此目录下找到php启动脚本
php-5.4.26]# chkconfig --list php
php-5.4.26]# chkconfig php on //设置开机启动php
php-5.4.26]# cp /usr/local/php/etc/php-fpm.conf.default /usr/lcocal/php/etc/php-fpm.conf //提供php的fpm工作模式下的配置文件。
php-5.4.26]# vim /usr/local/php/etc/php-fpm.conf //修改此配置文件
listen = 192.168.108.160:9000 //修改php监听的本主机的ip地址的9000端口
pm.max_children = 20 //允许最大请求的并发数,由httpd请求的。
pm.start_servers = 5 //服务启动后开启多少个进程
pm.min_spare_servers = 2 //最少空闲多少个进程
pm.max_spare_servers = 10 //最多空闲多少个进程
pid = /usr/local/php/var/run/php-fpm.pid //指定php的PID文件所在位置。这条要写在[global]下面第一行。
至此php服务器已经配置完成
# service php start //启动php,
#ss -tnl //监听在192.168.108.160的9000端口
4、创建和挂载共享
#mkdir /shared
# mount -t nfs 192.168.108.158:/shared/ /shared/
# echo "mount -t 192.168.108.158:/shared /shared" >>/etc/rc.d/rc.local //系统启动后自动执行挂载脚本
# ls -ld /shared/ //这里/shared的目录属主是root
#chown -R nobody /shared //修改webdata目录的所有者为nobody,nobody是php进程运行的用户。
第四步:配置apache,
首先在192.168.108.131上配置(另同)
(重要参考文献http://httpd.apache.org/docs/current/mod/core.html#servername,
https://stackoverflow.com/questions/5856205/could-not-reliably-determine-the-servers-fully-qualified-domain-name/5856234)
1、创建共享目录
#mkdir /shared //尽量和nfs服务器上的目录保持一致
# mount -t nfs 192.168.108.158:/shared/ /shared/ //客户端挂载NFS文件系统
# echo "mount -t 192.168.108.158:/shared /shared" >>/etc/rc.d/rc.local
请务必关闭你的iptables和SELinux
2、在配置apache之前,可以先查看iptables和selinux是否启动,如果启动可以先关闭
#service iptables status //查看iptables运行状态
#genenforce //查看selinux的运行状态
#setenforce 0 //如果开启则可以关闭,此命令只能暂时关闭,系统重启后失效
3、配置安装环境
#yum groupinstall "Development Tools" "Server Platform Development" -y
httpd程序依赖于apr和apr-util,
注:APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
# rpm -qa | grep apr //可以先查看系统是否安装了apr,但是这里显示的是安装了1.3.9的版本,但是httpd-2.4依赖1.4以上版本的apr。
本系统已经准备好3个软件包:apr-1.5.0.tar.bz2 apr-util-1.5.3.tar.bz2 httpd-2.4.6.tar.bz2 一次进行安装
4、安装apr-util
# tar xf apr-1.5.0.tar.bz2
# cd apr-1.5.0
#./configure --prefix=/usr/local/apr
#make && make install
#echo $? //查看是否安装成功,成功则为0
5、安装apr-util
# tar xf apr-util-1.5.3.tar.bz2
# cd apr-util-1.5.3
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
#make && make install
6、安装apache
#yum install pcre-devel -y //解决依赖包
如果此功能无法解决问题,则需要下载pcre软件包进行编译安装,下载网址:https://ftp.pcre.org/pub/pcre/
#tar xf pcre-8.42.tar.gz
#./configure //本机操作时指定了安装目录,httpd安装时就找不到,--prefix=/usr/local/pcre
#make && make install
# tar xf httpd-2.4.6.tar.bz2
# cd httpd-2.4.6
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24/ --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-mpms-shared=all --with-mpm=event --enable-modules=all
--prefix=/usr/local/apache //指明安装路径,将来想卸载时,可以直接把目录删掉
--sysconf=/etc/httpd24 //配置文件,系统rpm包自动安装的在/etc/httpd/目录下,为了避免冲突
--enable-so //支持动态模块加载机制
--enable-rewrite //支持URL重写机制
--with-zlib //支持compress传输值,是一个压缩库
--with-pcre //pcre是perl扩展的正则表达式,一般利用URL重写时都会用到pcre,此处需要先安装pcre-devel #yum install prcre-devel -y
--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ // 此处指明http安装依赖到的apr和apr-util,这里要指明apr安装的路径
--enable-modules=most //支持大多数常用的模块
--enable-mpms-shared=all //把所有支持mpm机制共享模块都编译进来,
--with-mpm=prefork //默认使用prefork
#make && make install -j 3 //由于安装apache工作量大,可以开3个线程
7、配置apache的环境变量
#vim /etc/profile.d/httpd.sh //修改PATH环境变量,让shell可以搜索到apache的命令
export PATH=/usr/local/apache/bin:$PATH
或者
# echo "export PATH=/usr/local/apach/bin:$PATH" >> /etc/profile.d/httpd.sh
# source /etc/profile.d/httpd.sh //重读环境变量,让刚设置的PATH环境变量在当前shell进程中生效
#echo $PATH //查看是否生效
8、测试apache
# apachectl start //此时可以启动apache,
可能会出现的错误:
#vim /etc/httpd24/httpd.conf
ServerName ....:80 //此行前面的#去掉
#ss -tnl //查看80端口是否启动
解决方案参考:https://www.cnblogs.com/Anker/p/3355039.html
解决方案参考:https://blog.csdn.net/crazw/article/details/8266751
9、为编译安装的httpd配置服务脚本
#cd /etc/rc.d/init.d/
#cp httpd httpd24 //把系统自带的httpd服务脚本复制一份进行修改,当作编译安装的httpd24的服务脚本
#vim httpd24
apachectl=/usr/local/apache/bin/apachectl //httpd的编译安装路径
httpd=/usr/local/apache/bin/httpd //httpd的默认程序
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd24.pid} //如果启动httpd24时,出现pid错误,可以查看/usr/local/apache/logs目录下是否有httpd.pid文件,有的话,更改此路径
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
如果反复出现上述图片内容;
#vim /etc/rc.d/init.d/httpd24 修改为:
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
#chkconfig --add httpd24 //将httpd加进到服务列表中去
#chkconfig --list httpd24
#chkconfig httpd24 on //设置在2345开机启动
#service httpd24 start
#ss -tnl // 查看是否有80端口
10、编辑httpd的主配置文件
#vim /etc/http24/httpd.conf
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so //开启fcgi协议支持
LoadModule proxy_module modules/mod_proxy.so //开启代理支持
添加一下两行
ProxyRequests off //关闭正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.108.160:9000/shared/bbs/$1 //只要是php文件都使用fcgi协议代理到php //有时候可能会出问题,需要重写一遍
在相应的虚拟主机中以反向代理的方式告诉用户,所有对以.php格式结尾的URL请求,
都基于fcgi这个协议送给(127.0.0.1)这个服务器上的9000端口,
^/(.*\.php)$:以任何内容开始,以.php格式结尾的所有内容
/PATH/TO/DOCUMENT_ROOT:表示PHP网页文件的存放位置
/shared 就是nfs服务器的共享目录
$1:表示^/(.*\.php)$这个模式中所匹配到的页面资源路径,这是做表达式的后向引用的
DocumentRoot "/shared/bbs" //修改站点根目录为nfs
<Directory "/shared/bbs"> //修改对站点根目录的控制标签
DirectoryIndex index.html index.php //添加默认请求文件
AddType application/x-httpd-php .php //在<IfModule mime_module>标签中加入,以支持php格式的文件。
AddType application/x-httpd-php-source .phps 同上
# httpd -t 测试配置文件是否有语法错误
# service httpd24 restart 重启httpd服务
11、测试php服务器是否可以为apache提供文件类型是php的解析服务
#vim index.php //文件在NFS服务器中的共享目录/shared中定义
<?php
phpinfo();
?>
在浏览器中输入:192.168.108.131/index.php,测试通过
第五步:配置MySQL (可参考:https://www.cnblogs.com/hanshanxiaoheshang/p/9193958.html)
二进制编译安装mariadb ,mysql数据库文件存放在/mydata/data下。本机另外准备了一个磁盘用于创建逻辑卷,data挂载的是一个逻辑卷,属主属组为mysql。
1、首先确保主机的MySQL没有运行
#ss -tnl //查看有没有80端口
或者
#service mysqld stop
2、添加mysql用户和组
#id mysql //首先查看mysql用户是否存在
#groupadd -r -g 306 mysql //添加系统组mysql,并指明组id
#useradd -r -g 306 -u 306 mysql //添加用户,并指明id号
3、下载mariadb并解压
#tar xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local //根据要求解压到指定目录,如果创建到其他目录下,则需要利用#ln -sv创建符号链接,即通过/usr/local/mysql可以当问到文件
#cd /usr/local
#ln -sv mariadb-5.5.46-linux-x86_64 mysql //创建符号链接
#cd /usr/local/mysql
#ll //查看目录下的文件属主属组
#chown -R root:mysql ./* //递归修改mysql目录下的所有文件的属主为root,属组为mysql
4、生成数据库
#cd /usr/local/mysql //mysql安装完成后会有四个数据库,其中有一个mysql数据库是用来存放mysql的原数据的,这个数据库需要使用脚本生成
#ls /scripts //生成脚本在此目录下mysql_install_db
#/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data //指明用户和数据库存放路径,生成数据库
#ls /mydata/data
mysql performance_schema test
5、提供启动服务脚本
mysql#ls support-file 目录下叫mysql.server
mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld //把文件复制到并命名
# chkconfig --add mysqld // 把mysql假如到服务列表中去
chkconfig --list mysqld
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
此时虽然可以启动,但是还没有配置文件
7、准备配置文件
#mkdir /etc/mysql //为了避免和系统安装的rpm冲突,这里新建一个目录
mysql]# ls support-files/ //可以看到此目录下有很多样例文件
my-small.cnf 64M内存
my-medium.cnf 256M内存
my-large.cnf 512M内存
mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
#vim /etc/mysql/my.cnf //添加后三行
40 # Try number of CPU's*2 for thread_concurrency
41 thread_concurrency = 8
42 datadir = /mydata/data //数据库路径
43 Innodb_file_per_table = on //
44 skip_name_resolve = on //跳过名称反解,使用mysql客户端链接时,都会把IP地址反解成主机名,并在本地做权限检查。
#service mysqld start
#ln -s /usr/local/mysql/bin/mysql /usr/bin
至此mysqld已经可以成功启动了
#mysql
MariaDB [(none)]> use mysql
MariaDB [mysql]> SELECT User,Host,Password From user;
可以看得出密码全部为空,且有两个匿名用户,所以要给所有的管理员加上密码,清楚所有匿名用户,即安全初始化
8、MySQL安全初始化
# /usr/local/mysql/bin/mysql_secure_installation //直接回车
Enter current password for root (enter for none): //因为现在root没有密码,所以直接回车
Set root password? [Y/n] //是否为管理员设置密码,当然是,y
New password:
Re-enter new password: // 输入两次密码
Remove anonymous users? [Y/n] //是否删除匿名用户,当然要
Disallow root login remotely? [Y/n] //是否禁止管理员远程登陆,这个在实际生产环境中是必须要禁止的,因为数据很重要,管理员权限很大,必须禁止
Remove test database and access to it? [Y/n] //是否移除测试数据库,看个人
Reload privilege tables now? [Y/n] //是否重载授权表,改了管理员密码或者创建用户都需要重载-->Y
#mysql -uroot -p //再次登陆就需要输入密码了
MariaDB [(none)]> use mysql
Database changed
MariaDB [mysql]> SELECT User,Host,Password From user;
可以看得出匿名用户已经被清除,且每个管理员都有密码
为数据库discuz,数据库用户名为disadmin授权在IP为192.168.108.160主机上登陆,密码为 123456
[mysql]> grant all privileges on discuz.* to disadmin@192.168.108.160 identified by '123456';
[mysql]> flush privileges;
9、添加一个磁盘并进行格式化,本主机单独空了sdb,这里是/dev/sdb2
文件中有一个data目录,是用来存放数据库中的数据的,但是数据会逐渐增大,所以需要单独放在一个挂载的磁盘中,
#fdisk /dev/sdb --> n --> p --> 1 -->+10G -->t -->8e -->w
#partx -a /dev/sdb 告诉内核当前磁盘的分区情况, -a :增加制定的分区或读磁盘新增的分区
# pvcreate /dev/sdb2 // 创建pv
#vgs //查看当前已有的卷组 卷组(Volume Group)将多个物理卷组织成一个整体,屏蔽了底层物理卷细节。在卷组上创建逻辑卷时不用考虑具体的物理卷信息。
#vgcreate myvg /dev/sdb2 //创建LVM卷组。
#lvcreate -L 8G -n mydata myvg //创建LVM的逻辑卷。逻辑卷是创建在卷组之上的。逻辑卷对应的设备文件保存在卷组目录下,
例如:在卷组"vg1000"上创建一个逻辑卷"lvol0",则此逻辑卷对应的设备文件为"/dev/vg1000/lvol0"。
#yum install xfsprogs //这里采用xfs文件系统
#modprobe xfs //自动出来可载入模块
#modinfo xfs //查看xfs信息
# mkfs.xfs /dev/myvg/mydata //格式化逻辑卷
或者采用ext4系统
#mke2fs -t ext4 /dev/myvg/mydata
#mkdir /mydata //创建挂载目录
#vim /etc/fstab 添加如下
/dev/myvg/mydata /mydata xfs defaults 0 0
#mount -a
#mount 就可以看到挂载的目录-->/dev/mapper/myvg-mydata on /mydata type xfs (rw)
#cd /mydata
#mkdir data //在分区上创建一个目录
#chown mysql:mysql data //把目录的属主和属组都改为mysql,因为对mysql而言,运行的是mysql用户
至此数据库配置完成
第六步:下面开始测试安装discuz
在浏览器中输入web1的192.168.108.31或者web2的192.168.108.132
以上是在宿主机上的网页测试的
第八步:利用虚拟机XP系统进行测试
使用XP系统自带的命令提示符下测试域名解析的结果
利用虚拟机XP系统是可以的浏览器可以直接解析域名bbs.forum.com,由于浏览器版本低,无法查看
以下是所参考的网站:
http://www.cppblog.com/niewenlong/archive/2008/06/05/52277.aspx
http://blog.51cto.com/wukui/1540833
http://blog.51cto.com/9164364/1541250
https://www.linuxidc.com/Linux/2015-08/121029.htm
http://blog.51cto.com/bluebox/1708108
http://blog.51cto.com/lxsym/477027
http://blog.51cto.com/xiaolangit/1269258
https://blog.csdn.net/u010098331/article/details/50752667
http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html