综合架构---6--网站负载均衡--36

综合架构---6--网站负载均衡--36

环境

环境:虚拟机

ip:10.0.1.0

网关:10.0.1.2

子网掩码:255.255.255.0

测试机器ip:10.0.1.102

tips:机器不可以有nginx,所以这里建议你重新开个新机器或者克隆一个模版机 

实战

1.给网站替换图片

#步骤

#1.复制图片地址 
http://10.0.1.102/upload/static/image/common/logo_88_31.gif

#2.分析位置
tips:一般都是在网站的发布目录下

cd /html/www/

cd/upload/static/image/common

#3.替换图片
mv 可以把原来的图片移除一下,用rz命令上传其他的替代图片 图片名要一样的

rz 

#4.测试一下页面
nginx -t
nginx -s reload






2.工作网站迁移(重点)

要求
能实战出来
能说出来



环境准备

旧机器:10.0.1.102
新机器:10.0.1.139



#步骤

1.准备一个新服务器

用vm虚拟机克隆准备一个服务器
修改ip
重启网络
克隆机器的论坛代码删除
cd /html/www
rm -rf *




2.LNMP服务器  nginx版本   mysql版本   php版本
              1.18.0     5.6.51      7.2.29



3.新服务器安装环境



4.迁移代码


scp -r upload/ root@10.0.1.139:/html/www
远程命令  代码目录  以root用户权限  对方发布目录

chmod +777  upload/ -R
这是代码的数据库配置文件,一般你迁移到新机器上,要给一下权限
config_global_default.php 
config_global.php

nginx -s



1.配置nginx配置文件
2.重启php nginx 服务  /etc/init.d/php-fpm start
3.数据库也要备份,正常这时候是会出现报错的 如下图

img

3.数据库迁移故障案例


#步骤


1.备份数据库(原机器)

mysqldump

mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -uroot -p123 -B -A >/home/d.sql  

2.推送备份数据库文件到新机器上
scp /home/d.sql root@10.0.1.139:/home


mysql -uroot -p"123"

3.还原数据库(新机器)
mysql -uroot -p"123"    #进入sql环境中配置
show databases;         #显示一下新机器的数据库,如果有同名的数据库要删掉
drop database ultrax;   #删除数据库命令
create database ultrax;   #创建数据库命令
use ultrax;     #进入某个具体数据库
show tables;    #显示一下数据库大小

source /home/d.sql;    #还原你备份的数据库文件,在这里还原一下就可以了




4.测试迁移结果

旧机器:http://10.0.1.102/upload/
新机器:http://10.0.1.139/upload/





#tips:在备份数据库之前一定要看一下数据库的整体大小,不然备份失败或者备份过去了,恢复出了错,自己看不出来,可能会导致数据库表损坏,重点-重点-重点一下是我的数据库大小

原机器
-rw-r--r--  1 root  root  2958958 Mar 25 15:05 d.sql
新机器
-rw-r--r--  1 root  root  2958958 Mar 25 15:06 d.sql

如图

img

img

4.数据备份到存储(nfs)


环境:虚拟机

ip:10.0.1.0

网关:10.0.1.2

子网掩码:255.255.255.0

测试机器ip:
10.0.1.134


10.0.1.140  NFS服务端
10.0.1.134  NFS客户端+网站(主备份目录)



#步骤
#1.准备服务器

10.0.1.140  NFS服务端
10.0.1.134  NFS客户端+网站(主备份目录)


#2.没有做nfs的,可以做个nfs服务端

yum install -y nfs-utils
mkdir /backup
cd /backup
tar -zcvf "backup_1_${DATE}.tar.gz" 1.txt

vim /etc/exports
/data 10.0.1.140/24(rw,async,no_root_squash,no_all_squash)

systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs

客户机执行
1、安装nfs
yum install -y nfs-utils
systemctl enable rpcbind.service


客户端不需要启动服务

2、检查 NFS 服务器端是否有目录共享
showmount -e 10.0.1.140
3、使用 mount 挂载A服务器端的目录/home/nfs到客户端B的目录/home/nfs下
 mkdir /backup
 mount -t nfs 10.0.1.140:/backup /backup
df -h



#3.备份数据到存储



备份网站--备份
[root@master www]# cp -r /html/www/upload/ /backup/
[root@master www]# cp -r /home/d.sql /backup/


nfs服务端--存储

[root@master backup]# ls
d.sql  upload









5.集群和负载均衡理论


集群:一组服务器 干一件事
比如我是包工头 手下盖房子所有人 共同干一件事  一起搬砖







负载均衡:用户请求调度  实现用户访问压力


负责分发工作任务,有任务了,安排张三  






6.手动负载均衡

#步骤

环境:虚拟机

ip:10.0.1.0

网关:10.0.1.2

子网掩码:255.255.255.0

测试机器ip:

web三台
10.0.1.146    web1
10.0.1.147    web2
10.0.1.144    web3





准备:三台服务器  配置环境一模一样

1.部署好环境   上传代码
10.0.1.146    web1
10.0.1.147    web2
10.0.1.144    web3
LNMP服务器  nginx版本   mysql版本   php版本
 
tips:安装时如果没有依赖包,这时就要更新一下yum源了

没有更新yum源的,可以更新一下

1.1 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

1.2 载新的 CentOS-Base.repo 到 /etc/yum.repos.d/

1.3 各版本
centos8

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo


centos6
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo


CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo



1.4各版本epel源

 备份(如有配置其他epel源)
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup

下载新repo 到/etc/yum.repos.d/

epel(RHEL 8)
1)安装 epel 配置包

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

2)将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*



epel(RHEL 7)

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo


epel(RHEL 6) (epel6官方源已下线,建议切换epel-archive源)

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-6.repo



1.5    更新缓存和软件包
yum clean all
yum makecache
yum update


tips:建议在这里设置一下虚拟机快照,不然每次都要这样,会很耽误时间





tips:看你自己安装方式是那种,如果你需要yum安装就用yum,我这里选择编译安装


编译安装--lnmp
#0. 安装开发包
yum -y install ntp make openssl openssl-devel pcre pcre-devel libpng libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel gcc gcc-c++ libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2 libxml2-devel imake autoconf automake screen sysstat compat-libstdc++-33 curl curl-devel

1.1#安装一下gcc编译工具和依赖
yum -y install pcre-devel  openssl-devel zlib-devel gcc
1.2#创建用户组和设置此用户组不可以登录(如果你有了,就不用创建了)
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
1.3#解压一下(一般你自己选个解压目录,便于管理和配置)
切换到解压后的nginx目录中执行:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz

