2025保姆级安装Nginx做负载均衡 最佳实践文档

目录

一、首先下载 Nginx 

首先拉取安装包:

安装 wget:

然后 检查网络连接和 DNS 配置

1.测试网络连通性:

2.手动配置 Yum 源

3. 先清理 Yum 缓存 并生成新缓存:

4.  重新生成新缓存: 

5. 之后再尝试安装 wget:

6. 使用 wget  命令来下载 Nginx 的源代码包了。

二 、安装 Nginx  

1.安装准备

1.检查依赖:

2. 解压文件:

3. Nginx 配置与编译

1. 配置:

2. 编译: 

3.安装 Nginx :

4. 创建 nginx 缓存目录

三、启动Nginx与配置Nginx 环境 

1.启动 Nginx:

2 .配置 Nginx:

3. nginx.conf  配置文件如下:

4. 检查配置文件语法是否正确

解决 nginx 路径 方法一 :

在执行 nginx 相关命令时,使用其绝对路径。

解决 nginx 路径 方法二 :

 将 nginx 可执行文件路径添加到 PATH 环境变量中

1. 编辑 .bashrc 文件

2. 在文件末尾添加以下行,将 /usr/local/nginx/sbin/ 目录添加到 PATH 环境变量中:

四 、访问 Nginx 跳转到tmocat :

1. 首先启动 tmocat

2.开放 防火墙  Nginx 监听的 80 端口 和 Tomcat 监听的 8080 端口

 重新进行配置 nginx.conf 文件 后:

OK 输入本机的地址 192.168.2.129  见证奇迹:

五、接下来 该实现  Nginx集群了 ~

一、主服务器安装keepalived

1.  首先给主服务器安装 keepalived

2. #进入keepalived配置文件目录

3. #修改配置文件

4. keepalived.conf  配置如下: 

 5. 继续配置 check_nginx.sh 文件 :

二、 备用 服务器安装keepalived

3. #修改备服务器 配置文件

4. 备服务器 check_nginx.sh 文件:

三、 启动keepalived

1. 启动主服务器 keepalived 服务:

2. 启动备服务器 keepalived 服务

3. 解决“脑裂”问题

① 定位问题

② 解决方法

1. #开放firewall防火墙组播通信

2.#刷新防火墙,使配置生效

4. 修改 direct.xml 文件:

5.再次尝试重新加载防火墙规则:

6.查看备服务器 :(192.168.2.129)

7. 主服务器 查看网卡信息:

8. 备服务器 查看网卡信息:​编辑

六 、测试Nginx主备切换 :

启动主备两台服务器

我要睡觉了  明天在写了 .......


环境:

首先我使用的是 CentOS 7 版本

安装的 nginx版本是 1.26.3 

一、首先下载 Nginx 

首先拉取安装包:

wget http://nginx.org/download/nginx-1.26.3.tar.gz

出现 “-bash: wget: 未找到命令” 是因为系统中未安装 wget 工具,以下是在 CentOS 系统和 Ubuntu 系统上安装 wget 的方法:

CentOS 系统

  • CentOS 7 及更早版本:执行sudo yum update更新软件包列表,然后使用sudo yum install   wget命令安装 wget。

安装 wget:

sudo yum update

 这个错误提示表明系统在尝试获取软件包列表时,无法解析 mirrorlist.centos.org 这个域名,也就无法找到 有效的镜像源地址 来下载软件包信息,导致 yum 操作失败。以下是一些可以尝试解决该问题的方法:

然后 检查网络连接和 DNS 配置

1.测试网络连通性

使用 ping 命令测试与外部网络的连接,例如 ping www.baidu.com 或 ping 8.8.8.8。如果 ping 不通,说明网络连接存在问题,你需要检查网络线缆、路由器设置、网络配置等,确保网络连接正常。

 ping www.baidu.com

 没有问题就 ctrl+c 停止

2.手动配置 Yum 源

编辑 CentOS-Base.repo 文件 默认位置为  /etc/yum.repos.d/CentOS-Base.repo

