架设基于LAMP的discuz论坛
By xiao S mgirlslx@gmail.com


物理机 dns+ftp 也做测试机 【192.168.0.7 / 192.168.122.1】
虚拟机1:apache+php 【192.168.122.101】
虚拟机2:mysql 【192.168.122.102】
准备步骤:
步骤一:
1)物理机上搭建DNS 192.168.0.7 test.com 域名, www 记录指向 web1服务器。
2)在物理机上搭建FTP服务,把iso上的所有内容拷贝到 /var/ftp/pub/rhel6
3)客户端 /etc/resolv.conf 指向 192.168.0.7
搭建DNS,步骤略,zone文件内容如下: #注意该文件的权限
[root@desktop7 ~ ]# vim /var/named/test.com.zone
NS @
A 192.168.0.7
www A 192.168.122.101
mysql A 192.168.122.102
步骤二、
安装虚拟机,从网络启动,选择【small installion】,安装完之后,修改虚拟机
的配置,成为模版,之后的虚拟机可以克隆它,对模版做如下操作:
1) 修改主机名 localhost.test.com
2) 配置yum源
[root@localhost ~ ]#vim /etc/yum.repos.d/server.repo
[base]
name=redhat
baseurl=ftp://192.168.122.1/pub/rhel6
enable=1
gpgckeck=0
3)配置网络
[root@localhost ~ ]# vim /etc/sysconfig/network-scripts /ifcfig-eth0
把里面的HWADDR这一行删掉
UUID删掉
ONBOOT=yes
[root@localhost ~ ]# vim /etc/reslov.conf
客户端指向DNS 服务器
nameserver 192.168.122.1
[root@localhost ~ ]# vim /etc/udev/rules.d/70-persistent-net-rules
里面生效行删掉
4)设置防火墙、selinux
[root@localhost ~ ]# iptables -F
[root@localhost ~ ]# service iptables save
[root@localhost ~ ]# setenforce 0
[root@localhost ~ ]# vim /etc/sysconfig/selinux= disabled
5)配置完之后关闭模版,注意之后不要重启、启动模版虚拟机。
[ root@localhost ~ ]# poweroff
6)修改模版 虚拟机网络为NAT 方式
之后的虚拟机可以克隆模版虚拟机,克隆后的虚拟机需要配置静态IP地址,DNS指向、主
机名、yum源等等
搭建apache
克隆模版虚拟机,叫apache ,启动后,配置虚拟机的IP为静态IP,192.168.122.101,
修改主机名为www.test.com
查看其他的配置:DNS指向、yum源、iptables、selinux配置等等。最后网络要畅通。
1.装包
[root@www~ ]# yum -y install httpd php php-mysql
2.启动apache
[root@www~ ]# service httpd restart
[root@www~ ]# echo 192.168.122.101 www.test.com >> /etc/hosts
3.建一个测试页面来访问
[root@www~ ]# echo welcome > /var/www/html/index.html
4.用物理机来测试访问网站www.test.com
防火墙清空

