Nginx安装与使用

目录

1、部署springboot应用

2、安装Nginx

3、配置Nginx日志打印格式

4、配置Nginx负载均衡

5、测试配置并重载

6、验证负载均衡效果


1、部署springboot应用

在三台机器上分别启动 Spring Boot 项目,确保它们能够独立对外提供服务。

可以使用 java -jar 命令启动,或通过 systemd、docker 等方式。

验证方式:在每台机器上执行 curl http://localhost:8080/health(如果有健康检查接口),或者直接浏览器访问 http://机器IP:8080,确认返回正常。

2、安装Nginx

CentOS 7 / RHEL 为例:

bash 复制代码
# 添加 Nginx 官方源(可选,但推荐)
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装 Nginx
sudo yum install -y nginx

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

访问 http://nginx服务器IP,看到 Nginx 欢迎页即成功。

3、配置Nginx日志打印格式

编辑主配置文件 /etc/nginx/nginx.conf

bash 复制代码
sudo vi /etc/nginx/nginx.conf

找到 http { ... } 块,在它的内部 (例如在 include 语句之前或之后)添加自定义日志格式:

bash 复制代码
http {
    # 已有的配置(如 sendfile, tcp_nopush 等)

    # 添加自定义日志格式,包含 upstream 地址
    log_format upstream_log '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $body_bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            'upstream_addr="$upstream_addr"';

    # 如果有其他日志格式(如 main),保留不变

    # 原有的 include 语句,例如:
    include /etc/nginx/conf.d/*.conf;
}

在下一步中,设置使用自定义格式的访问日志

4、配置Nginx负载均衡

Nginx 的主配置文件通常是 /etc/nginx/nginx.conf,但一般将自定义配置放在 /etc/nginx/conf.d/ 目录下,便于管理。

创建应用配置文件:

bash 复制代码
sudo vi /etc/nginx/conf.d/springboot-cluster.conf

写下以下配置:

bash 复制代码
upstream backend {
    # 负载均衡策略:默认为轮询(round-robin)
    # 可选:ip_hash(基于客户端IP哈希,保持会话粘性)
    # 可选:least_conn(最小连接数)
    
    server 192.168.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;
    
    # 如果某一台服务器出现故障,Nginx 会暂时将其标记为不可用,并在 fail_timeout 后重试
}

server {
    listen 80;
    server_name your-domain.com;   # 或直接使用 IP,如 192.168.1.100

    # 访问日志(可选):保留原有日志格式(如用于其他统计),并添加自定义格式的访问日志
    access_log /var/log/nginx/springboot-access.log main;
    access_log /var/log/nginx/springboot-upstream.log upstream_log;
    error_log  /var/log/nginx/springboot-error.log;

    location / {
        proxy_pass http://backend;
        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_set_header X-Forwarded-Proto $scheme;

        # 超时设置(根据业务调整)
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}
  • upstream backend:定义后端服务器组,名称可自定义。

  • server 指令:weight 为权重,数字越大分配流量越多;max_failsfail_timeout 配合实现健康检查:在 fail_timeout 秒内如果失败 max_fails 次,则暂时将该服务器标记为不可用,等待 fail_timeout 秒后再次尝试。

  • proxy_pass:将请求转发到 upstream 定义的服务器组。

  • proxy_set_header :传递真实客户端 IP 等信息,方便 Spring Boot 应用通过 X-Forwarded-For 获取。

如果需要 会话保持(Session Sticky) ,可以使用 ip_hash 策略(将同一客户端 IP 的请求始终转发到同一台后端),但更推荐使用 Redis 共享 Session 方案。如果一定要用,在 upstream 块中添加:

bash 复制代码
upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

如果希望使用 HTTPS,在 server 块中添加证书配置:

bash 复制代码
server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/privkey.pem;

    # 其他配置同 http 部分
}

如果 Spring Boot 应用有静态资源,可以配置 Nginx 直接代理静态文件,减轻后端压力:

bash 复制代码
location /static/ {
    alias /path/to/static/files/;
    expires 30d;
}

location / {
    proxy_pass http://backend;
}

5、测试配置并重载

bash 复制代码
sudo nginx -t          # 检查配置文件语法
sudo systemctl reload nginx   # 重载配置,不中断服务

6、验证负载均衡效果

  • 访问 Nginx 服务

    在浏览器中访问 http://nginx服务器IP,多次刷新,观察是否轮询访问到三台应用。

    也可以在 Spring Boot 应用中打印一个简单的标识(如机器名或 IP)到响应中,以直观确认。

  • 查看 自定义Nginx 日志

bash 复制代码
tail -f /var/log/nginx/springboot-upstream.log

可以看到每一条请求被转发到的后端地址(如果配置了 $upstream_addr 变量,可自定义日志格式)。

  • 模拟故障

    停止其中一台应用服务器,再次请求,观察 Nginx 是否自动将流量转发到其他两台,并且日志中可能出现 "upstream temporarily unavailable" 但请求成功。

相关推荐
志栋智能1 小时前
超自动化巡检:驱动运维团队从操作走向优化
运维·服务器·自动化
乌托邦的逃亡者1 小时前
Dockerfile的配置和使用
linux·运维·docker·容器
小此方1 小时前
Re:Linux系统篇(三)指令篇 · 二:十二个高频指令精讲+重定向操作+“一切皆文件“深入理解
linux·运维·服务器
七七powerful1 小时前
loki监控docker容器&系统&nginx日志的告警规则
nginx·docker·容器
用户1401056775192 小时前
线上接口偶发超时,最后发现是 conntrack 打满:一次网络故障排查实战
运维
以太浮标2 小时前
华为eNSP模拟器综合实验之- 主机没有配置缺省网关时,通过路由式Proxy ARP实现通信(arp-proxy enable)
运维·网络·网络协议·华为·智能路由器·信息与通信
REDcker3 小时前
Linux disown命令详解 后台作业脱管与终端退出
linux·运维·chrome
cyber_两只龙宝3 小时前
【Oracle】Oracle之SQL的转换函数和条件表达式
linux·运维·数据库·sql·云原生·oracle
被摘下的星星3 小时前
四层模型TCP/IP协议栈
运维·服务器·网络
努力努力再努力wz3 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python