解压压缩包
tar zxvf nginx-1.18.0.tar.gz    (解压)

tar zcvf nginx-1.18.0.tar.gz   (压缩)


1.4#编译一下他的用户和所属组以及配置安装路径--生成马克file文件
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module



注解:
您提供的命令是对 ./configure 脚本的调用,该脚本通常位于采用 GNU Autotools 构建系统的软件项目源代码目录中。这个脚本用于为项目的编译和安装做前期准备,根据用户提供的配置选项生成相应的 Makefile 文件。具体到您给出的命令:

[root@node-1 ~]
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx \
--with-http_ssl_module --with-http_stub_status_module


各个选项含义如下:

- --user=nginx: 指定编译安装后,Nginx 服务运行时所属的系统用户为 nginx。这意味着当 Nginx 服务启动时,将以 nginx 用户的身份运行。

- --group=nginx: 指定编译安装后,Nginx 服务运行时所属的系统组为 nginx。这意味着当 Nginx 服务启动时,将以 nginx 组的成员身份运行。

- --prefix=/usr/local/nginx: 设置 Nginx 的安装目录为 /usr/local/nginx。这意味着编译完成后,Nginx 的可执行文件、配置文件、库文件、文档等将被安装到这个路径下。例如,Nginx 主程序通常会被安装到 /usr/local/nginx/sbin/nginx,配置文件则位于 /usr/local/nginx/conf/nginx.conf。

- --with-http_ssl_module: 启用 SSL/TLS 支持模块。配置此项后,编译出的 Nginx 将具备处理 HTTPS 请求的能力,允许网站提供安全的加密通信。

- --with-http_stub_status_module: 启用 stub_status 模块。该模块提供了一个简单的 HTTP 接口,可以用来查询 Nginx 服务器的基本状态信息,如当前活动连接数、处理过的请求总数等。这对于监控 Nginx 服务器的运行状态非常有用。

执行以上命令后,./configure 脚本将检查系统环境,确认依赖项是否满足,并根据指定的选项生成相应的 Makefile。接下来,用户通常会执行 make 命令编译源代码,然后执行 make install 命令将编译好的程序安装到指定的位置。这样,一个带有 SSL 支持和 stub_status 模块的 Nginx 服务器就安装完成了,并将以 nginx 用户和组的身份运行。



make  

make install  

启动nginx:/usr/local/nginx/sbin/nginx
关闭nginx:/usr/local/nginx/sbin/nginx -s stop
检查nginx 是否异常:/usr/local/nginx/sbin/nginx  -t

重启nginx: nginx  -s reload




1.5#定义一下软连接(提高效率)
每次都需要输入路径才可以重启 检查等操作比较繁琐

用软连接定义
ln -s /usr/local/nginx/sbin/nginx /bin/nginx

这样就可以了

启动  : nginx 
停止:nginx -t stop
重启 :  nginx -s reload
检查:   nginx -t








1.6 #编译php环境

cd /usr/local/src/
rz命令上传
#tips:这里上传php的源码包
tar zxvf php-7.2.29.tar.gz 

cd ./php-7.3.9


#tips:编译安装
./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --with-mysqli --with-pdo-mysql --with-gd --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc --with-openssl --enable-mbstring --enable-fpm


make && make install    #编译 编译安装



cp php.ini-production /usr/local/php/etc/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
cp /usr/local/php/etc/php-fpm.conf.default  /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default  /usr/local/php/etc/php-fpm.d/www.conf
ln -s /usr/local/php/bin/php /usr/local/bin
echo -e "\033[31m php部署成功 \033[0m"


启动php: /etc/init.d/php-fpm start   

使用netstat -tuln 查看 如果有 9000 端口就是正常 


1.7 安装数据库

#tips:这里就用这个yum安装吧 ,编译MySQL耗时间

wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
 yum -y install mysql-community-server



[root@node-1 ~]#systemctl start mysql
[root@node-1 ~]#systemctl status mysql     看一下状态
[root@node-1 ~]# systemctl start mysql.service  设置自启动

ss -tulpn |grep mysql

数据库接口 3306


为root账户设置数据库密码
[root@node-1 ~]#mysql_secure_installation  #初始化MySQL
Enter current password for root (enter for none):   <---输入现在的root密码,因为我们还没设置,直接回车
Set root password? [Y/n] Y                                    <---是否设定root密码,当然设置了,输入Y回车
New password:                                                      <---输入root密码,并回车,输入的过程中不会有任何显示
Re-enter new password:                                        <---再次输入root密码,并回车,输入的过程中不会有任何显示
Remove anonymous users? [Y/n] Y                      <---是否删除匿名用户,删除,输入Y回车
Disallow root login remotely? [Y/n] Y                     <---是否删禁止root用户远程登录,当然禁止,输入Y回车
Remove test database and access to it? [Y/n]      <---是否删除测试数据库test,看个人喜好
Reload privilege tables now? [Y/n] Y                    <---刷新权限,输入Y回车
最后出现:Thanks for using MySQL!
MySql密码设置完成,重新启动 MySQL:


tips:数据库密码一般设置就比较复杂的,在生产环境中,不过这里就不设置复杂的了,直接123


mysql -uroot -p"123"     #创建一个root账户的数据库密码


create database  wordpress;    #新建一个数据库

show databases;    #查看一下是否存在




1.8#修改nginx配置文件
cd /usr/local/nginx/conf
打开 多域名配置如下:

vi /usr/local/nginx/conf/nginx.conf
vim nginx.conf
参考这个配置文件