搭建mysql
克隆一台虚拟机叫做mysql ,启动后,配置虚拟机的IP为静态IP,192.168.122.102,修
改主机名为mysql.test.com
查看其他的配置:DNS指向、yum源、iptables、selinux配置等等。最后网络要畅通。
1.装包
[root@mysql~ ]#yum -y install mysql-server mysql-connector-odbc
2.清空防火墙
[root@mysql~ ]#iptables -F
3.启动mysql
[root@mysql~ ]#service mysqld restart
4.mysql默认情况下管理员的密码为空不安全,所以我们可以给他一个密码
[root@mysql~ ]#mysqladmin -u root password 'uplooking'
5.root用户登陆mysql呢权限过大,处于安全性的考虑,添加一个普通用户登陆mysql
[root@mysql~ ]# mysql -puplooking
mysql> grant all on discuz.* to discuz@'192.168.122.101' identified by 'uplooking';
库名 web server
mysql> flush privileges; #刷新授权表
创建数据库mysql>quit
注意授权语句里面,这里的库名叫做discuz库,用户名呢也叫discuz,让apache能登陆
所以IP是192.168.122.101
之后呢我们会做迁移,把apache迁移到nginx上。在迁移的过程当中虚拟机的IP可能会
发生改变,所以到时别忘了mysql这里需要重新授权到nginx服务器IP。
mysql 测试:
在 www(apache)机器上运行:
mysql -u discuz -puplooking -h 192.168.0.12
连接上mysql数据库,能连接成功说明授权成功。
注意iptables 和 selinux 的问题
在apache上安装Discuz论坛
把论坛Discuz_X2.5_SC_UTF8.zip文件放到apache 服务器上面
[root@www ~]# cd /tmp
[root@www tmp]# wget ftp://192.168.0.254/pub/iterms/nginx/Discuz_X2.5_SC_UTF8.zip
#scp
[root@www tmp]# pwd
/tmp
[root@www tmp]# mkdir discuz
[root@www tmp]# unzip Discuz_X2.5_SC_UTF8.zip -d discuz;
[root@www tmp]# mkdir /var/www/html/bbs
[root@www ~]# cp -r /tmp/discuz/upload/* /var/www/html/bbs
注意这个目录/var/www/html/bbs的权限,有些子目录需要apache用户能写
chown apache:apache /var/www/html/bbs/ -R
[root@www ~]# firefox 访问 www.test.com/bbs #安装论坛
mysql数据库服务器:192.168.122.102
数据库名:discuz
数据库用户名: discuz
数据库密码:uplooking
安装完成之后,基于LAMPdiscuz论坛就搭建成功了。
附加:
如果安装向导说"对不起,请将php.ini 中的short_open_tag 设置为On,否则无法继
续安装论坛"调整下这个参数。
[root@www ~]#vim /etc/php.ini
short_open_tag = On
[root@www ~]# service httpd restart
[root@www ~]# firefox 访问 www.test.com/bbs/install.php 安装论坛
[root@www ~]# chown apache -R /var/www/html/bbs

