nginx部署wordpress负载均衡
nginx部署wordpress架构
实验环境
(nginx) 10.20.20.3
(WordPress nginx PHP) 10.20.20.4 10.20.20.5
(mysql 主从) 10.20.20.6 10.20.20.7
查看Word
Press支持的mysql版本

数据库主从设置
安装依赖包
yum install libaio* -y
官网下载包 二进制安装
脚本安装 #脚本练习我QQ 790827253
传入包 安装mysql
10.20.20.6 (主) 10.20.20.7(从)
主 配置
vim /etc/my.cof
#master
[mysqld]
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
server-id=1
log-error=/data/mysql/mysql_error.txt
log-bin=/data/mysql/master-log
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.sock
创建库用户
create database test1;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'dbb'@'10.20.20.%' IDENTIFIED BY '123456';
grant replication slave on *.* to "dbb"@"10.20.20.%" identified by '123456';
如果主数据库之前有数据 要把数据导出来然后让从数据库同步
要把日志改成数据大的时候
导出文件
/usr/local/mysql/bin/mysqldump --all-databases --single_transaction --flush-logs --master-data=2 --lock-tables > /opt/backup.sql
传入从
scp /opt/backup.sql 10.20.20.7:/opt/
/etc/init.d/mysqld restart
查看二进制日志
从配置
vim /etc/my.cof
#slave
[mysqld]
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
server-id=10
#log-bin=/data/mysql/master-log
relay-log = /data/mysql
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.sock
#mysql < /opt/backup.sql #slave 导入sql文件数据
CHANGE MASTER TO MASTER_HOST='10.20.20.6',MASTER_USER='dbb',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-log.000002',MASTER_LOG_POS=950;
验证
show databases;
start slave ;
show slave status\G
主从复制的问题
1 防火墙是否关闭
2 日志一定要同步到正确的时候
3 使用reset slave 清除同步信息 reset maser
(WordPress nginx)10.20.20.4 10.20.20.5
php安装
安装依赖包
yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel
下载包
wget
增加用户
useradd www
编译
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/conf.d --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pear --with-curl --with-png-dir --with-freetype-dir --with-iconv --with-mhash --with-zlib --with-xmlrpc --with-xsl --with-openssl --with-mysqli --with-pdo-mysql --disable-debug --enable-zip --enable-sockets --enable-soap --enable-inline-optimization --enable-xml --enable-ftp --enable-exif --enable-wddx --enable-bcmath --enable-calendar --enable-shmop --enable-dba --enable-sysvsem --enable-sysvshm --enable-sysvmsg
make -j 2 && make install
cd /usr/local/php/etc/
[root@redis-s1 etc]# pwd
/usr/local/php/etc
[root@redis-s1 etc]# cp php-fpm.conf.default php-fpm.conf
cd /usr/local/php/etc/php-fpm.d/
root@redis-s1 php-fpm.d]# pwd
/usr/local/php/etc/php-fpm.d
[root@redis-s1 php-fpm.d]# cp www.conf.default www.conf
vim php-fpm.conf
vim www.conf
修改参数
8 4 4 6
pm.max_children =8
pm.start_servers =4
pm.min_spare_servers =4
pm.max_spare_servers =6
pm.start_servers =4
pm.min_spare_servers =4
pm.max_spare_servers =6
配置说明:
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
启动
/usr/local/php/sbin/php-fpm
(WordPress nginx)10.20.20.4 10.20.20.5
安装nginx
配置官方yum源
或者编译安装
俩个服务器都是一样的配置
编译安装过程
cd /usr/local/scr/
传入安装包 1.12
解压缩
tar xvf
cd 进去 编译
./configure --prefix=/usr/local/nginx --with-pcre --with-http_stub_status_module --with-http_ssl_module
make && make install
配置文件在
/usr/local/nginx/conf/nginx.conf
#mkdir /data/nginx/wordpress –p
#chown www.www /usr/local/nginx/ /data/nginx/ -R
location / {
root /code/wordpress;
index index.php index.html index.htm;
if ($http_user_agent ~ "ApacheBench|WebBench|TurnitinBot|Sogou web spider|Grid Service") {
proxy_pass http://www.baidu.com;
return 403;
}
}
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
1.4:创建php测试页:
# cat /data/nginx/wordpress/index.php
<?php
phpinfo();
?>
1.6:准备数据库:
mysql> CREATE DATABASE wordpress;
创建的用户是负载均衡的ip地址 这里是0.20.20.3
mysql> GRANT ALL PRIVILEGES ON *.* TO "dbb"@"10.20.20.%" IDENTIFIED BY "123456";
mysql> FLUSH PRIVILEGES;
部署WordPress:
[root@redis-s4 wordpress]# pwd
/data/nginx/wordpress
# tar xvf wordpress-5.0.1-zh_CN.tar.gz
# mv wordpress-5.0.1-zh_CN.tar.gz /opt
# cp wp-config-sample.php wp-config.php
#vim wp-config.php #修改数据库配置
# grep "^[a-Z]" wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', '123456');
define('DB_HOST', '192.168.7.103');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('AUTH_KEY', 'zY%A)<+`Qf^68kzMC-)0+bL3m!LADP-PgJ9a~-CLtk*JnJ%-OGDEi/-v*zoJx1gP');
define('SECURE_AUTH_KEY', '1muyi_3wR[/<}1-[2/F=Lb3`1c-+o5*!uu4-un-4!iMb!Nl|X=}Ud-<PGxkPpuse');
define('LOGGED_IN_KEY', '*%/!SxN}FllpDe4+_Phylp>_^jD]N$Tc9/CstL )yRvLg!+9y #l}1?Da 8}sat{');
define('NONCE_KEY', 'mTY2Bio ;v4j^%#O>J&@Py[6TaYy+mLmbp7$[=c,l|qY9TPwSH+Kf(!PUmTE9J`c');
define('AUTH_SALT', '~:wkxx83`q_+bm|{MH-|CA<`>#JJGitCsed#?a^BSsm{rVC1sg;b:&/:h$f>9D.z');
define('SECURE_AUTH_SALT', 'u%_}v`0L~#<kZ|U +st.]iNTbGq-%Bb)Ti&E<$-LMU6jtEz}X)T$MZ{@S(#DJOQp');
define('LOGGED_IN_SALT', 'QxUBuWv[GjaGx7=VR|&.i?wTsS-Jr($}p#?y})O-N1*h$gh d cj%H-g2~HV*&ki');
define('NONCE_SALT', '>Lx7Vu=>R+O||Ks)cCDGO=+st|Ja&|+5GlR?F{1Vdng-q:f#:{[TIfY#EtP|1k8a');
wp-config.php 文件中的主机不是mysql的地址而是 负载均衡的nginxip 10.20.20.3 独立的
访问网站 得到的替换在下面
测试并启动Nginx:
[root@redis-s4 wordpress]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@redis-s4 wordpress]# /usr/local/nginx/sbin/nginx
推荐yum安装
yum 安装过程
配置yum 源 官网
[root@wordpress yum.repos.d]#cat nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
修改配置文件 改用户
vim /etc/nginx/nginx.conf
user www;
worker_processes auto;
vim /etc/nginx/nginx.conf
server {
server_name www.web.com;
listen 80;
root /code;
index index.php index.html;
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
更改目录的权限 和用户
chown www.www /code/ -R
测试页
[root@nginx ~]# cat /code/info.php
<?php
phpinfo();
?>
部署博客产品Wordpress
1) 配置Nginx虚拟主机站点,域名为www.dbb.com
#1.nginx具体配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name www.dbb.com;
root /code/wordpress;
index index.php index.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;
}
}
2) 重启nginx服务
[root@nginx ~]# systemctl restart nginx
3) 获取wordpress产品,解压并部署wordress
[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code
[root@nginx code]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# chown -R www.www /code/wordpress/
tar xf wordpress-4.9.4-zh_CN.tar.gz -C /code/
cp wp-config-sample.php wp-config.php
cd /cxldata/www/wordpress
vi wp-config.php
#添加三行
define("FS_METHOD", "direct");
define("FS_CHMOD_DIR", 0777);
define("FS_CHMOD_FILE", 0777);
wp-config.php 文件中的主机不是mysql的地址而是 负载均衡的nginxip 10.20.20.3 独立的
4) 由于wordpress产品需要依赖数据库, 所以需要手动建立数据库
[root@nginx ~]# mysql -uroot -pBgx123.com
mysql> create database wordpress;
mysql> exit
create database wordpress;
grant all on *.* to dbb@'10.20.20.3' identified by '123456';
(nginx) 10.20.20.3
使用nginx负载均衡
同样安装nginx
安装mysql
连接主mysql的服务器
mysql -udeng -h10.20.20.6 -p123456
配置负载均衡
vim /etc/nginx/nginx.cof
stream {
upstream mysql {
server 10.20.20.6:3306;
}
server {
listen 10.20.20.3 :3306;
proxy_pass mysql;
}
}
启动nginx
nginx -t
nginx -s reload
端口是否打开
如果nginx启动错误
nginx: [error] open() "/Var/run/Nginx.pid" failed (2: No such file or directory)
执行
nginx -C /etc/nginx/nginx.cof
测试在10.20.20.8 上 连接mysql 通过连接10.20.20.3来连接到主数据库 06上
mysql -udeng -h10.20.20.3 -p123456
修改8 9 上面nginx 配置文件访问网页的目录 改为PHp路径
访问ip 测试数据库连接 10.20.20.8
wordpress目录下放置图片的位置
/wp-content/uploads
(nginx) 10.20.20.3
修改配置文件
实现负载均衡
把wordpress1 上面web目录下的文件拷贝到wordpress2 下面
或者重新在2的上面配置wordpress 和1 的上面要一样
server {
server_name www.dbbdbb.net;
listen 80;
location / {
root /code/wordpress;
index index.php index.html;
}
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
在wordpress2 上面要和wordpress1 上面nginx配置文件一样
的代码
server {
server_name www.dbbdbb.net;
listen 80;
location / {
root /code/wordpress;
index index.php index.html;
}
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
访问wordpress2 的ip 查看wordpress 网站 是否和1 的一样
把监听ip改成域名
1的
2 的
做nfs
在3 上安装nfs
yum install nfs-utils -y
做目录共享
mkdir /nfsdata/images -pv
vim /etc/exports
systemctl restart nfs
在wordpress1 和2 上安装nfs-utils
yum install nfs-utils -y
wordoress1 上 查看挂载的目录
showmount -e 10.20.20.3
把目录挂载到图片的目录
如果目录下有数据就拷走 等挂载完再考回来
mount -t nfs10.20.20.3:/nfsdata/images /data/nginx/wordpress/wp-content/iploads
2 的上面也挂载一下
并且写入文件中
vim /etc/fstab
或者写入
vim /etc/rc.d/rc.local
在3 上 加负载
yum install haproxy
/etc/nginx/conf/conf.d/*.cong:
vim conf.d/blog.conf
加人 ip_hash: 服务请求只在一个服务器上
nfs的主从同步
3 上 的主 4上的 从
安装
yum install nfs-utils -y
从上要有和主上一样的目录结构
mkdir /nfsdata/images -pv
vim /etc/exports
systemctl start nfs
将主的数据拷贝到从上面
scp 10.20.20.3:/nfsdata/images/* 10.20.20.8:/nfsdata/images/
可以在8上执行拷贝命令 也可以在别的主机上执行 跨主机执行
做好秘钥认证
可以使用rsync 比scp好 效验功能 已有的文件不会拷贝
yum install rsync
rsync -avrlopg /nfsdata/images/* 10.20.30.8:/nfsdata/images/
秘钥认证
ssh-keygen
ssh-copy-id 10.20.20.4
yum install httpd-tools -y
攻击网站 发起请求
查看本机的 ulimit -n
wordpress 更新
3 上面
把新版本的传进来
解包 tar xvf
cd wordpress
把wordpress1(10.20.20.3) 上面的配置文件拷贝到 3 上面
目录下
scp wp-config-php 10.20.20.3:/usr/local/src/wordpress
3 上
在wordpress目录下
配置文件
wp-config-php
修改配置
拷贝到wordpress2 下面
scp -r ./* 10.20.20.9:/data/nginx/wordpress
修改权限
chown www.www -R /data/nginx/wordpress/
过程
1 停止服务nginx
2备份原数据或删除
3 升级版本
4 启动服务nginx
解完包 进入目录wordpress
打包 zip -r wordpress.zip wordpress/*
脚本
vim updata.sh
#!/bin/bash
ssh 10.20.20.8 "/usr/local/nginx/sbin/nginx -s stop"
ssh 10.20.20.8 "rm -rf /data/nginx/wordpress/*"
scp wordpress.zip 10.20.20.8:/data
ssh 10.20.20.8 "unzip /data/wordpress.zip -d /data/nginx/wordpress/ && /usr/local/nginx/sbin/nginx && chown www.www -R /data/nginx/wordpress/"
学会查看网页的调试器 右键 查看元素
总结配置文件
wordpress1 的配置文件
wordpress2 的一样
server {
server_name www.dbbdbb.net;
listen 80;
location / {
root /code/wordpress;
index index.php index.html;
}
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx配置文件
stream {
upstream mysql {
server 10.20.20.6:3306;
}
server {
listen 10.20.20.16:3306;
proxy_pass mysql;
}
}
server {
listen 80;
server_name blogs;
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;
}
}
# vim /etc/nginx/conf.d/blog.conf
upstream blogs {
server 172.20.101.204:80 weight=1 max_fails=3 fail_timeout=100s;
server 172.20.101.205:80 weight=1 max_fails=3 fail_timeout=100s;
ip_hash;
}
server {
listen 80;
server_name www.dengbingbings.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;
}
}
server_name www.dbbdbb.com 3台机必须一样
10.20.20.3 配置文件 终极版
只需要这一个配置
#调配mysql数据库的
stream {
upstream mysql {
server 10.20.20.5:3306;
}
server {
listen 10.20.20.3:3306;
proxy_pass mysql;
}
}
#负载均衡wordpress
注释掉哈希是为了体现出轮询
upstream blogs {
server 172.20.101.204;
server 172.20.101.205;
# ip_hash;
# hash $request_uri consistent;
server {
listen 80;
location / {
proxy_pass http://blogs;
}
}
补充 实验过程可以切换绑定域名的ip地址来查看实验的效果
C:\Windows\System32\Drivers\etc

wordpress1和2 的配置文件
[root@wordpress2 etc]#cat /etc/nginx/nginx.conf
user www;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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"';
server {
server_name www.dengbingbing.com;
listen 80;
location / {
root /code/wordpress;
index index.php index.html;
}
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
nginx 负载均衡的配置文件
[root@nginx ~]#cat /etc/nginx/nginx.conf
user www;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream mysql {
server 10.20.20.6:3306;
}
server {
listen 10.20.20.16: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"';
upstream blogs {
server 172.20.101.204;
server 172.20.101.205;
# ip_hash;
# hash $request_uri consistent;
}
server {
listen 80;
location / {
proxy_pass http://blogs;
}
}
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}

如果要实现在一个wordpress上面添加图片 另一个没有添加图片
访问可以看到图片和看不到图片 ,要修改wordpress后台的
WordPress地址(URL)和 站点地址(URL)

修改为nginx的调度服务器的地址 然后这个地址绑定到域名上
可能会出现的问题
修改完以后会因为密码不对进不去wordpress页面
解决办法
1 重新安装wordpress使俩个上面的配置都一样
复制拷贝过去
实验过程
在安装完一个wordpress以后在页面创建了以后 再把wordpress的配置文件传到第二个上面