nginx负载均衡场景实验2
nginx负载均衡场景实验
1.开始之前,先把所有的firewalld、iptables以及selinux规则禁用先!
2.五台PC环境:CentOS Linux release 7.5.1804 (最小化)
主数据库IP地址:172.18.139.25
从数据库IP地址:172.18.139.78
Nginx+PHP+Wordpress服务器1的IP地址:172.18.139.46
Nginx+PHP+Wordpress服务器2的IP地址:172.18.139.47
调度服务器IP地址:172.18.139.77
3.使用YUM源:阿里云、Nginx官方源,详细信息如下:
阿里云源:
[root@localhost ~]# cat /etc/yum.repos.d/base.repo
[epel]
baseurl=https://mirrors.aliyun.com/epel/\$releasever/x86_64/
gpgcheck=0
enable=1
Nginx官方源:
[root@localhost ~]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
priority=1
数据库版本:5.5.56-MariaDB
Mariadb主数据库服务器上:
1.禁用firewalld,selinux,iptables,再安装相关包
systemctl stop firewalld.service
yum -y install mariadb-server
2.修改主数据库配置文件
vim /etc/my.cnf, 在[mysqld]中添加内容如下:
[mysqld]
...
log_bin=/data/mysql/master-log
server-id=1
添加完保存退出
3.创建二进制文件存放路径
mkdir -pv /data/mysql/
chown -R mysql.mysql /data
systemctl restart mariadb
4.登陆主数据库服务器上新建账户,为从服务器同步数据做准备
mysql
create database wordpress;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'lei'@'172.18.139.%' IDENTIFIED BY '123456';
reset master; //不是第一次安装不要使用这个命令!!!
show master status;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-log.000001 | 120 |
+-------------------+-----------+
quit
5.导出主服务器上的数据,导出后不要有和重启主服务器的数据库相关的任何操作!!
mysqldump --all-databases --single_transaction --flush-logs --master-data=2 --lock-tables > /opt/backup.sql
scp /opt/backup.sql 172.18.139.78:/opt/
Mariadb从数据库服务器上:
1.禁用防火墙,selinux,iptables,再安装相关包
systemctl stop firewalld.service
yum -y install mariadb-server
2.修改从数据库配置文件
vim /etc/my.cnf, 在[mysqld]中添加内容如下:
[mysqld]
...
...
read_only=ON
server-id=2
systemctl restart mariadb
3.导入数据并同步数据
mysql < /opt/backup.sql
mysql
CHANGE MASTER TO MASTER_HOST='172.18.139.25', MASTER_USER='lei', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE=' mysql-bin.000001', MASTER_LOG_POS=120;
start slave;
show slave status\G
show processlist\G //查看同步过程,如果文件大的话应该能看的到
至此,主从复制实现
PHP,Nginx安装部署:
Nginx使用官方的版本: 1.14.2
PHP版本: 5.4.16
Wordpress版本:5.0.3
PHP配置:
两台php+nginx+worspress服务器上PHP安装部署,都用相同的配置,详情如下:
1.yum源安装php-fpm,php-mysql,使用的是阿里云的epel源!
yum -y install php-fpm php-mysql
systemctl stop firewalld.service
yum -y install mariadb-server
2.设置同步时区
vim /etc/php.ini //找到和下面两行相关的配置文件
date.timezone = Asia/Shanghai //设置本地时区
short_open_tag = On //允许使用缩写形式的php代码
vim /etc/php-fpm.d/www.conf //找到并修改两行中的用户和组
user = nobody
group = nobody
保存退出
Nginx配置:
两台php+nginx+worspress服务器上Nginx安装部署都用相同的配置,详情如下:
1. yum安装Nginx,这里使用的是官方的源
内容如下:
[root@localhost yum.repos.d]# cat nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum -y install nginx
2.为后面存放网页配置建一个目录,并设置相应的权限:
mkdir /data/web -pv
setfacl -R -m u:nobody:rwx /data
3.修改配置文件
vim /etc/nginx/nginx.conf
在全局配置中,修改如下内容:
user nobody;
worker_processes auto;
在事件驱动模块中,把最大连接数量调大到65535
worker_connections 65535;
在http模块中
整体配置:
tcp_nodelay on;
...
gzip on;
4.重读配置文件使其生效
nginx -c /etc/nginx/nginx.conf
nginx -s reload
具体配置如下:
user nobody;
worker_processes auto;
error_log /var/log/nginx/error.log warn
pid /var/run/nginx.pid;
events {worker_connections 65535;}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent""$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
和server有关的额配置为了方便管理我们写在/etc/nginx/conf.d/default.conf里面
具体配置如下:
server {
listen 80;
server_name www.leishujun.com;
root /data/web;
fastcgi_buffers 512 64k;
location / {
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Wordpress配置:
1.到官网下载wordpress并修改权限
wget -O /data/web/wodpress.tar.gz https://wordpress.org/latest.tar.gz
cd /data/web
tar xf wodpress.tar.gz
mv wodpress/* .
rm -rf ./wordpress*
chown -R nobody.nobody /data/web/*
2.修改配置,并分别访问“https://api.wordpress.org/secret-key/1.1/salt/”这个网址获取盐
cp wp-config-sample.php wp-config.php
curl https://api.wordpress.org/secret-key/1.1/salt/
vim wp-config.php
…
…(从第22行开始)
/** WordPress数据库的名称 /
define(‘DB_NAME’, ‘wordpress’); //前面创建数据库名字
/* MySQL数据库用户名 /
define(‘DB_USER’, ‘lei’); //前面创建的账户的名字
/* MySQL数据库密码 /
define(‘DB_PASSWORD’, ‘123456’); //前面创建的数据库的登录密码
/* MySQL主机 */
define(‘DB_HOST’, ‘172.18.139.77’); //这里的IP就是前端Nginx调度的IP地址
…
…(从第49行左右开始),将curl 得到的结果覆盖到下方
define('AUTH_KEY', '_v*zLU~i=^kc`JM,9_t/j#/r+SAd,_.ucaKrdr^:Q&@+A*bMVBSWH=P8th4qh*bS');
define('SECURE_AUTH_KEY', '<S|-bq(99:+Xe-YSa2t/{DhP;L]7cfk(D-t0NI#0y&5V=B*L0YIWlj7} rxB||k9');
define('LOGGED_IN_KEY', 'sx-kZJRl,L:P+-j4])uE)h@|.rm?/+.&D5,(G92M-a7>|;-2Sn[`M|4>g3tsb^Dy');
define('NONCE_KEY', '+aBZYI}c.|v*+wFlKF!P 941;&<~z>/6i^Qaoslv)I=-CzIUDC(a:I$}7huP,B.+');
define('AUTH_SALT', 'd]cGLk7qnE],}~`XQ8IM#3V]Dno<eT0M9Fvrjc+[^{SF:-m|@:,H?yS1%5uDra)*');
define('SECURE_AUTH_SALT', 'oPI ]3qhq%o Q H._J2<=7vt-]fZf7|dX2U%Kj=fnyTE_eV)p[vb9Ute])*YO=Y{');
define('LOGGED_IN_SALT', '|{}XaZ|r#W=_UMSEqFpX$C]%%q] ,rI CdvTht77ev}fQ&(zK!wAB+-L_;T|0Yu~');
define('NONCE_SALT', '5[L|uvhV4E$}c1VVu$zyg6|rMjy2>]gEfj7h}q2@FZU)KXN2{4yQbhzP%khA*bUX');
…
…(最后再加上这三行,可以跳过许多无法预料的麻烦!)
define(“FS_METHOD”,”direct”);
define(“FS_CHMOD_DIR”, 0777);
define(“FS_CHMOD_FILE”, 0777)
调度服务器上安装Nginx进行调度:
1.也是使用官方源下载的nginx
yum -y install nginx
systemctl stop firewalld.service
yum -y install mariadb-server
vim /etc/nginx/nginx.conf
只需要在事件驱动下方添加转发代理模块即可,配置如下:
stream {upstream mysql
{server 172.18.139.25:3306;} //这个是主数据库的IP地址和端口
server {listen 172.18.139.77:3306; proxy_pass mysql;}} //代理机器IP和端口
而整体配置如下:
全局配置:
user nobody;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
事件驱动配置:
events {worker_connections 65535;}
代理转发配置:
stream {upstream mysql
{server 172.18.139.25:3306;}
server {listen 172.18.139.77:3306; proxy_pass mysql;}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent""$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
2. 为了方便管理我们把server的配置写到/etc/nginx/conf.d/目录下的leishujun.conf配置文件中 :
配置如下:
upstream blogs {
server 172.18.139.46 weight=1 max_fails=3 fail_timeout=100s;
server 172.18.139.47 weight=1 max_fails=3 fail_timeout=100s;
#ip_hash; //默认是使用轮询round-robin的方式,但是如果想利用到缓存可以考虑开启
}
server {
listen 80;
server_name www.leishujun.com;
index index.html index.php;
location / {
proxy_pass http://blogs;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
}
3.重读配置文件使其生效
nginx -c /etc/nginx/nginx.conf
nginx -s reload
实现轮询!但是检验过程中可能因为缓存原因可能会出现误判!
补充:为了检验实验效果,使用notepad修改Windows中的hosts文件,在这个文件中加入我们之前在配置中写入的调度器的IP地址和域名,在CMD中输入“C:\Windows\System32\Drivers\etc”,追加如下内容:
172.18.139.77 www.leishujun.com
最后我们使用www.leishujun.com在浏览器中进行访问!
配置NFS共享文件
在两个数据库服务器上的操作:
1.先在主和从数据库服务器上都装上nfs服务
yum -y install nfs-utils
2.在主从数据库上都创建一样的文件夹并赋予一样的权限,然后在主服务器上将其共享出去
mkdir -pv /nfsmount/images
setfacl -R -m o:rw /nfsmount/images
3.在主数据库服务器上:
vim /etc/exports
/nfsmount/images *(rw,no_root_squash,sync)
4.创建完成,重启服务,并查看自己的共享文件是否已经共享!
systemctl restart nfs
exportfs -v
在两台PHP+Nginx+Wordpress服务器上进行的操作:
1.查看主数据库服务器上的文件挂载状态
showmount -e 172.18.139.25
2.使用vim在/etc/fstab最后追加如下内容:
vim /etc/fstab
172.18.139.25:/nfsmount/images /data/web/wp-content/uploads nfs defaults,_netdev 0 0
3.使用vim在/etc/rc.local软连接文件最后追加如下内容:
vim /etc/rc.local
mount -t nfs 172.18.139.25:/nfsmount/images /data/web/wp-content/uploads
4.读取/etc/fstab的挂载
mount -a