直接手动进行编辑:

sudo vi /etc/yum.repos.d/CentOS-Base.repo

将文件中的 baseurl 地址修改为国内的镜像源地址,例如阿里云的镜像源(适用于 CentOS 7):

删除 [base] 、[updates] [extras]下的配置

修改 配置如下:

[base] name=CentOS-$releasever - Base baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$releasever - Updates baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-$releasever - Extras baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

 然后按 esc 键 在输入 :wq  保存并退出编辑器。

3. 先清理 Yum 缓存 并生成新缓存

 sudo yum clean all 

4.  重新生成新缓存 

  sudo yum makecache

5. 之后再尝试安装 wget

sudo yum install wget

通过以上步骤,应该能够解决无法解析镜像源地址的问题,并成功安装 wget

安装完成后,就可以

6. 使用 wget  命令来下载 Nginx 的源代码包了。

wget http://nginx.org/download/nginx-1.26.3.tar.gz

接下来 就是安装 Nginx 了


二 、安装 Nginx  

1.安装准备

1.检查依赖

Nginx 通常依赖gccpcrezlibopenssl等库的开发文件。确保系统已经安装了这些依赖项,如果没有,可以使用以下命令安装:

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

依赖安装完成:

2. 解压文件

root目录下,使用以下命令解压下载的nginx-1.26.3.tar.gz文件:

tar -zxvf nginx-1.26.3.tar.gz

然后 进入解压目录

解压完成后,进入解压后的nginx-1.26.3目录:

cd nginx-1.26.3

3. Nginx 配置与编译

1. 配置

执行configure脚本进行配置,可根据需要添加参数,例如指定安装路径启用模块等。以下是一个基本的配置命令:

./configure --prefix=/usr/local/nginx --with-http_ssl_module

2. 编译: 

配置完成后,使用make命令进行编译:

make

看到这个基本就  编译成功 了

3.安装 Nginx 

编译成功后,使用make install命令将 Nginx 安装到指定的目录 :

(在上述配置中为  /usr/local/nginx ):

 make install

4. 创建 nginx 缓存目录

使用以下命令手动创建 /dev/shm/nginx 目录: 

sudo mkdir -p /dev/shm/nginx

三、启动Nginx与配置Nginx 环境 

1.启动 Nginx

安装完成后,可以进入 Nginx 的安装目录sbin下,执行启动命令:

首先切换到Nginx的 安装目录 : 这里可以换成你自己的安装地址:

cd /usr/local/nginx/sbin

执行Nginx 启动命令 :    ./nginx

2 .配置 Nginx

Nginx 的 主要配置文件 位于 /usr/local/nginx/conf 目录下的 nginx.conf。可以根据实际需求编辑该文件,例如修改监听端口、添加虚拟主机等。以下是一个简单的修改监听端口的示例,打开nginx.conf文件:

cd  /usr/local/nginx/conf   然后    vi nginx.conf

或者直接使用 vi /usr/local/nginx/conf/nginx.conf 都能进入配置文件的修改。

首先 找到server块中的listen指令,将其修改为你需要的端口,例如8080

server {

    listen       8080;

    server_name  localhost;

   ...}

3. nginx.conf  配置文件如下:

user nobody nobody;
worker_processes 2;
worker_cpu_affinity 01 10;
error_log logs/error.log info;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections 65535;
}

