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" 但请求成功。

相关推荐
小五传输2 小时前
Rsync已过时?新一代服务器文件自动同步软件实现跨平台同步
大数据·运维·安全
AC赳赳老秦2 小时前
自媒体博主:OpenClaw多Agent协同,实现选题-创作-审核全流程自动化
运维·服务器·开发语言·人工智能·自动化·媒体·openclaw
刘瑜澄2 小时前
[邪修方法]ubuntu 25 wayland窗口协议下使用utools
linux·运维·ubuntu·wayland·utools
chehaoman2 小时前
Gemini 3.1技术拆解:三层思考架构与多模态自动化实战
运维·人工智能·自动化
又来敲代码了2 小时前
Zrlog博客的系统部署
java·linux·运维·mysql·apache·tornado
feng_you_ying_li2 小时前
linux开发工具的介绍(5)
linux·运维·centos
艾莉丝努力练剑2 小时前
【Linux信号】Linux进程信号(下):可重入函数、Volatile关键字、SIGCHLD信号
linux·运维·服务器·c++·人工智能·后端·学习
CDN3602 小时前
CDN 缓存命中率低如何提升?忽略参数与规则设置教程
运维·缓存
上海云盾安全满满2 小时前
服务器很卡,是CC攻击造成的吗
运维·服务器·网络