目录
6. 使用 wget 命令来下载 Nginx 的源代码包了。
2. 在文件末尾添加以下行,将 /usr/local/nginx/sbin/ 目录添加到 PATH 环境变量中:
2.开放 防火墙 Nginx 监听的 80 端口 和 Tomcat 监听的 8080 端口
OK 输入本机的地址 192.168.2.129 见证奇迹:
环境:
首先我使用的是 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 通常依赖gcc、pcre、zlib、openssl等库的开发文件。确保系统已经安装了这些依赖项,如果没有,可以使用以下命令安装:
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对应的服务,也可以正常显示