将LAMP 迁移到nginx上(LNMP)
物理机 dns+ftp 也做测试机 【192.168.0.7 / 192.168.122.1】
虚拟机1:apache 【192.168.122.101】
虚拟机2:mysql 【192.168.122.102】
虚拟机3: nginx + spawn_fcgi 【192.168.122.103】
克隆一台虚拟机叫做nginx,启动后,配置虚拟机的IP为静态IP
IP:192.168.122.103,修改主机名为nginx.test.com
查看其他的配置:DNS指向、yum源、iptables、selinux配置等等。最后网络要畅通。
1.在DNS(192.168.0.7/192.168.122.1)上多写一条记录
nginx A 192.168.122.103
迁移完成之后在把www记录在写回 nginx那台机器上,还在迁移过程中,所以原来的
web服务器不能立刻停掉。在工作过程当中,我们是在凌晨去完成相应的操作。
2.在nginx机器上装包
[root@nginx ~ ]# rpm –ivh nginx-1.2.7-1.el6.ngx.x86_64.rpm
[root@nginx ~ ]# yum -y install php php-mysql
[root@nginx ~ ]# rpm -ivh spawn-fcgi-1.6.3-1.el6.x86_64.rpm
3.启动nginx
[root@nginx ~ ]# /etc/init.d/nginx restart
4.修改nginx的配置
[root@nginx ~ ]#vim /etc/nginx/conf.d/default.conf找到
location ~\.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
修改要读取的php文件的路径
include fastcgi_params;
}
把以上这段配置的注释"#"去掉,并修改要读取的php文件的路径为
/usr/share/nginx/html
装完rpm包会有nginx用户和nginx组 grep nginx /etc/passwd
ps -ef |grep nginx
1024以下的端口只有root才可以打开。监听的时候是由root开启的进程端口去监听,
而真正处理的时候是nginx的worker进程。所以之后,所有的目录和文件都应该能够让
nginx用户能够读到。
nginx解释php 是通过spwan-fcgi程序,cgi本身是没有用户概念的,只要你客户端知
道这台机器9000端口是cgi,你就可以连,这样的话呢对安全性上有一定的隐患。
5.修改spawn-fcgi配置
[root@nginx ~ ]# vim /etc/sysconfig/spawn-fcgi
OPTIONS="-u nginx -g nginx -p 9000 -a 127.0.0.1 -C 32 -F 1 –P /var/run/spawn-fcgi.pid - - /usr/bin/php-cgi " 监听本地9000端口
6.启动spwan-fcgi
[root@nginx ~ ]# service spawn-fcgi restart
[root@nginx ~ ]# netstat -tulnp | grep 9000
7.写一个php测试页面,测试下
[root@nginx ~ ]# vim /usr/share/nginx/html/test.php
<?php
phpinfo();
?>
8.客户端访问firefox http://nginx.test.com/test.php
能解释php页面则说明spawn-fcgi 配置成功。
9.到apache上把文件需要迁移的数据拷贝到nginx上
[root@www html ]# scp /etc/php.ini 192.168.122.103:/etc
[root@www html ]# cd /var/www/html
[root@www html ]# tar cf –bbs/ |ssh root@192.168.122.103"tar xf - -C /usr/share/nginx/html"
nginx机器做如下修改:
[root@nginx html ]# pwd
/usr/share/nginx/html
[root@nginx html ]# chown nginx bbs/ -R
[root@nginx html]# service spawn-fcgi restart
配置完之后访问 http://nginx.test.com/bbs/index.php 才能访问论坛。
此时数据库若还没有授权,页面就会报错,找不到mysql数据库
10. 修改nginx配置文件 访问主页也就能看到discuz论坛。
[root@nginx html]#vim /etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html/bbs;
index index.php index.html index.htm;
}
location ~\.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/usr/share/nginx/html/bbs$fastcgi_script_name;
修改要读取的php文件的路径为/usr/share/nginx/html/bbs
include fastcgi_params;
}
[root@nginx html]# service nginx restart
访问 http://nginx.test.com 直接看到论坛首页
需清空浏览器在测试
11.mysql授权给nginx访问数据库。
我们可以登陆到mysql查看mysql的授权信息
#[root@nginx html]#mysql -puplooking
#mysql> use mysql
#mysql > select * from user \G;
mysql >grant all on discuz.* to discuz@'192.168.122.103 identified by 'uplooking';
授权新的web服务器。密码应该和原来是一致的。(nginx)
mysql> flush privileges;
mysql> quit
在测试,就ok了
客户端访问http://nginx.test.com,能访问到论坛则测试成功。
12.删除mysql上的apache授权
在mysql中把原来的apache的授权删掉,在把DNS,www记录交给nginx
[root@nginx html]#mysql -puplooking
mysql> drop user discuz@'192.168.122.101';
mysql> flush privileges;
mysql> quit
13.最后到DNS 把www记录指向nginx
[root@desktop7 ~] #vim /var/named/test.com.zone
www A 192.168.122.103
#nginx条目就可以删除了
[root@desktop7 ~] #service named restart
[root@desktop7 ~] #nslookup www.test.com
现在客户端firefox可以访问了http://www.test.com
迁移完成。