http {
    include mime.types;
    default_type application/octet-stream;

    map $status $log_level {
        ~^[45]  ERROR;
        default INFO;
    }

    log_format main '[$time_zh_ms] $log_level $remote_user $remote_addr - "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_x_forwarded_for - $request_time $upstream_response_time $upstream_addr $upstream_status';
    access_log logs/access.log main;
    error_log logs/error.log;

    sendfile on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    client_max_body_size 10m;
    client_body_buffer_size 128k;

    proxy_connect_timeout 65;
    proxy_send_timeout 65;
    proxy_read_timeout 65;
    proxy_buffer_size 64k;
    proxy_buffers 32 32k;
    proxy_busy_buffers_size 128k;
    proxy_redirect off;
    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_cache_key '$host:$server_port$request_uri';
    proxy_temp_file_write_size 64k;
    proxy_temp_path /dev/shm/nginx/proxy_temp 1 2;
    proxy_cache_path /dev/shm/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=1g;
    proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json application/javascript application/xhtml+xml application/xml image/svg+xml;
    gzip_vary on;

    upstream pool.source {
        server 127.0.0.1:6000;
    }

    upstream pool.tomcat0 {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name localhost 127.0.0.1 192.168.2.129;
        charset utf-8;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
            set $time_zh "$1-$2-$3 $4:$5:$6";
        }
        if ($msec ~ "(\d+)\.(\d+)") {
            set $time_zh_ms $time_zh.$2;
        }

        location ~* ^/source/\S*$ {
            proxy_cache cache_one;
            proxy_cache_valid 200 304 302 1d;
            proxy_cache_valid any 1m;
            proxy_cache_key '$host:$server_port$request_uri';
            add_header X-Cache '$upstream_cache_status from $host';
            proxy_pass http://pool.source;
            expires 1d;
        }

        location ^~ /api {
            # 取消注释并配置 CORS 和 upstream
            # proxy_pass http://pool.erp.api;
        }

        location = /NginxStatus/ {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            deny all;
        }

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location / {
            index index;
            proxy_pass http://pool.tomcat0;
        }

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    server {
        listen 6000;
        server_name localhost 127.0.0.1;

        location ~* ^/source/\S*$ {
            root /data;
            expires 1d;
        }
    }

    #include /usr/local/nginx/conf/vhosts/*.conf;
}

4. 检查配置文件语法是否正确

修改完成后,记得使用 nginx -t 命令 检查配置文件语法是否正确,然后使用 nginx -s reload 命令重新加载配置使修改生效。

nginx -t 

解决 nginx 路径 方法一 

使用绝对路径执行 nginx 命令

在执行 nginx 相关命令时,使用其绝对路径。

例如:

/usr/local/nginx/sbin/nginx -t

这将直接指定 nginx 可执行文件的位置,从而避免系统找不到命令的问题。

解决 nginx 路径 方法二 
 将 nginx 可执行文件路径添加到 PATH 环境变量中
1. 编辑 .bashrc 文件

vi ~/.bashrc

2. 在文件末尾添加以下行,将 /usr/local/nginx/sbin/ 目录添加到 PATH 环境变量中:

export PATH=$PATH:/usr/local/nginx/sbin/

按esc  :qw 回车  保存并退出编辑器。

然后执行以下命令使配置生效:  source ~/.bashrc

这样,以后在任何目录下都可以直接使用 nginx 命令了,例如:

 nginx -t

Nginx 安装也完成了   接下来完成 访问 Nginx 跳转到tmocat : 


四 、访问 Nginx 跳转到tmocat :

1. 首先启动 tmocat

ps -ef | grep tomcat

查看tomcat 是否已经启动:

这就是没有启动tomcat

找到 tomcat 的安装路径 进行启动

cd /data/tomcat-8080/bin

首先 执行启动 tomcat:  ./startup.sh

然后 查看tmocat 进程:   ps -ef | grep tomcat  

2.开放 防火墙  Nginx 监听的 80 端口 和 Tomcat 监听的 8080 端口

确保防火墙允许外部访问 Nginx 监听的 80 端口和 Tomcat 监听的 8080 端口。在 CentOS 系统上,如果你使用的是 firewalld 防火墙,可以使用以下命令开放端口

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

sudo firewall-cmd --reload

 输入 192.168.2.129

 没有出现 tmocat ???

这可能是配置文件配置错了  重新修改 nginx.conf 文件

 重新进行配置 nginx.conf 文件 后:

让新的配置生效 :  source ~/.bashrc

