第二十四章 搭建LNMP潮流组合(Linux Nginx MySQL PHP)
一、安装单实例MySQL5.5.32数据库
1、安装MySQL5.5的方式
(1)第一种:源码安装(取消了configure方式,改为cmake-make-make install方式)
具体安装过程见参考博文注9、Heartbeat+DRBD+MySQL高可用架构方案与实施。一般文件名为mysql-5.5.24.tar.gz这种方式。
(2)第二种:yum或rpm
(3)第三种:二进制包方式安装(直接解压,初始化数据库即可,无需编译。DBA最爱)
一般文件名为mysql-5.5.32-linux2.6-x89_64.tar.gz这种方式。
2、web服务器上如何安装MySQL
(1)数据库和web在一台主机
必须在安装完MySQL(make install)后,进行数据库初始化操作。
(2)数据库和web分离
编译原码时,只须到make install结束即可,二进制方式时,解压后就可以了。实际上就是只需装好客户端,供安装PHP时好调用MySQL生成PHP调用MySQL的函数。
3、建立MySQL账号
(1)创建mysql组
groupadd mysql
(2)创建mysql用户
useradd mysql –g mysql –M –s/sbin/nologin
说明:mysql是一个虚拟用户,不创建家目录,不让登陆
4、安装mysql-5.5.32
(1)解压
tar zxf tar xfmysql-5.5.32-linux2.6-x86_64.tar.gz
(2)删除原有mysql
a、查看已安装的mysql包和路径
rpm -qa | grep -i mysql
find / -name mysql
whereis mysql
b、删除已安装包
rpm -ev --nodeps mysql-server-5.1.71-1.el6.x86_64
rpm -ev --nodeps mysql-bench-5.1.71-1.el6.x86_64
rpm -ev --nodeps mysql-devel-5.1.71-1.el6.x86_64
rpm -ev --nodeps mysql-5.1.71-1.el6.x86_64
c、删除已安装目录
rm -fr /var/lib/mysql
rm -fr /usr/lib64/mysql
rm -fr /usr/share/mysql /usr/bin/mysql/usr/lib/mysql /usr/include/mysql
d、查看是否删除干净
rpm -qa | grep -i mysql
whereis mysql
find / -name mysql
(3)复制到/application下,并重命名为mysql-5.5.32
cp -fr mysql-5.5.32-linux2.6-x86_64 /application/mysql-5.5.32
(4)创建软连接
ln -s /application/mysql-5.5.32//application/mysql
5、mysql初始化和启动
(1)授权mysql用户访问mysql的data目录
chown -R mysql.mysql /application/mysql/data/
(2)初始化mysql
./scripts/mysql_install_db --user=mysql--basedir=/application/mysql/ --datadir=/application/mysql/data/
(3)创建mysql启动脚本
cp support-files/mysql.server/etc/init.d/mysqld
(4)修改mysqld脚本中的basedir和datadir
vi /etc/init.d/mysqld
basedir=/application/mysql/
datadir=/application/mysql/data
(5)创建mysql配置文件:将模版复制到/etc目录下(虚机配置不高,选择small)
cp support-files/my-small.cnf /etc/my.cnf
(6)启动mysqld
/etc/init.d/mysqld start
(7)设置mysql的root用户密码(默认无密码)
/application/mysql/bin/mysqladmin -uroot password '123456';
(8)设置环境变量,添加MySQL启动命令
a、方法一:设置/etc/profile
vi /etc/profile
export PATH=/application/mysql/bin/:/application/nginx/sbin/:$PATH
b、方法二:拷贝相关命令到PATH所在路径下
cp /application/mysql/bin/mysqld/usr/local/bin/
(9)查看错误
错误日志在/application/mysql/data/下的<hostname>.err文件中
cat myLinuxStudy.err
(10)查询mysql数据库下的user表
select user,host from mysql.user;
+------+--------------+
| user | host |
+------+--------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | myLinuxStudy |
| root | myLinuxStudy |
+------+--------------+
(11)为保证安全,删除其它用户,只保留root@127.0.0.1和root@localhost这2个用户
drop user 'root'@'::1';
drop user ''@myLinuxStudy;
drop user ''@localhost;
(12)drop删除用户时,如查报错无法删除时,可使用delete mysql.user表来实现
MySQL使用drop删除用户时,实际就是操作mysql.user表,所以可以用delete来删除mysql.user表中的记录来实现。
drop user ''@localhost;
ERROR 1396 (HY000): Operation DROP USERfailed for ''@'mylinuxstudy'
delete from mysql.user where user=''and host='myLinuxStudy';
Query OK, 1 row affected (0.00 sec)
6、mysql安装常见报错
(1)报错一:scripts/mysql_install_db:line 249
a、报错提示
二进制包安装,执行scripts/mysql_install_db --user=mysql --datadir=/data/mysql/出现如下报错:
scripts/mysql_install_db:line 249: ./bin/my_print_defaults: cannot execute binary fileNeither host‘a.com‘ nor ‘localhost‘ could be looked up with./bin/resolveipPlease configurethe ‘hostname‘ command to return a correct hostname.If you want to solve thisat a later stage, restart this script with the --force option
b、原因
是32位的平台使用了64位的二进制包。
c、解决办法:
换版本,或非要安装,则只能使用源码编译安装。
(2)报错二:缺少libaio.so.1文件
a、报错提示
./bin/mysqld:error while loading shared libraries:libaio.so.1: cannot open shared objectfile: No such file or directory
b、原因
缺少libaio库文件
c、解决办法:查找libaio相关rpm安装所需的包
yum install libaio libaio-devel
(3)报错三:启动MySql提示PID file失败
a、报错提示
启动MySql提示:The serverquit without updating PID file(…)失败
b1、原因1:初始化数据库有问题
c1、解决办法:重新初始化数据库
b2、原因2:启动时用了不同的程序来启启动。(/etc/init.d/mysqldstart和mysqld_safe交叉启动)
c2、解决办法:不要交叉使用相关启动命令
b3、可能是/usr/local/MySQL/data/rekfan.pid文件没有写的权限
c3、解决方法 :
给予权限,执行“chown -R mysql:mysql /var/data” “chmod -R 755/usr/local/mysql/data”然后重新启动mysqld!
b4、可能进程里已经存在mysql进程
c4、解决方法:
用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”杀死,然后重新启动mysqld!
b5、可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。
c5、解决方法:
去mysql的数据目录/data看看,如果存在mysql-bin.index,就赶快把它删除掉吧,它就是罪魁祸首了。
b6、mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件
c6、解决方法:
打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir)。请在[mysqld]下设置这一行:datadir = /usr/local/mysql/data
b7、skip-federated字段问题
c7、解决方法:
检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。
b8、错误日志目录不存在
c8、解决方法:
使用“chown” “chmod”命令赋予mysql所有者及权限
b9、selinux惹的祸,如果是centos系统,默认会开启selinux
c9、解决方法:
关闭它,打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled后存盘退出重启机器试试。
(4)报错四:始终无法登入mysql(密码正确)
a、报错提示
ERROR 1045 (28000): Access deniedfor user 'usera'@'localhost' (using password:YES)
无论怎么处理,就是始终无法登入mysql
b、原因
初始化MySQL数据库时不正常,因为初始化MySQL数据库是会生成一系列系统表,如果这步不正常,发生任何报错,都不奇怪。
c、解决方法
清空data目录下所有内容:rm -fr /application/mysql/data/
重新初始化数据库:
./scripts/mysql_install_db --user=mysql--basedir=/application/mysql/ --datadir=/application/mysql/data/
二、安装PHP(与Apache环境下编译是不一样的)
1、LAMP与LNMP环境下PHP工作方式的区别
LAMP:以模块的方式工作,在Apache中生成libphp5.so,
LNMP:以进程的方式工作,以FCGI方式,启进程(php-fpm)和端口(9000)
2、参照第二十二章搭建LAMP经典组合的要求检查Apache 和mysql的安装情况
3、参照第二十二章搭建LAMP经典组合的要求检查系统lib库的安装情况
rpm -qa|grep -E"zlib|libxml|libjpeg|freetype|libpng|gd|curl|libiconv|zlib-devel
|libxml2-devel|libjpeg-devel|freetype-devel|libpng-devel|gd-devel|curl-devel"
4、安装libmcrypt-2.5.8.tar.gz(安全加密)
tar xf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make
make install
/sbin/ldconfig
cd /wddg/tools/libmcrypt-2.5.8
cd libltdl/
./configure --enable-ltdl-install
make
make install
5、安装mhash-0.9.9.9.tar.gz(不可逆向的php加密方式扩展库)
tar -xf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure LD_LIBRARY_PATH=/usr/local/lib
make
make install
rm –f /usr/lib/libmcrypt.*
rm –f /usr/lib/libmhash*
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
6、安装mcrypt-2.6.8.tar.gz(php重要的加密支持扩展)
tar xf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8
/sbin/ldconfig
./configure
make
make install
7、检查libxslt包是否安装
rpm -qa | grep libxslt
libxslt-devel-1.1.26-2.el6_3.1.x86_64
libxslt-1.1.26-2.el6_3.1.x86_64
8、安装PHP5.3.27
(1)解压
tar xf php-5.3.27.tar.gz
(2)configure
./configure \
--prefix=/application/php5.3.27 \
--with-mysql=/application/mysql \
--with-iconv-dir=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-safe-mode \
--enable-bcmath \
--enable-shmop \
--enable-sysvshm \
--enable-inline-optimization \
--with-curl \
--with-curlwrappers \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--enable-short-tags \
--enable-zend-multibyte \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp
(3)make(会报错)
make
(4)报错内容
/php-5.3.27/sapi/cli/php: error while loading shared libraries:libmysqlclient.so.18: cannot open shared object file: No such file or directory
make: *** [ext/phar/phar.php] Error 127
(5)解决方法
a、方法一
(i)查找文件libmysqlclient.so.18,发现在mysql的lib目录下
find / -name "libmysqlclient.so.18"
/application/mysql-5.5.32/lib/libmysqlclient.so.18
(ii)将mysql的lib目录写入/etc/ld.so.conf
echo "/application/mysql-5.5.32/lib" >>/etc/ld.so.conf
(iii)重新加载/etc/ld.so.conf,让其生效
ldconfig
(iv)再次make,又报错:无法访问ext/phar/phar.phar:没有那个文件或目录
chmod: cannot access `ext/phar/phar.phar': No such file or directory
(v)手动创建该目录
mkdir -p ext/phar/phar.phar
b、方法二
创建libmysqlclient.so.18的软连接到/usr/lib64(非64位,则为/usr/lib/)
ln -s /application/mysql-5.5.32/lib/libmysqlclient.so.18 /usr/lib64/
(6)重新make
make
(7)make install
make install
(8)创建PHP的软连接
ln -s /application/php5.3.27/ /application/php
9、配置PHP
(1)查看PHP的配置文件模版
cd /wddg/tools/php-5.3.27
ll php.ini-*
-rw-r--r-- 1 101 101 69606 Jul 11 2013 php.ini-development
-rw-r--r-- 1 101 101 69627 Jul 11 2013 php.ini-production
(2)比较2个配置文件模版的差别
php.ini-development:开发测试时使用,打开错误输出
php.ini-production:正式环境中使用,关闭错误输出
(3)生成正式PHP配置文件php.ini:将配置模版复制到PHP系统指定路径下,安装完成
cp php.ini-production /application/php/lib/php.ini
三、PHP的fpm配置
1、创建php-fpm配置文件
cd /application/php/etc
cp php-fpm.conf.default php-fpm.conf
2、修改php-fpm配置文件
(1)修改第25行:指定PID文件路径
修改前:;pid = run/php-fpm.pid
修改后:pid = /application/php/logs/php-fpm.pid
(2)修改第32行:指定错误日志路径
修改前:;error_log = log/php-fpm.log
修改后:error_log =/application/php/logs/php-fpm.log
(3)修改第50行,将日志级别由通知改为错误
修改前:;log_level = notice
修改后:log_level = error
(4)修改第93行:扩大文件描述符数量
修改前:;rlimit_files = 1024
修改后:rlimit_files = 32768
(5)修改第162和163行:指定fpm的用户和组
修改前:;listen.owner = nginx
;listen.group = nginx
修改后:listen.owner = nginx
listen.group = nginx
(6)修改第217行:修改最大子进程的数量
修改前:pm.max_children = 5
修改后:pm.max_children = 1024
(7)修改第222行:指定启动时的初始子进程数量
修改前:pm.start_servers = 2
修改后:pm.start_servers = 16
(8)修改第227行:指定没有请求时最少保留的子进程数量
修改前:pm.min_spare_servers = 1
修改后:pm.min_spare_servers = 5
(9)修改第232行:指定没有请求时最大保留的子进程数量
修改前:pm.max_spare_servers = 3
修改后:pm.max_spare_servers = 20
(10)修改第237行:指定空闲进程的超时时间(超进将会被kill)
修改前:;pm.process_idle_timeout = 10s;
修改后:pm.process_idle_timeout = 15s;
(11)修改第243行:扩大每个子进程的最大请求数,超过后将会kill该进程,重新创建新的子进程
修改前:;pm.max_requests = 500
修改后:pm.max_requests = 2048
(12)修改第423行:指定慢查询的记录日志(当查询很慢时,会将该查询记录到指定日志中)
修改前:;slowlog = log/$pool.log.slow
修改后:slowlog = /application/php/logs/$pool.log.slow
(13)修改第429行:指定请求超时参数
修改前:;request_slowlog_timeout = 0
修改后:request_slowlog_timeout = 10
3、检查对比php-fpm.conf.default和php-fpm.conf,查看修改结果
vimdiff php-fpm.conf.default php-fpm.conf
4、检查php-fpm的语法
/application/php/sbin/php-fpm -t
NOTICE: configuration file/application/php5.3.27/etc/php-fpm.conf test is successful
5、启动php-fpm
/application/php/sbin/php-fpm
6、检查php-fpm端口(默认为9000)
netstat -lntup | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 19112/php-fpm
7、检查php-fpm的进程(根据前面配置应为16个)
ps -ef | grep php-fpm
root 19112 1 0 12:40 ? 00:00:00 php-fpm: master process(/application/php5.3.27/etc/php-fpm.conf)
nginx 19113 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19114 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19115 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19116 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19117 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19118 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19119 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19120 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19121 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19122 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19123 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19124 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19125 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19126 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19127 19112 0 12:40 ? 00:00:00 php-fpm: pool www
nginx 19128 19112 0 12:40 ? 00:00:00 php-fpm: pool www
四、设置LNMP开机启动
1、在/etc/rc.local中添加LNMP开机启动项
vi /etc/rc.local
/etc/init.d/mysqld start
/application/php/sbin/php-fpm
/application//nginx/sbin/nginx
2、说明
按照程序的架构,开启服务时,一般从后向前启;停止服务时,一般从前往后停。
五、Nginx整合PHP(nginx.conf.default中默认的php处理配置就是一个坑,通不过,需重新配置php处理配置)
1、修改nginx.conf文件
(1)查看nginx.conf文件内容
vi nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 192.168.93.148:80;
server_name www.abc.org;
root html/www;
index index.html index.htm;
}
}
(2)修改nginx.conf文件内容(坑)
从nginx.conf.default文件中将涉及php的部分拷贝过来(坑),同时修改php处理时的根路径:
将root html改为root html/www。
vi nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 192.168.93.148:80;
server_name www.abc.org;
root html/www;
index index.html index.htm;
#location~ \.php$ {
# root html/www;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
}
}
(3)去掉添加内容中的“#”号
a、查看nginx.conf文件的行数
cat -n nginx.conf
b、查看nginx.conf中含“#”号的内容
sed -n '15,21p' nginx.conf
c、过滤nginx.conf中的“#”号
sed -e '15,21s/#//g' nginx.conf
d、确认无误后,将修改内容写入nginx.conf文件中
sed -i '15,21s/#//g' nginx.conf
(4)查看修改后的nginx.conf文件内容
cat nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 192.168.93.148:80;
server_name www.abc.org;
root html/www;
index index.html index.htm;
location ~ \.php$ {
root html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
}
}
2、检查Nginx语法
/application/nginx/sbin/nginx -t
3、平滑重启Nginx
/application/nginx/sbin/nginx -s reload
4、访问http://www.abc.org/phpinfo.php,报错:File not found
http://www.abc.org/phpinfo.php
5、重新修改nginx.conf文件中关于PHP的处理配置
vi nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 192.168.93.148:80;
server_name www.abc.org;
root html/www;
index index.html index.htm;
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
6、访问http://www.abc.org/phpinfo.php成功
7、测试连接mysql
(1)在/var/html/blog目录下新建连接mysql的php文件
vi /application/nginx/html/www/mysql.php
<?php
$link_id=mysql_connect('localhost','root','123456') or mysql_error();
if($link_id){
echo "mysqlsuccessful by aaa";
}else{
echo mysql_error();
}
?>
(2)测试1,打开http://192.168.93.148/mysql.php成功
显示:mysql successful by aaa
(3)测试2,使用php命令测试mysql.php成功
/application/php/bin/php /application/nginx/html/www/mysql.php
mysql successful by aaa
六、LNMP实战:搭建开源产品Wiki
1、在MySQL中创建数据库wiki
create database wiki;
2、在MySQL中创建wiki用户,并授权可以对wiki库下所有对象的进行操作
grant all on wiki.* to wiki@'localhost' identified by 'wiki';
3、在MySQL中查看wiki用户是否创建成功
select user,host from mysql.user;
+------+---------------+
| user | host |
+------+---------------+
| root | 127.0.0.1 |
| root | localhost |
| wiki | localhost |
| root | xztLinuxStudy |
+------+---------------+
4、在MySQL中刷新权限
flush privileges;
5、在Nginx中创建wiki.conf
mkdir /application/nginx/conf/extra -p
vi /application/nginx/conf/extra/wiki.conf
server {
listen 192.168.93.148:8000;
server_name www.wiki.org;
root html/wiki;
index index.php index.html index.htm;
location ~.*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
6、在Nginx中修改nginx.conf
vi nginx.conf
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 192.168.93.148:80;
server_name www.abc.org;
root html/www;
index index.html index.htm;
location ~.*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
include extra/wiki.conf;
}
7、在Nginx中检查语法
/application/nginx/sbin/nginx -t
8、平滑重启nginx
/application/nginx/sbin/nginx -s reload
9、配置客户端hosts
192.168.188.218 www.abc.org bbs.abc.org blog.abc.org www.wiki.org
10、解压wiki
wget http://kaiyuan.hudong.com/download.php?n=HDWiki-v5.1GBK-20141205.zip
unzip unzip HDWiki-v5.1GBK-20141205.zip
11、复制hdwiki目录下的文件到html/wiki目录中
cd HDWiki-v5.1GBK-20121102/
cd hdwiki/
mv * /application/nginx/html/wiki/
12、更改html/wiki目录下文件权限
chown -R nginx.nginx /application/nginx/html/wiki/
13、访问wiki,打开 wiki页面安装
http://www.wiki.org:8000/
http://192.168.93.148:8000/
14、点击“我同意”按钮,进入检查安装配置界面
如果,最下面的相关目录当前状态为不可用时,需操作上面的第12步,更改html/wiki目录下文件权限。更改后重新刷新页面即可。
15、点击下一步,进入设置数据库界面,设置如下:
数据库服务器:localhost
数据库用户名:wiki
数据库密码:wiki
数据库名:wiki
表名前缀:wiki_ #最好改掉,易被攻击。
16、点击下一步,进入设置管理员界面,设置如下:
管理员昵称:abcdefg
管理员Email地址:aaaaaa@aaa.com
管理员密码:123456
确认密码:123456
17、点击下一步,进入创建数据表界面(自动创建表)
(1)进入mysql客户端,检查创建的表:
mysql -uroot -p
use wiki
show tables;
(2)进入wiki安装目录,删除install目录或将install.php改名
cd /application/nginx/html/wiki
rm -fr install/ 或 mv install/install.phpinstall/installbak.bak
18、点击下一步,进入安装完成界面,会导入默认数据
19、点击下一步,进入添加帮助文档界面
20、点击下一步,点击进入首页。安装完成,打开首页
第二十五章 企业集群架构
一、运行环境
IP |
用途 |
域名 |
首页内容 |
192.168.93.85 |
负载均衡 |
http://www.lb.org/ |
|
192.168.93.148 |
节点1-Nginx |
http://www.abc.org/index.html |
www.nginx.org |
192.168.93.238 |
节点2-Apache |
http://www.apache.org/ index.html |
www.apache.org |
二、搭建Nginx的负载均衡
1、按前面的Nginx的安装过程,在负载均衡所在的服务器192.168.93.85上安装Nginx
2、配置Nginx的负载均衡功能
(1)简化nginx.conf配置文件(去注释和空行)
cd /application/nginx/
grep -Ev '#|^$' nginx.conf.default > nginx.conf
(2)修改配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
server 192.168.93.148:80 max_fails=3fail_timeout=30s;
server 192.168.93.238:80 max_fails=3fail_timeout=30s;
}
server {
listen 80;
server_name www.lb.org;
index index.html index.htm;
location / {
proxy_pass http://backend;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
(3)访问负载均衡服务器(默认策略是轮询:RR(Round Robin))
http://192.168.93.85/ 或 http://www.lb.org/
第一次:www.nginx.org
第二次:www.apache.org
第三次:www.nginx.org
第四次:www.apache.org
第五次:www.nginx.org
第六次:www.apache.org
(4)使用脚本测试:访问100次负载均衡服务器
for n in `seq 100`;do curl 192.168.93.85;sleep 2;done
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
...
(5)故障测试
a、使用脚本测试:访问100次负载均衡服务器
for n in `seq 100`;do curl 192.168.93.85;sleep 2;done
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
www.apache.org
www.nginx.org
b、访问到第10次时,关闭节点2-Apache上的Apache服务
killall httpd
www.nginx.org
www.apache.org
www.nginx.org
www.nginx.org
www.nginx.org
www.nginx.org
www.nginx.org
...
c、访问到第20次时,关闭节点1-Nginx上的Nginx服务
killall nginx
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
...
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currentlyunavailable.<br/>
Please try again later.</p>
...
</body>
</html>
d、访问到第30次时,启动节点2-Apache上的Apache服务
/application/apache/bin/apachectl start
www.apache.org
www.apache.org
www.apache.org
www.apache.org
www.apache.org
...
e、访问到第40次时,启动节点1-Nginx上的Nginx服务
/application/nginx/sbin/nginx
www.apache.org
www.apache.org
www.apache.org
www.apache.org
www.apache.org
www.apache.org
www.nginx.org
...
f、小结
上述操作表明,Nginx的负载均衡有健康检查功能,可以探测服务节点是否正常提供服务。
三、集群节点的Session会话共享问题
由于Nginx的负载均衡默认采用轮询策略:RR(RoundRobin),所以当存在用户登陆访问时,有可能在用户登陆后,将用户请求分配到其它服务器上,由于该服务器没有Session,导致认为用户没有登陆,要求用户重新登陆的问题。这时,可以指定Nginx 的负载均衡策略为ip_hash,让每个请求按访问IP的hash结果分配,这样每个访客钭固定访问一个后端节点服务器,可以有效解决Session的问题。ip_hash要求nginx一定要是最前端的服务器,否则Nginx得不到正确的IP,这时分流是错乱的。ip_hash的缺点是会造成负载不均。用户会话一般保存在服务器的/tmp目录下。
1、配置192.168.93.85上的Nginx负载均衡策略为ip_hash
vi /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
ip_hash;
server 192.168.93.148:80max_fails=3 fail_timeout=30s;
server 192.168.93.238:80max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.lb.org;
index index.html index.htm;
location / {
proxy_passhttp://backend;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2、使用脚本测试:访问100次负载均衡服务器(固定在节点2-Apache)
for n in `seq 100`;do curl 192.168.93.85;sleep 2;done
www.apache.org
www.apache.org
www.apache.org
www.apache.org
。。。
3、生产场景如何保证Session共享
由于轮询RR策略无法解决Session保持,ip_hash又可能造成后台服务器负载不均,所在在生产环境中一般是在所有节点服务器之外搭建缓存服务器,来保存Session会话信息。缓存服务器使用的软件一般是Memcached、Redis、Nosql等。集群架构多服务器同步Session的主要方式:
(1)负载均衡层(LB层):都会导致负载不均,小流量用,大流量不用
LVS:lvs -p
Nginx:ip_hash
Haproxy:cookie insert
(2)软件层:主要是session复制。如Tomcat、resin couchbase
(3)共享:Memcache或其它nosql工具,PHP常用这类方式
(4)门户网站:主要用cookies或cookies配合session把用户级会话缓存在用户本地
4、一台节点服务器上有多台虚拟主机时的代理问题
(1)场景:1节点3虚拟主机
服务器192.168.93.238上,有三台虚拟主机:www.apache.org bbs.apache.orgblog.apache.org
http://www.apache.org/
http://blog.apache.org/
http://bbs.apache.org/
(2)配置192.168.93.85上的nginx.conf
vi /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
server 192.168.93.148:80max_fails=3 fail_timeout=30s;
server 192.168.93.238:80max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.lb.org;
index index.html index.htm;
location / {
proxy_passhttp://backend;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name bbs.lb.org;
index index.html index.htm;
location / {
proxy_pass http://backend;
proxy_set_headerHost $host;
proxy_set_headerX-Forwarded-For $remote_addr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
(3)要保证在各节点上要有server_name是bbs.lb.org的虚拟主机
(4)访问负载均衡服务器的bbs.lb.org虚拟主机,成功
http://bbs.lb.org