[root@web3 conf]#cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       81;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
include /usr/local/nginx/conf/vhost/*.conf; 
}

 

重启nginx 
在cd /usr/local/nginx/conf/vhost 目录新建配置文件
 
vi www.conf 添加如下

  server {
       listen        80;
       server_name   www.it.com localhost;
       location  / {
         root  /html/www;
         index index.html index.php;
       }


location ~ \.php$ {
 fastcgi_pass   127.0.0.1:9000;
 fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME  /html/www$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /html/www$fastcgi_script_name;
include        fastcgi_params;        }





    }



nginx -t   检查一下
nginx  -s relaod 重启启动nginxls



#!/bin/[root@node-1 ~]
yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel
yum install -y libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel
yum install -y  glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel 
yum install -y e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers




1.9 # 检查测试一下php

vi index.php

<?php 
        phpinfo(); 
?>


nginx -t
nginx -s reload
或者  

 /usr/local/nginx/sbin/nginx -s reload
 
 
 
查看index.php页面显示
http://10.0.1.102




2.0 #测试php和mysql是否成功测试

vim test_mysql.php
       <?php
        $servername = "localhost";
        $username = "root";
        $password = "oldboy123";
        //$link_id=mysql_connect('主机名','用户','密码');
        //mysql -u用户 -p密码 -h 主机
        $conn = mysqli_connect($servername, $username, $password);
        if ($conn) {
              echo "mysql successful by root !\n";
           }else{
              die("Connection failed: " . mysqli_connect_error());
           }
       ?>
       
       
       
       

Nginx访问PHP文件的File not found错误处理,两种情况
转载 2017年05月09日 14:05:27
标签:
php /
nginx
这个错误很常见,原有有下面两种几种
php-fpm找不到SCRIPT_FILENAME里执行的php文件
php-fpm不能访问所执行的php,也就是权限问题
第一种情况
更改配置文件nginx.conf 
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
替换成下面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
然后重新加载nginx配置文件 
/etc/init.d/nginx reload










#tips:如果你开启了多域名的话,可能出现你的ip只会访问某一个发布目录下的网页,因为我们在主配置文件里设置了多域名引用,那么多域名引用,你用ip去访问只能显示一个,所以我么需要设置域名解析,来帮助我们识别每个网站。
如果你只能用ip访问,就需要站是把其他网站的配置文件删掉,做个备份,只用一个测试网站的配置文件





发布一个博客


1.#切换到发布目录下
cd /html/www
rz  上传你的源码包


tar 格式
tar zxvf 源码包      解压
tar zcvf 源码包      压缩

zip 格式
unzip  源码包



#tips1:上传的是zip格式的,就需要安装yum -y install unzip 来解压
#tips2:不要忘了你的nginx配置目录要配置正确的发布目录,否则会报403错误


2.配置nginx.conf ---发布目录
cd /usr/local/nginx/conf/vhost/
ls
vim www.conf


3.安装论坛  
tips:如果输入ip地址或者域名无法跳转的的话,那就复制下面我这段地址,把其他的ip地址替换你自己的就可以了或者域名



http://10.0.1.102/upload/install/

chmod -R 777 upload/      #给一下权限,如果不给的话,目录文件权限会检查到的,安装会出问题
 
 
 
 以上是整个lnmp的搭建 到博客这里,这个位置你可以不用在第二台 第三台做,只做lnmp的搭建,网站和数据库用scp远程过去也可以的











2. 代码迁移到第二台 第三台


scp -r upload/ root@10.0.1.147:/html/www
scp -r upload/ root@10.0.1.144:/html/www
远程命令  代码目录  以root用户权限  对方发布目录

chmod +777  upload/ -R
这是代码的数据库配置文件,一般你迁移到新机器上,要给一下权限
config_global_default.php 
config_global.php



nginx -t 
nginx -s reload
/etc/init.d/php-fpm start   



http://10.0.1.144/upload/
http://10.0.1.144/upload/
http://10.0.1.147/upload/

#tips:
端口:可以被重复定义               --(listen)

域名:多个域名可设置一个端口,但域名不能重复     ---(server name)


3.数据库还原

3.1备份数据库(原机器)

mysqldump

mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -uroot -p123 -B -A >/home/d.sql  

3.2 推送备份数据库文件到新机器上
scp /home/d.sql root@10.0.1.147:/home
scp /home/d.sql root@10.0.1.144:/home


mysql -uroot -p"123"

3.3 还原数据库(新机器)
mysql -uroot -p"123"    #进入sql环境中配置
show databases;         #显示一下新机器的数据库,如果有同名的数据库要删掉
drop database ultrax;   #删除数据库命令
create database ultrax;   #创建数据库命令
use ultrax;     #进入某个具体数据库
show tables;    #显示一下数据库大小

source /home/d.sql;    #还原你备份的数据库文件,在这里还原一下就可以了





4.实现负载均衡

修改hosts 实现主机ip和域名映射


C:\Windows\System32\drivers\etc
打开hosts文件

10.0.1.146 www.it.com  假设这个是原机器的服务器ip,这时你可以把他替换到另外的服务器ip 如10.0.1.147 www.it.com  这个过程就本质实现了手动的负载均衡

10.0.1.146  www.it.com
10.0.1.147  www.it.com
10.0.1.144  www.it.com


大白话:把原来的服务器ip换成 另外一个服务器ip





5.测试






https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326023904_10.0.1.144.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326023904_10.0.1.147.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326023904_10.0.1.146.png

7.三台web连接一个数据库和数据库迁移

#步骤

场景:如果你打了三台web服务器做了一个负载均衡 ,可是如果你在web1机器上的网站发布了一个内容,但是web2 web3 这个时候是不会同步显示的,因为他们是两个数据库


解决:三台web服务器公用一个mysql数据库



环境:虚拟机

nginx版本   mysql版本   php版本
1.18.0     5.6.51      7.2.29
              
ip:10.0.1.0

网关:10.0.1.2

子网掩码:255.255.255.0

测试机器ip:

web三台
10.0.1.146    web1
10.0.1.147    web2
10.0.1.144    web3

mysql服务器:10.0.1.150


1.准备服务器--安装数据库

启动php: /etc/init.d/php-fpm start  

yum方式
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
 yum -y install mysql-community-server



systemctl start mysql
systemctl status mysql     看一下状态
systemctl start mysql.service  设置自启动

ss -tulpn |grep mysql

数据库接口 3306


为root账户设置数据库密码
[root@node-1 ~]#mysql_secure_installation  #初始化MySQL
Enter current password for root (enter for none):   <---输入现在的root密码,因为我们还没设置,直接回车
Set root password? [Y/n] Y                                    <---是否设定root密码,当然设置了,输入Y回车
New password:                                                      <---输入root密码,并回车,输入的过程中不会有任何显示
Re-enter new password:                                        <---再次输入root密码,并回车,输入的过程中不会有任何显示
Remove anonymous users? [Y/n] Y                      <---是否删除匿名用户,删除,输入Y回车
Disallow root login remotely? [Y/n] Y                     <---是否删禁止root用户远程登录,当然禁止,输入Y回车
Remove test database and access to it? [Y/n]      <---是否删除测试数据库test,看个人喜好
Reload privilege tables now? [Y/n] Y                    <---刷新权限,输入Y回车
最后出现:Thanks for using MySQL!
MySql密码设置完成,重新启动 MySQL:


tips:数据库密码一般设置就比较复杂的,在生产环境中,不过这里就不设置复杂的了,直接123


mysql -uroot -p"123"     #创建一个root账户的数据库密码


create database  wordpress;    #新建一个数据库

show databases;    #查看一下是否存在








1.1还原数据库

#备份数据库(原机器)(web10.0.1.134)

mysqldump

mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -uroot -p123 -B -A >/home/d.sql  

#推送备份数据库文件到mysql上(推送mysq服务器上)
scp /home/d.sql root@10.0.1.150:/home   #mysql


mysql -uroot -p"123"

#还原数据库(mysql服务器)

web1 (10.0.1.150)
mysql -uroot -p"123"    #进入sql环境中配置
show databases;         #显示一下新机器的数据库,如果有同名的数据库要删掉
drop database ultrax;   #删除数据库命令
create database ultrax;   #创建数据库命令
use ultrax;     #进入某个具体数据库
show tables;    #显示一下数据库大小

source /home/d.sql;    #还原你备份的数据库文件,在这里还原一下就可以了






2.修改代码配置文件(web1 -web2 -web3 集群的每个机器都要修改)
cd /html/www
cd upload/config/


vim config_global.php
// ----------------------------  CONFIG DB  ----------------------------- //
$_config['db']['1']['dbhost'] = '10.0.1.150';    #这个位置改你的mysql服务器ip
$_config['db']['1']['dbuser'] = 'dz';
$_config['db']['1']['dbpw'] = '123456';







vim config_ucenter.php

<?php


define('UC_CONNECT', 'mysql');

define('UC_DBHOST', '10.0.1.150');
define('UC_DBUSER', 'dz');
define('UC_DBPW', '123456');    



#修改好了,可以直接推送覆盖过去,或者你删除原来web2/3的网站数据库配置文件也行

cd /html/www/upload/config


web1
scp config_global.php 10.0.1.146:/html/www/upload/config/
scp config_ucenter.php 10.0.1.146:/html/www/upload/config/

web2
scp config_global.php 10.0.1.147:/html/www/upload/config/
scp config_ucenter.php 10.0.1.147:/html/www/upload/config/

web3
scp config_global.php 10.0.1.144:/html/www/upload/config/
scp config_ucenter.php 10.0.1.144:/html/www/upload/config/





3.mysql服务器--配置账号密码

mysql -uroot -p"123"
grant all on *.* to dz@"%" identified by "123456"; 

数据库账号:dz
数据库密码:123456


4.Discuz! Database Error

出现这个错误如何怎么办?
在web1机器上登录mysql服务器的数据库账号 ,发现登不上
[root@master config]# mysql -urz -p123456 -h 10.0.1.150
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'rz'@'localhost' (using password: YES)


关闭防火墙
systemctl stop firewalld

mysql -udz -p123456 -h 10.0.1.150

[root@master config]# mysql -udz -p123456 -h 10.0.1.150
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.6.51 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 



在web服务器远程登录mysql服务器测试    为什么?
如果web服务器无法远程登录mysql服务器的话,证明web和mysql还是没有打通,数据库账号密码不对,mysql里面要有主站的数据库文件,要把主站的数据库备份文件复制到mysql上进行还原,同时自己主站这边的数据库配置文件账号密码要填mysql那边的,这样才可以




4.测试
关闭所有机器的mysq服务,只留一台 mysql服务器的mysql服务
http://10.0.1.146/upload/forum.php?mod=viewthread&tid=1&extra=page%3D1

http://10.0.1.147/upload/forum.php?mod=viewthread&tid=1&extra=page%3D1

http://10.0.1.144/upload/forum.php?mod=viewthread&tid=1&extra=page%3D1












总结:
1.mysql服务器创建数据库账号和密码
2.主站备份数据库文件远程复制到mysql服务器还原
3.web123 主站 数据库账号密码连接mysql服务器
4.测试--关闭主站mysql服务 或者其他还在服务器的数据库服务  (只有mysql服务器不能关,因为就是他运行这个mysql服务,承担网站数据了)
5./etc/init.d/php-fpm start  php服务要启动 

原服务器(网站)                  集群负载均衡(分担主网站访问压力)            mysql服务器(存放主网站数据库)
10.0.1.134(主站)              10.0.1.146 (web1)                          10.0.1.150(mysql)
                              10.0.1.147(web2)
                              10.0.1.144(web3)
                  
                  
                  
数据库问题

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326044742_微信截图_20240326124651.png

测试成功

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326090316_10.0.1.146.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326090316_10.0.1.147.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326090316_10.0.1.144.png

8.nginx配置静态网站负载均衡

#步骤

负载均衡(1台)
10.0.1.134

集群web(3台)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144


mysql服务器
10.0.1.150




1.准备服务器  安装nginx

10.0.1.134


yum -y install pcre-devel  openssl-devel zlib-devel gcc

groupadd nginx
useradd -g nginx -s /sbin/nologin nginx

切换到解压后的nginx目录中执行:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz






./configure --user=nginx --group=nginx --prefix=/usr/local/nginx  --with-http_ssl_module --with-http_stub_status_module


make  

make install  

启动nginx:/usr/local/nginx/sbin/nginx
关闭nginx:/usr/local/nginx/sbin/nginx -s stop
检查nginx 是否异常:/usr/local/nginx/sbin/nginx  -t

重启nginx: nginx  -s reload





每次都需要输入路径才可以重启 检查等操作比较繁琐

用软连接定义
ln -s /usr/local/nginx/sbin/nginx /bin/nginx

这样就可以了

启动  : nginx 
停止:nginx -t stop
重启 :  nginx -s reload
检查:   nginx -t




2.准备三台web服务器正常访问
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144




2.1 编辑配置文件

cd /usr/local/nginx/conf/

vi nginx.conf

server {
        listen       80;
        server_name  localhost;    这个localhost就是域名,如果你不想用ip访问,这里可以更换一个域名吧,如www.it.com 如果你在设置域名的话,由于我们是在Windows下虚拟机环境测试,这里需要再Windows的etc/hosts/文件里做个域名解析,不然你设置的域名是打不开的

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;        #这个位置就是发布目录,如果你要重新定义发布目录,在这里修改你创建的发布目录 
            index  index.html index.htm;
        }



修改配置



server {
        listen       80;
        server_name  www.it.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /html/www;
            index  index.html index.htm;
        }



mkdir /html/www -p

cd /html/www

echo web1 > index.html


以上过程重复在web2 web3执行 ,保证这三个web服务器都能够正常访问就可以了

echo web2 > index.html
echo web3 > index.html






2.2 域名解析配置 
#tips:生产环境中一般都是在服务器上或者云服务器上做个域名解析就可以了,
不过在这里我们只能用Windows去模拟一下域名解析了


在这个目录下用notepad或者记事本打开
C:\Windows\System32\drivers\etc

在文档末尾位置,添加如下这行

10.0.1.146  www.it.com
10.0.1.147  www.1688.com
10.0.1.144  www.abc.com

#tips :域名这里是随便填的,在生产环境中,每个ip可能对应多个域名,也可能一个ip对应一个域名,不可能一个域名对应多个ip,域名唯一
#tips2:不需要启动php,防火墙也关闭





3.配置(nginx主站)负载均衡(10.0.1.134)
#tips:添加就是这两个模块

upstream        负载均衡模块
proxy_pass      反向代理模块

cd /usr/local/nginx/conf/vhost/
 vim www.conf                   #注意这里要新建一个模块配置文件,如果你是多网站域名引用,注意要修改域名引用位置,在include这个位置去修改引用位置
 
 
 
 upstream  web {
 server 10.0.1.146:80;   #添加负载均衡的web,Nginx将根据负载均衡策略将请求分发给这三个后端服务器之一
 server 10.0.1.147:80;
 server 10.0.1.144:80;
 }
 server {
       listen        80;
       server_name   10.0.1.134 www.it.com;#这里是主站的ip ,有域名就要填一下域名,没有域名就填一下主站的ip,也就是本机ip
       location  / {
    proxy_pass http://web;   #Nginx将使用proxy_pass指令将请求代理至名为web的upstream模块所定义的后端服务器组
       }


 }


nginx -t
nginx -s reload

http://10.0.1.134/

#tips:此时页面是可以正常访问的,柘林如果不行,看一下是不是防火墙没有关闭



4.重启--测试

nginx -t
nginx -s reload
不断刷新这个网页,我们之前在三个web都分别写了一个静态网页内容的页面,此时你刷新页面,可以看到不同的内容,这里我们需要不同的测试页面,就是希望帮助你理解三个不同的负载均衡web服务。轮询


http://10.0.1.134/


 总结:
 1.主站创建上游服务组 成员包括web1 2 3
 2.主站配置一个反向代理--实现--用户只要请求我,我就把请求以轮询的方式给下面后端服务器,以此来分担我的压力
 
 
 
 搭建了一个简单的反向代理服务,用户访问 10.0.1.134 或 www.it.com 时,请求会被均衡地分发给 10.0.1.146:80、10.0.1.147:80 和 10.0.1.144:80 这三个后端服务器中的一个处理。通过这种方式,不仅可以隐藏后端服务器的细节,还可以实现负载均衡和灵活的请求转发。
 
 





效果图如下
原先web正常访问页面

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/o_240326102753_web测试1.png

实现后的不断刷新访问的页面(轮询)

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102753_web测试2.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102753_web测试1.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102752_web测试3.png

9.负载均衡故障排查(重点)



#步骤





1.检查后端服务器--是否正常
输入后端ip地址,看页面是否可以正常访问

curl 10.0.1.146
curl 10.0.1.147
curl 10.0.1.144

2.nginx负载均衡配置问题

cd /usr/lcoal/nginx/conf/vhost/
vim www.conf


 upstream  web {
 server 10.0.1.146:80;   #添加负载均衡的web,Nginx将根据负载均衡策略将请求分发给这三个后端服务器之一
 server 10.0.1.147:80;
 server 10.0.1.144:80;
 }
 server {
       listen        80;
       server_name   10.0.1.134 www.it.com;  #这里是主站的ip ,有域名就要填一下域名,没有域名就填一下主站的ip,也就是本机ip
       location  / {
    proxy_pass http://web;   #Nginx将使用proxy_pass指令将请求代理至名为web的upstream模块所定义的后端服务器组
       }


 }
 


3.防火墙问题   多域名引用位置问题    日志



10.nginx负载均衡模块和调度功能配置 参数




upstream

ngx_http_upstream_moudle
实现不同的调度功能


作用:
一.轮询请求(平均)
二.权重分配请求 (优先级大小--能力强就多干点)

    weight=  主要是加这个模块
 
 举例:
    server 10.0.1.146:80 weight=2;  #每收到两次请求,其他服务器收到一次
    server 10.0.1.147:80 weight=3;  #每收到三次请求,其他服务器收到一次
    server 10.0.1.144:80 weight=4;  #每收到四次请求,其他服务器收到一次
    
    
    
    
    
    
   

#步骤

1.配置主站的配置文件(加权重模块)
cd /usr/local/nginx/conf/vhost/
vi www.conf


upstream web {
    server 10.0.1.146:80 weight=2;
    server 10.0.1.147:80 weight=3;
    server 10.0.1.144:80 weight=4;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
    }
}

nginx -t
nginx -s reload

2.测试--

http://10.0.1.134/




upstream web {
    server 10.0.1.146:80 weight=2;  #每收到两次请求,其他服务器收到一次
    server 10.0.1.147:80 weight=3;  #每收到三次请求,其他服务器收到一次
    server 10.0.1.144:80 weight=4;  #每收到四次请求,其他服务器收到一次
}

因此 ,谁的weight值大,谁承担的请求压力就更多


    
    
    
    
三.实现热备功能


#步骤

1.配置主站的配置文件(加备胎)
upstream web {
    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 backup;  #当其他web1 2 都宕机了,这时就会启动这个备胎
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
    }
}

nginx -t
nginx -s reload




2.测试

模拟其他两台web都宕机了
web1  nginx -s stop
web2  nginx -s stop


http://10.0.1.134/
curl 10.0.1.134


[root@master vhost]# curl 10.0.1.134
web3
[root@master vhost]# curl 10.0.1.134
web3
[root@master vhost]# curl 10.0.1.134
web3
[root@master vhost]# curl 10.0.1.134
web3
[root@master vhost]# curl 10.0.1.134
web3
[root@master vhost]# curl 10.0.1.134
web3

结果:此时你会发现,不断访问,但是只有一个web3在提供用户的请求,这就是热备
当其他机器都死掉了,最后的备份就会起来








11.均衡健康检查参数配置

定义失败参数

  max_fails=     失败的次数
 fails_timeout=10s   给服务器失败时间机会




#步骤
1.配置主站的配置文件(加失败参数)

upstream web {
    server 10.0.1.146:80 max_fails=5 ;#如请求失败次数为五次,就不再给你
    server 10.0.1.147:80 max_fails=5 ;
    server 10.0.1.144:80 max_fails=5 ;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
    }
}

nginx -t
nginx -s reload


这个就不测试了




2.定义失败时间--恢复



upstream web {
    server 10.0.1.146:80 max_fails=5 fail_timeout=10s;#如请求失败次数为五次,就不再给你,但是如果10s后会再给你发请求,如果你恢复了,就处理,没恢复,照旧
    server 10.0.1.147:80 max_fails=5 fail_timeout=10s;
    server 10.0.1.144:80 max_fails=5 fail_timeout=10s;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
    }
}

nginx -t
nginx -s reload



3.测试

此时web2 3已经停止
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web1


此时再把web2恢复
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web1
[root@master vhost]# curl 10.0.1.134
web2



12.面试题:nginx 均衡有啥调度算法 谈谈




1.轮询算法
平均的算法


2.权重算法

能力强就多干点

3.ip_hash算法  (场景:网站会出反复登录失败   会话保持)
捆绑
如果你不使用ip_hash算法,可以使用redis作缓存来解决会话保持的问题








#ip_hash配置步骤

upstream web {
ip_hash;
    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 ;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
    }
}

nginx -t
nginx -s reload


curl 10.0.1.134



[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web2
[root@master vhost]# curl 10.0.1.134
web2






总计:ip_hash功能,根据用户的IP地址的哈希值来决定将请求分发到后端服务器池中的哪一台服务器上。这样,来自同一IP地址的连续请求将被绑定到同一台后端服务器上,从而确保了会话的一致性。

13.nginx均衡3台动态网站(重点)

#步骤

动态网站类别
php

java


负载均衡(1台)
10.0.1.134

集群web(3台--有论坛)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144


mysql服务器
10.0.1.150







一.准备三台web (状态:可以正常访问论坛)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144

http://10.0.1.146/upload/    web1
http://10.0.1.147/upload/    web2
http://10.0.1.144/upload/    web3

启动nginx
nginx
启动php
 /etc/init.d/php-fpm start  


二.nginx配置

cd /usr/local/nginx/conf/vhost
vim www.conf

upstream web {

    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 ;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;

    location  / {
        proxy_pass http://web;
proxy_set_header Host $host;
    }
}


nginx -t
nginx -s reload



测试
cd /usr/local/nginx/logs/
tail -100 access.log



#参数详解:

这段Nginx配置的主要目的是实现负载均衡和反向代理功能。下面逐个参数进行解释,并用通俗语言概括:

1. 10.0.1.150upstream web {10.0.1.150
   - upstream 是Nginx配置中的一个模块,用于定义一组后端服务器(集群)。
   - web 是这个集群的名字,方便在其他地方引用。
   - 下面列出的 server 代表集群内的服务器,这里列出了三台:
     - server 10.0.1.146:80; 表示集群中有一台服务器,IP地址为10.0.1.146,端口为80。
     - 同理,server 10.0.1.147:80; 和 server 10.0.1.144:80; 分别代表另外两台服务器。

通俗理解:就像组建了一支由三名队员组成的篮球队,名叫“web队”,队员们都有自己的球衣号码(IP地址和端口),准备接受比赛任务(处理请求)。

2. 10.0.1.150server {10.0.1.150
   - listen 80; 表示这个Nginx服务器监听80端口,等待客户端的HTTP请求。
   - server_name 10.0.1.134 www.it.com; 定义了该服务器服务的域名/IP地址,即当用户访问 10.0.1.134 或者 www.it.com 时,Nginx将处理这些请求。

通俗理解:这个Nginx服务器是个门卫,它守在大门(80端口)上,无论是有人敲门说找“10.0.1.134”还是“www.it.com”,它都会负责接待。

3. 10.0.1.150location / {10.0.1.150
   - location / 指定匹配所有以根路径("/")开头的请求。
   - proxy_pass http://web; 说明当收到匹配请求时,Nginx将请求转发给之前定义的名为“web”的后端服务器集群。
   - proxy_set_header Host $host; 设置代理转发时,将请求头中的 Host 字段保持不变,即保留原请求的域名或IP地址。

通俗理解:当有访客(请求)来到大厅("/"),门卫(Nginx)并不会亲自服务,而是根据来访者的名片(请求头)将其转交给“web队”的某位队员(后端服务器)处理,并且告诉队员,这位访客是来找谁的(保持原有的Host信息)。这样就可以实现将用户的请求分散到多台服务器上处理,从而达到负载均衡的目的。



参数解释:
proxy_set_header Host $host;

作用 请求 header中字段会放到转发请求里面

不加 nginx转发请求头时候 不会用host字段  而 服务器就是靠这个host





补充:不加proxy_set_header Host $host; 和加proxy_set_header Host $host;的区别(用日志分别)



cd /usr/local/nginx/logs/
tail -10 access.log

[root@master logs]# tail -10 access.log 
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/misc.php?mod=patch&action=ipnotice&_r=0.26641092183016757&inajax=1&ajaxtarget=ip_notice HTTP/1.1" 200 76 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/ HTTP/1.1" 200 14983 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/misc.php?mod=patch&action=ipnotice&_r=0.5472891656053496&inajax=1&ajaxtarget=ip_notice HTTP/1.1" 200 76 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:05 +0800] "GET /upload/ HTTP/1.1" 200 15034 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:07 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:10 +0800] "GET /upload/ HTTP/1.1" 200 15019 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:13 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:16 +0800] "GET /upload/ HTTP/1.1" 200 15034 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:18 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"







未加参数前

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326130345_nginx10.0.1.134.png

加参数后

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326130747_nginx-10.0.1.134.png

14.均衡这样报错解决方法

故障如图

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326130345_nginx10.0.1.134.png

F12分析请求失败页面

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326133338_10.0.1.134-F12.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326134716_10.0.1.134-header-sb.png

F12分析请求成功页面

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326134145_nginx-10.0.1.134cg.png

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326134412_10.0.1.134F12header.png



参数解释:
proxy_set_header Host $host;

作用 请求 header中字段会放到转发请求里面

不加 nginx转发请求头时候 不会用host字段  而 服务器就是靠这个host


#自己的解释:当Nginx把客户端的请求转发给后端服务器时,记得把这个请求原本带有的‘Host’信息一并带上。”

就好比你是一位快递员(nginx主站),客户(用户)要求你将一封信送到另一个地方。信封上原本写着收件人的详细地址(即$host,代表客户端请求的原始网址信息)。为了让最终收件人(后台服务器web1 web2 web3)能准确知道是谁寄来的信,你在转交这封信时特意强调:“不要改变信封上的收件人地址信息。

”这就是proxy_set_header Host $host;在Nginx配置中的作用,确保了后端服务器能够看到原始客户端请求的完整网址信息







#详细语句解释:

1. 10.0.1.150upstream web {10.0.1.150
   - upstream 是Nginx配置中的一个模块,用于定义一组后端服务器(集群)。
   - web 是这个集群的名字,方便在其他地方引用。
   - 下面列出的 server 代表集群内的服务器,这里列出了三台:
     - server 10.0.1.146:80; 表示集群中有一台服务器,IP地址为10.0.1.146,端口为80。
     - 同理,server 10.0.1.147:80; 和 server 10.0.1.144:80; 分别代表另外两台服务器。

通俗理解:就像组建了一支由三名队员组成的篮球队,名叫“web队”,队员们都有自己的球衣号码(IP地址和端口),准备接受比赛任务(处理请求)。

2. 10.0.1.150server {10.0.1.150
   - listen 80; 表示这个Nginx服务器监听80端口,等待客户端的HTTP请求。
   - server_name 10.0.1.134 www.it.com; 定义了该服务器服务的域名/IP地址,即当用户访问 10.0.1.134 或者 www.it.com 时,Nginx将处理这些请求。

通俗理解:这个Nginx服务器是个门卫,它守在大门(80端口)上,无论是有人敲门说找“10.0.1.134”还是“www.it.com”,它都会负责接待。

3. 10.0.1.150location / {10.0.1.150
   - location / 指定匹配所有以根路径("/")开头的请求。
   - proxy_pass http://web; 说明当收到匹配请求时,Nginx将请求转发给之前定义的名为“web”的后端服务器集群。
   - proxy_set_header Host $host; 设置代理转发时,将请求头中的 Host 字段保持不变,即保留原请求的域名或IP地址。

通俗理解:当有访客(请求)来到大厅("/"),门卫(Nginx)并不会亲自服务,而是根据来访者的名片(请求头)将其转交给“web队”的某位队员(后端服务器)处理,并且告诉队员,这位访客是来找谁的(保持原有的Host信息)。这样就可以实现将用户的请求分散到多台服务器上处理,从而达到负载均衡的目的。




















15.配置nginx动静分离--生产环境常用(重点)

动静分离:
动态请求      (后端服务器处理--如Tomcat)
php  jsp

静态请求     (nginx处理)

html jpg  gif css



动静分离好处:减轻服务器压力 提高访问速度




负载均衡(1台)
10.0.1.134

集群web(3台)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144


mysql服务器
10.0.1.150





#步骤


#一.配置主站nginx配置

cd /usr/local/nginx/conf/
vim www.conf


第一版配置
upstream web {

    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 ;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;
location / {
             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_buffering off;
proxy_pass      http://web;
}

location ~ .*\.(html|gif|jpg|jpeg|png|js|css|bmp|bmp|ico|htm)$
   {     root         /mnt/web;
}        
location ~ .*\.(php|jsp|cgi)$ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host  $http_host;
            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header Connection "";
            proxy_pass      http://web;
        }
}





#tips:配置注解

#1. Upstream 部分:

plaintext
upstream web {
    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 ;
}


通俗解释:这部分定义了一个名为“web”的后端服务器组,其中包括三个服务器的IP地址和端口。当你访问Nginx服务器时,它会根据配置将请求转发给这个服务器组中的一个成员。这就像是一个团队,有三个成员(10.0.1.146、10.0.1.147、10.0.1.144),Nginx作为调度员,会选择其中一个成员处理实际的任务(处理请求)。

#2. Server 部分:

plaintext
server {
    listen        80;
    server_name   10.0.1.134 www.it.com;


通俗解释:这部分定义了一个Nginx服务器实例,它监听80端口上的HTTP请求,并且服务于两个域名:10.0.1.134和www.it.com。任何发往这两个域名的请求都将由这个Nginx服务器处理。

#3. 第一个Location 部分:

plaintext
location / {
    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_buffering off;
    proxy_pass      http://web;
}


通俗解释:对于所有非特定类型的请求(即除了.html, .gif, .jpg 等静态文件和.php, .jsp, .cgi 等动态脚本之外的请求),Nginx将会执行以下操作:
   - 设置请求头信息:将客户端的真实IP地址传给后端服务器(X-Real-IP 和 X-Forwarded-For),并将当前请求的主机名(Host)也一同传过去。
   - 关闭代理缓冲(proxy_buffering off),这意味着Nginx不会预先缓存后端服务器的响应。
   - 最后,将请求转发至之前定义的“web”后端服务器组。

#4. 静态资源Location 部分:

plaintext
location ~ .*\.(html|gif|jpg|jpeg|png|js|css|bmp|bmp|ico|htm)$ {
    root         /mnt/web;
}


通俗解释:对于以.html, .gif, .jpg, .jpeg, .png, .js, .css, .bmp, .bmp, .ico, .htm 结尾的请求(通常是静态资源文件),Nginx将直接从 /mnt/web 目录下查找并返回相应的文件。

#5. 动态脚本Location 部分:

plaintext
location ~ .*\.(php|jsp|cgi)$ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host  $http_host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header Connection "";
    proxy_pass      http://web;
}


通俗解释:对于以.php, .jsp, .cgi 结尾的请求(通常是指动态脚本文件),Nginx也会设置请求头信息,然后将请求转发至“web”后端服务器组。在这个过程中,它同样会告知后端服务器客户端的真实IP地址以及请求的主机名等信息,并且特别设置了Connection头为空字符串,可能用于保持长连接或清除连接相关的头信息。







#二.此时,你发现网站还是无法加载图片之类的东西,为什么?
1.我们下面是配置文件吧图片之类的访问目录放在了/mnt/web 但是我们下面是没有这个目录的
2.新建目录,你会发现还是不能访问,因为我们/mnt/web 是没有任何图片的

解决思路
新建/mnt/web
把网站源码目录整体,从web集群三台中的任意一台远程拷贝到主站上


#新建目录
cd /mnt
mkdir web
cd web/


#打开集群的三台服务器中的任意一台

cd /html/www/
scp  -r upload/ 10.0.1.134:/mnt/web











#总结:nginx+php/tomcat动静分离架构配置

为什么要动静分离?
减轻服务器压力 提高访问速度

实现效果:nginx处理静态页面,php处理动态页面



#nginx动静分离配置文件模版

 upstream web {

    server 10.0.1.146:80 ;
    server 10.0.1.147:80 ;
    server 10.0.1.144:80 ;
}

server {
    listen        80;
    server_name   10.0.1.134 www.it.com;
   location ~ .*\.(html|gif|jpg|jpeg|png|js|css|bmp|bmp|ico|htm)$
   {     root         /mnt/web;
}        
location / {
             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_buffering off;
proxy_pass      http://web;
}


location ~ .*\.(php|jsp|cgi)$ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host  $http_host;
            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header Connection "";
            proxy_pass      http://web;
        }
}








效果图如下
第一版配置效果图

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326140739_第一版.png

动静分离效果图

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240326141856_动静分离cg.png

16.存储服务器备份实战演示


负载均衡(1台)
10.0.1.134

集群web(3台)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
#必开:/etc/init.d/php-fpm start 所有lnmp服务都要启动

mysql服务器
10.0.1.150
#必开:只启动数据库


rsync+nfs服务器
10.0.1.151




一.部署nfs+rsync服务端


nfs+rsync 10.0.1.151

服务端
yum install -y nfs-utils
mkdir /data 
vim /etc/exports
/data 10.0.1.0/24(rw,async,no_root_squash,no_all_squash)
systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs

客户机执行(主站)
1、安装nfs
yum install -y nfs-utils
systemctl enable rpcbind.service


客户端不需要启动服务(主站服务器挂载共享)

2、检查 NFS 服务器端是否有目录共享
showmount -e 10.0.1.151
3、使用 mount 挂载A服务器端的目录/data到客户端B的目录/backup下
 mkdir /backup 
 mount -t nfs 10.0.1.151:/data /backup


4.设置永久挂载
此时还可以将nfs目录永久挂载在/etc/fstab下
vim /etc/fstab

10.0.1.151:/data   /backup    nfs     auto,nofail,noatime,bg,intr,tcp,actimeo=1800 0 0





rsync  10.0.1.151

服务端部署(备份服务器):rsync
     第一步:下载安装软件
	  yum install -y rsync
	 第二步:编写配置文件
	  vim /etc/rsyncd.conf
	 uid=rsync                               
     gid=rsync                               
     port=873                                
     fake super = yes                        
     use chroot = no                         
     max connections= 200                    
     timeout = 300                           
     pid file = /var/run/rsyncd.pid          
     lock file = /var/run/rsync.lock         
     log file = /var/log/rsyncd.log          
     ignore errors                           
     read only = false                       
     list = false                            
     hosts allow = 10.0.1.0/24             
     #hosts deny =             
     auth users = rsync_backup               
     secrets file = /etc/rsync.password      
     [backup]                                
     comment =" welcome to RSYNC backup"
     path = /backup                          
     第三步:创建rsync服务虚拟用户
	useradd rsync -M -s /sbin/nologin
	 第四步:创建rsync服务的认证密码文件并修改权限
	 echo "rsync_backup:123456">/etc/rsync.password
	 chmod 600 /etc/rsync.password 
	 第五步:创建备份文件所需的目录并修改用户文件的属主和属组
	 mkdir /backup
	 chown rsync.rsync /backup -R
     第六步:启动备份rsync服务
	 systemctl start rsyncd
     systemctl enable rsyncd


客户端部署(网站服务器):rsync  配置文件不用改默认即可
     第一步:下载安装软件
	 yum install -y rsync
	 第二步:创建一个密码文件
	 echo "123456" >/etc/rsync.password
	 chmod 600 /etc/rsync.password
   
   
   
   
   #下面这个步骤,在主站服务器上操作(此时两边是互通的,)
   第三步:测试用免交互方式同步文件
主站服务器:10.0.1.134
rsync+nfs服务器:10.0.1.151

把自己/backup目录下的文件拷贝到rsync服务器上的/backup目录下
	 rsync -avz /backup rsync_backup@10.0.1.151::backup --password-file=/etc/rsync.password
	 
同时也可以在rsync服务器上操作
rsync -avz /backup/ 10.0.1.134:/backup 
	
    
    
    第四步:(需求)测试
    
  

  


需求:cront 如何把/html/www 的文件每天晚上二点压缩备份一次 同时把备份文件放到这个共享/backup下?结合rsync命令把主站备份文件备份到rsync+nfs服务器上

rsync+cront+nfs




1. 创建一个备份脚本,例如 `backup_html.sh`:
cd /usr/local/src
vim backup_html.sh


#!/bin/bash

# 备份本地html文件并压缩
BACKUP_SOURCE_DIR="/html/www"
BACKUP_DEST_DIR="/backup"
TODAY_DATE=$(date +%Y%m%d)
BACKUP_FILENAME="${BACKUP_DEST_DIR}/${TODAY_DATE}-www-backup.tar.gz"

tar -czf "${BACKUP_FILENAME}" -C "${BACKUP_SOURCE_DIR}" .

# 同步备份文件到远程服务器
REMOTE_USER="rsync_backup"
REMOTE_HOST="10.0.1.151"
REMOTE_MODULE="backup"
PASSWORD_FILE="/etc/rsync.password"

# 同步备份文件到远程服务器的指定目录下
rsync -avz "${BACKUP_FILENAME}" "${REMOTE_USER}@${REMOTE_HOST}::${REMOTE_MODULE}" --password-file="${PASSWORD_FILE}"

# 清理临时变量和可能存在的旧备份(可根据需要调整,例如只保留一定数量的最新备份)
rm -f "${BACKUP_FILENAME}"

# 输出执行结果并检查错误
if [ $? -eq 0 ]; then
  echo "Backup and synchronization completed successfully."
else
  echo "Backup or synchronization failed."
fi




2. 给脚本增加执行权限:


chmod +x backup_html.sh


3. 添加到crontab定时任务中,以便在每天晚上2点执行:


crontab -e


然后在编辑器中添加以下行:


0 2 * * * /bin/bash /usr/local/src/backup_html.sh >/dev/null 2>&1





posted @ 2024-03-27 22:30  三思博客  阅读(7)  评论(0编辑  收藏  举报