先检查配置文件的语法是否错误: nginx -t

查看 tomcat是否运行  ps -ef | grep tomcat

查看 Nginx 是否运行 :ps -ef | grep nginx

停止 Nginx 服务 :  /usr/local/nginx/sbin/nginx -s stop

启动 Nginx 服务  /usr/local/nginx/sbin/nginx

OK 输入本机的地址 192.168.2.129  见证奇迹:

五、接下来 该实现  Nginx集群了 ~

注: 我现在有 192.168.2.129 和 192.168.2.128 两台服务器 现在我要实现nginx集群 以 192.168.2.128为主服务器 192.168.2.129为备服务器 192.168.2.130 为虚拟端口

一、主服务器安装keepalived

1.  首先给主服务器安装 keepalived

进入Nginx主服务器(192.168.2.128)使用yum安装 keepalived

#yum安装keepalived(默认安装位置是:/etc/keepalived)

yum -y install keepalived

2. #进入keepalived配置文件目录

cd /etc/keepalived/

进入 keepalived 配置文件目录后修改配置:

3. #修改配置文件

vi keepalived.conf

4. keepalived.conf  配置如下: 

keepalived.conf 主服务器节点配置如下:

! Configuration File for keepalived
global_defs {
    router_id lvs_nginx_01  # 集群节点的名称,标记为lvs_nginx_01
    vrrp_gna_interval 0
}
# 加入周期性检测Nginx服务脚本的相关配置
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 心跳执行的脚本,检测Nginx是否启动
    interval 2  # 检测脚本执行的间隔,单位是秒
}
vrrp_instance VI_1 {
    state MASTER  # 指定当前节点为MASTER节点,只能有一个MASTER,其余只能是BACKUP
    interface ens33  # 绑定此虚拟路由使用的网卡的名称,使用ifconfig或者ip addr查看
    virtual_router_id 991  # 指定虚拟路由id,虚拟路由的唯一标识,范围是0 - 255,master和backup节点需要指定一样的,相同id为一组
    priority 200  # 指定当前结点的优先级,master节点要大于backup节点
    advert_int 1  # 指定发送VRRP通告的间隔,单位是秒
    authentication {  # 内网中匹配配对的,同一组保持一致即可
        auth_type PASS
        auth_pass bobo
    }
    virtual_ipaddress {  # 指定自定义虚拟IP,可以多个
        192.168.2.130
    }
    # 添加跟踪(执行脚本)
    track_script {
        check_nginx
    }
}

 5. 继续配置 check_nginx.sh 文件 :

vi check_nginx.sh

#检测Nginx是否启动了 
A=`ps -C nginx --no-header | wc -l` 
if [ $A -eq 0 ];then #如果Nginx没有启动就启动 
/usr/local/nginx/sbin/nginx #重启Nginx,也可以使直接监听应用服务 
if [ $A -eq 0 ];then #Nginx重启失败,则停掉keepalived服务,进行VIP转移 
killall keepalived 
fi 
Fi

 

二、 备用 服务器安装keepalived

12步如上 

3. #修改备服务器 配置文件

vi keepalived.conf

! Configuration File for keepalived

global_defs {
    router_id lvs_nginx_02  # 集群节点的名称,标记为lvs_nginx_02
    vrrp_gna_interval 0
}

# 加入周期性检测Nginx服务脚本的相关配置
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 心跳执行的脚本,检测Nginx是否启动
    interval 2  # 检测脚本执行的间隔,单位是秒
}

vrrp_instance VI_1 {
    state BACKUP  # 指定当前节点为BACKUP节点
    interface ens33  # 绑定此虚拟路由使用的网卡的名称,使用ifconfig或者ip addr查看
    virtual_router_id 9911  # 指定虚拟路由id,和主节点保持一致
    priority 100  # 指定当前结点的优先级,要小于主节点
    advert_int 1  # 指定发送VRRP通告的间隔,单位是秒
    authentication {  # 内网中匹配配对的,同一组保持一致即可
        auth_type PASS
        auth_pass bobo
    }
    virtual_ipaddress {  # 指定自定义虚拟IP,可以多个
        192.168.2.130
    }
    # 添加跟踪(执行脚本)
    track_script {
        check_nginx
    }
}