进一步扩展LNMP架构
把原来的一台机器上的nginx+cgi,的cgi应用迁移到另外一台机器上。
这样可以减少原来机器上的cpu资源的竞争。可以减少I/O的竞争。加快连接的速度。另
外一点呢nginx本身就是打开多端口的,cgi本身也是通过端口来打开的。拆分成两台机器
之后,我们会发现可能说65535端口不够用,之后考虑到cgi服务器的安全性,这个时候
我们可能用到双网卡的方式,在nginx上有双网卡的方式,用户进入的时候是使用外网的,
nginx和cgi连接的时候是使用内网的网卡来连接的。cgi不对外提供服务。
物理机 dns+ftp 也做测试机 【192.168.0.7 / 192.168.122.1】
虚拟机1:mysql 【192.168.122.102】
虚拟机2 : nginx 【192.168.122.103】
虚拟机3:spwan_fcgi 【192.168.122.104】
克隆一台虚拟机叫做cgi,启动后,配置虚拟机的IP为静态IP
IP:192.168.122.104,修改主机名为cgi.test.com
查看其他的配置:DNS指向、yum源、iptables、selinux配置等等。最后网络要畅通。
1)在cgi机器上装包
[root@cgi ~] # yum -y install php php-mysql
[root@cgi ~] # rpm -ivh spawn-fcgi
[root@cgi ~ ]# useradd spawn-fcgi
[root@cgi ~ ]# mkdir /home/spawn-fcgi/bbs
之后的论坛数据就放到该目录下。
2)在nginx上的/etc/php.ini ,/etc/sysconfig/spawn-fcgi, /usr/share/nginx/html/bbs 这些文件需要同步到cgi服务器上。
在nginx服务器上拷贝文件到cgi服务器:
[root@nginx nigix ]# scp /etc/php.ini root@192.168.122.104:/etc
[root@nginx nigix ]# scp /etc/sysconfig/spawn-fcgi root@192.168.122.104:/etc/sysconfig
[root@nginx nigix ]# cd /usr/share/nginx/html/bbs/
[root@nginx nigix ]# scp -r * root@192.168. 122.103:/home/spawn-fcgi/bbs
3)在cgi服务器上 修该权限及配置文件
[root@cgi ~ ]# chown spawn-fcgi /home/spawn-fcgi/bbs –R
[root@cgi ~ ]# vim /etc/sysconfig/spawn-fcgi
OPTIONS=" -u spawn-fcgi -g spawn-fcgi -p 9000 -C 32 -F 1 –P
/var/run/spawn-fcgi.pid - - /usr/bin/php-cgi " 监听全网段
[root@cgi ~ ]# service spawn-fcgi start
[root@cgi ~ ]# netstat -ntalp |grep 9000
注意selinux iptables
测试 telnet 192.168.122.104:9000
4)修改nginx配置文件指向cgi机器。
[root@nginx ~ ]# vim /etc/nginx/conf.d/default.conf
location ~\.php$ {
root html;
fastcgi_pass 192.168.122.104:9000
修改 cgi服务器为192.168.0.122.104:9000
fastcgi_param SCRIPT_FILENAME /home/spawnfcgi/bbs$fastcgi_script_name;
修改要读取的php文件的路径为/home/spawn-fcgi/bbs
include fastcgi_params;
}
[root@nginx ~ ]# service nginx restart
然后客户端访问http://www.test.com 数据库连接不到。所以需要mysql中授权给
192.168.122.104 机器
5)配置mysql授权cgi服务器 192.168.122.104
[root@mysql~ ]# mysql -puplooking
mysql> grant all on discuz.* to discuz@'192.168.122.104' identified by 'uplooking';
mysql> flush privileges; 刷新授权表
firefox访问ok,然后把原来的nginx 103的授权删掉了。
mysql> drop user discuz@'192.168.122.103';
mysql> flush privileges;
整个迁移就完成了。
6)上传一个文件试试
最后呢,我们用admin一个用户上传文件测试一下,看看我们的文件会上传到哪里。
Firefox访问http://www.test.com ,上传一个png图片
在nginx 上找一下
[root@nginx ~ ]# cd /usr/local/share/nginx/html/bbs
[root@nginx ~ ]# find ./ -name "*.png"
结果不是。
在到cgi服务器上找一下
[root@cgi ~ ]# cd /home/spawn-fcgi/bbs/data
[[root@nginx ~ ]# find ./ -name "*.png"
./bbs/p_w_uploads/month_1302/20130222_..........png
找到了文件,但文件名不是原始文件的名字,而原始文件名字信息记录在了数据库里面。
所以用户的数据是保存在应用服务器上面的
最后可能随着客户并发量的加大,nginx有多台,fast_cgi有多台,为了保证数据的同步,
就要共享存储。