您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
nginx-服务器集群搭建
发布时间:2017-11-23 12:32:04编辑:雪饮阅读()
目标:nginx+php+mysql+memcache集群
实验环境:
nginx单机一台
php集群(硬件条件受限用一台服务器多个端口来实现)
mysql+ab客户端a(硬件条件受限,mysql和ab客户端a共用一台服务器)
memcache+ab客户端b(硬件条件受限,memcache和ab客户端b共用一台服务器)
集群结构:
工作流程:
(1)nginx服务器需要做的工作:
(1-1)建立上游php服务器组:
upstream phpserver {
server 192.168.0.53:9000;
server 192.168.0.53:9001;
server 192.168.0.53:9002;
server 192.168.0.53:9003;
server 192.168.0.53:9004;
}
(1-2)建立上游memcache服务器组并配置分布式算法为唯一性哈希算法:
upstream mcserver {
consistent_hash $request_uri;
server 192.168.0.50:11211;
server 192.168.0.50:11212;
server 192.168.0.50:11213;
server 192.168.0.50:11214;
server 192.168.0.50:11215;
server 192.168.0.50:11216;
server 192.168.0.50:11217;
server 192.168.0.50:11218;
}
(1-3)配置nginx与memcache分布式直连与回调:
location / {
set $memcached_key $request_uri;
memcached_pass mcserver;
error_page 404 = /callback.php;
}
(1-4)配置nginx与php集群的连接:
location ~ \.php$ {
root /var/www;
fastcgi_pass phpserver;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意,这里的目录执行为php服务器中的目录了
(1-5)建立nginx与memcache分布式回调的php脚本callback.php:
见附件
(1-6)建立nginx服务器中的一键优化并发各项参数的脚本:
vim tpcoppt.sh
echo 50000 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
(2)php集群服务器需要做的工作:
(2-1)编译安装php5.3.26
php-5.3.26.tar.gz 见附件
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/ --enable-mysqlnd --with-mysql=mysqlnd --enable-fpm --with-bz2 --with-jpeg-dir --with-png-dir --with-freetype-dir --with-libxml-dir=/usr/local --with-zlib-dir --with-gd --enable-gd-native-ttf --with-xsl --with-openssl-dir --with-mcrypt --with-curl --enable-zip --enable-sqlite-utf8 --enable-sockets --enable-soap --enable-ucd-snmp-hack --enable-ftp --enable-safe-mode --enable-bcmath --enable-mbstring
你可能会遇到包含”mcrypt”的错误,那么安装” libmcrypt”试试,libmcrypt-2.5.6.tar.gz见附件。
安装后在源码目录中将php.ini复制到安装后目录
cp php.ini-development /usr/local/php/php.ini
(2-2)为php服务器集群中的每个实例制作单独的配置文件:
在php-fpm.conf中
将”listen = 127.0.0.1:9000”
改成如:
“listen = 192.168.0.53:9000”
php-fpm是以独立进程存在的。
独立进程是有父进程管理着子进程,当子进程没人用就会自动回收了,这是动态子进程。高并发情况下子进程都在使用,我们不让他回收,所以我们要配置为固定的静态子进程。
将”pm = dynamic“(表示使用动态子进程)
改为”pm = static”(表示使用静态子进程)
将”pm.max_children = 5”(说明默认一个主进程会产生5个子进程)
改为pm.max_children = 16
子进程不宜设置过多,过多会抢占cpu也就越厉害
最后总共制作5分这样的配置文件。每个配置文件中监听端口不同。
(2-3)编写一键启动php集群脚本:
php-fpm可以通过-y参数指定要读取的配置文件,利用此原理编写启动脚本
vim start.sh
#!/bin/sh
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9001.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9002.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9003.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9004.conf
(2-4)php集群优化:
ulimit -n 30000
echo 10000 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
(2-5)放置回调的php文件:
将回调php文件callback.php放到上面nginx所配置的php集群的根目录,在这里即“/var/www“
(2-6)安装php访问memcached的扩展:
可能会用到的文件memcache-2.2.7.tgz见附件
(2-7)为php添加一致性memcached分布式哈希算法:
在php.ini中添加memcache.hash_strategy=consistent,这个很重要,否则最后测试memcached分担mysql任务时就老不成功。
(3)mysql+ab客户端a需要做的工作:
(3-1)安装mysql:
建立用户与所属目录
groupadd mysql
useradd -g mysql mysql
mkdir -p /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql
编译
./configure --prefix=/usr/local/mysql --localstatedir=/data/mysql --enable-assembler --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-pthread --enable-static --with-big-tables --without-ndb-debug --with-charset=utf8 --with-extra-charsets=all --without-debug --enable-thread-safe-client --enable-local-infile --with-plugins=max
安装
make && make install
配置mysql
cp support-files/my-huge.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
vi /etc/init.d/mysqld
配置如下两项
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
chmod +x /etc/init.d/mysqld
chkconfig mysqld --add
chkconfig mysqld on
执行初始化配置脚本,创建系统自带的数据库和表,如下命令必须执行在源码目录中,貌似以上步骤后才产生mysql_install_db文件
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
注:在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc目录下找,找不到则会搜索"$basedir/my.cnf",
在本例中就是 /usr/local/mysql/my.cnf,这是新版MySQL的配置文件的默认位置!注意:在CentOS 6.4版操作系统的最小安装完成后,在/etc目录下会存在一个my.cnf,
需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
service mysqld start
mysql命令执行路径
/usr/local/mysql/bin/mysql
(3-2)创建数据库与数据表:
登录mysql后执行如下命令
create database big_data;
use big_data;
create table lx_com(id int not null primary key auto_increment,name varchar(100) not null,address varchar(255) not null);
(3-3)允许远程访问
登录mysql后执行如下命令
grant all privileges on *.* to 'root'@'%' identified by '' with grant option;
flush privileges;
(3-4)添加数据
在php集群服务器中上面nginx服务器中所指定的根目录中建立into.php:
见附件
并将lx_com_json.js也放进同目录中。
(3-4-1)启动php集群:
运行php集群一键启动脚本start.sh
启动php集群后用如下命令会发现有好多的php-fpm进程
ps aux|grep php
-a 显示一个终端的所有进程,除了会话引线
-u uid or username 选择有效的用户id或者是用户名
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
wc命令具有统计结果行数的功能,结合wc命令则可以
查看php服务器群中所有php进程总数
ps aux|grep php|wc
查询结果释义:
86 1122 11226
wc命令
语法:wc [-lwc] filename
选项与参数:
-l : 统计文本文件内容的行数
-w : 统计文本文件内容的字数。(一个字由空白、跳格或换行符分隔的字符串)
-c : 统计文本文件内容总的字节数
-m :统计文件的字符数。如果当前系统不支持多字节字符时,其将显示与-c参数相同结果。
wc后面跟的是选项和文件,而这里我们并没有跟上文件和选项为什么有结果呢?这样的结果又代表什么意思呢?
对于第一个问题,由于在wc命令前面有使用管道符号。
“ | ”,竖线符号代表的就是管道符
管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,所以又称为半双工管道。
管道可以根据一组命令按照数据流向的方式来进行操作。简单的说,第一个命令执行后,不回显结果,而是把结果通过管道传递给第二个命令,第二个命令处理后再传给第三个….直到没有管道符后才终止命令,并回显最终结果。
管道所传输的是无格式的字节流。
而文件实质就是字节流。
而上面的”86 1122 11226”则分别表示行数,word词数,字符数
(3-4-2)访问nginx通过php集群来添加数据:
启动nginx服务器
然后访问into.php如:
这样就将测试数据添加完成了。
(4) memcache+ab客户端b需要做的工作:
编译安装memcached1.4.5
可能会用到的文件:
libevent-2.0.21-stable.tar.gz
memcached-1.4.15.tar.gz
编写一键启动memcached集群脚本start.sh,每个进程只允许2000个并发连接。
另外由于本人内存仅剩1g了,所以这里8个memcached都只给分配4m内存。
#!/bin/bash
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11211 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11212 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11213 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11214 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11215 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11216 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11217 -m 4 -d
/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11218 -m 4 –d
(5)测试:
把上面所有之前的搭建好的nginx开启并优化,php集群开启并优化。mysql服务器开启。
按照回调脚本callback.php的逻辑来测试如下地址
访问如:
http://192.168.0.22/index.html
访问如:
http://192.168.0.22/com133.html
如果都满足逻辑则实验成功。
(6)总结:
经过测试发现,本实验中,如果memcached集群若只有一台,如只有11211,则访问老出现502。应该是回调处只匹配了404的结果没有匹配502结果的原因。
关键字词:nginx,集群,搭建