4. 备服务器 check_nginx.sh 文件:

#!/bin/bash 
#检测Nginx是否启动了 
A=`ps -C nginx --no-header | wc -l` 
if [ $A -eq 0 ];then #如果Nginx没有启动就启动 
/usr/local/nginx/sbin/nginx #重启Nginx,也可以使直接监听应用服务 
if [ $A -eq 0 ];then #Nginx重启失败,则停掉keepalived服务,进行VIP转移 
killall keepalived 
fi 
fi


三、 启动keepalived

1. 启动主服务器 keepalived 服务:

#启动(新命令)

systemctl start keepalived

#查看状态

systemctl status keepalived

#停止

systemctl stop keepalived.service

查看网卡信息,可以发现主服务器绑定了虚拟IP: 192.168.2.130

2. 启动备服务器 keepalived 服务

进入备服务器,使用服务启动命令启动 keepalived 服务,并查看网卡信息。

#启动(新命令)

systemctl start keepalived

#查看网卡信息

ip addr

 此时发现:备服务器也绑定了虚拟IP:192.168.2.130(这是不合理的,正常应该是同时只有一台服务器 绑定虚拟IP),这就是 脑裂 问题。

3. 解决“脑裂”问题

主服务器与备服务器都绑定了虚拟IP,也就是产生了所谓的“脑裂”现象。从主备机配置上来看,并没有会 出现脑裂情况的配置,理论上主备机的配置只要注意:

router_id局域网内唯一,主备机不同;

virtual_router_id主备机配置一致;

priority主机高于备份机

virtual_ipaddress 主备机一致,差不多就 可以了。

但是,查看两台机器的IP确实都绑定了虚拟IP。

① 定位问题

首先在 192.168.2.128 主服务器上用 tcpdump 抓包,监控一下 ens33 网卡,也就是绑定了 Vip 的网卡的报文:

 #安装tcpdump抓包工具

yum -y install tcpdump

#监控ens33网卡报文

tcpdump -i ens33 vrrp -n

 192.168.2.128(主机)和192.168.2.129(备机)两台服务器在轮询往224.0.0.18(VRRP的组播 地址)发送报文。理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消 息的,这个很明显就是备份机没收到主机的组播报文

同理,在 192.168.2.132 备服务器上用 tcpdump 抓包,也发现了同样的问题:

经过分析:

发现是主备机 组播IP之间的通信 问题导致的。再三检查之后,确定配置没问题,

问题  出在防火墙,需要在firewall防火墙开启组播通信

② 解决方法
1. #开放firewall防火墙组播通信

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface

ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

2.#刷新防火墙,使配置生效

firewall-cmd --reload

3. 解决方法: 将#开放firewall防火墙组播通信 的代码 复制到 text文档 在复制运行:

4. 修改 direct.xml 文件:

 vi /etc/firewalld/direct.xml

 如下图即可:

修改完 direct.xml 文件后,

5.再次尝试重新加载防火墙规则:

firewall-cmd --reload

主服务器(192.168.2.128)绑定了虚拟IP:192.168.2.130

6.查看备服务器 :(192.168.2.129)

发现(192.168.2.129)没有绑定虚拟IP 

7. 主服务器 查看网卡信息:

tcpdump -i ens33 vrrp -n

8. 备服务器 查看网卡信息:

发现 只有主服务器(192.168.2.128)在发报文

备服务器(192.168.2.129)停止发送了,到此问题解决。

六 、测试Nginx主备切换 :

启动主备两台服务器

通过浏览器访问虚拟IP:192.168.2.130对应的服务,可以正常显示

 通过浏览器访问备用机 IP:192.168.2.129对应的服务,也可以正常显示

我要睡觉了  明天在写了 .......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值