一、基础核心:Nginx 配置与 IP 地址分配

(一)IP 地址分配基础

IP 地址作为网络设备的唯一标识,绝对不允许重复。 配置过程中2 台虚拟机 IP 均为 192.168.110.128 的冲突问题,这也印证了 DHCP 协议的重要性 ——DHCP 作为 IP 地址自动分配服务,能避免手动配置导致的冲突,其核心原理是通过服务器动态分配 IP、子网掩码、网关等网络参数,简化网络管理。

在 Linux 系统中,网络服务的管理需注意:

  • systemctl stop NetworkManager:停止 NetworkManager 服务(负责网卡发现与 IP 管理)
  • systemctl restart network:重启网络服务,使网卡(如 ens33)配置生效

(二)Nginx 配置文件核心框架

Nginx 的配置文件(nginx.conf)采用分层结构,核心分为四大块:

  1. 全局配置:设置 Nginx 运行的全局参数(如工作进程数、日志路径等)
  2. http 块:配置 HTTP 协议相关参数,可包含多个 server 块
  3. server 块:匹配用户访问的入口(如域名、端口),一个 http 块可配置多个 server 块(多站点部署)
  4. location 块:URL 路径匹配规则,核心作用是精准定位用户请求的资源文件

(三)location 匹配规则详解

location 的核心价值在于避免 Nginx 遍历整个站点目录查找资源,提升访问效率(对比 Apache 的低效遍历机制)。其匹配规则按优先级从高到低排序如下:

匹配符号 匹配类型 说明 示例
= 精确匹配 完全匹配 URL 路径,优先级最高 location = /index.html {} 仅匹配http://xxx.com/index.html
^~ 前缀匹配 优先于正则匹配,匹配 URL 前缀 location ^~ /abc/ {} 匹配http://xxx.com/abc/123等路径
~ 区分大小写正则匹配 按正则表达式匹配,区分大小写 location ~ \.jsp$ {} 仅匹配后缀为.jsp 的 URL(大写.JSP 不匹配)
~* 不区分大小写正则匹配 正则匹配,忽略大小写 location ~* \.jpg$ {} 匹配.jpg、.JPG 等后缀
/ 普通前缀匹配 默认匹配规则,优先级最低 location / {} 匹配所有未被其他规则匹配的 URL

关键原则:匹配越精确,优先级越高;Nginx 会自上而下读取配置文件中的 location 规则,一旦匹配成功则停止后续匹配。

二、核心应用:反向代理与负载均衡

(一)反向代理原理与配置

反向代理是 Nginx 的核心功能之一,其本质是客户端通过访问 Nginx 服务器,由 Nginx 转发请求至后端服务器(如 Tomcat、httpd),并将结果返回给客户端,实现后端服务的隐藏与保护。

1. 单后端服务反向代理配置

例如,将所有.jsp 后缀的请求转发至 Tomcat 服务器:

nginx

http {
    upstream tomcat_server {  # 定义后端服务器地址池
        server 192.168.110.152:8080;
        server 192.168.110.129:8080;
    }
    server {
        listen 80;
        server_name localhost;
        location ~* \.jsp$ {  # 匹配动态请求
            proxy_pass http://tomcat_server;  # 转发至后端地址池
        }
    }
}
2. 前端静态资源与后端动态请求分离

前端开发者将页面文件(HTML、CSS、JS)打包后,解压至 Nginx 的站点目录,通过 location 匹配静态资源路径,动态请求则转发至后端:

nginx

location ^~ /author/workbench/ {
    root /usr/share/nginx/html;  # 静态资源目录
    index test.html;  # 默认首页
}
location ~* \.jsp$ {
    proxy_pass http://tomcat_server;  # 动态请求转发
}
  • http://你的域名/author/workbench/test.html → 匹配第一个location,Nginx 直接从/usr/share/nginx/html/author/workbench/目录找到test.html返回,全程不经过 Tomcat;
  • http://你的域名/user/login.jsp → 匹配第二个location,Nginx 把这个请求转发给 Tomcat,Tomcat 处理登录逻辑后,把结果返回给 Nginx,再由 Nginx 传给用户。

(二)负载均衡算法详解

当后端存在多台服务器时,Nginx 通过负载均衡算法分发请求,提升系统并发处理能力。Nginx 支持 4 种核心负载均衡算法:

算法类型 特性 适用场景
轮循(默认)rr 请求按顺序依次分发至后端服务器,所有服务器权重相同 后端服务器配置一致、性能相当的场景
加权轮循 wrr 为后端服务器设置权重(weight),权重越高,接收请求越多 后端服务器性能差异较大的场景
IP Hash 根据客户端 IP 地址哈希计算,固定将请求分发至同一台后端服务器 需要保持会话一致性的场景(如登录状态)
最小连接 lc 优先将请求分发至当前连接数最少的后端服务器 后端服务器负载不均的场景
负载均衡配置示例(加权轮循):

nginx

http {
    upstream backend {
        server 192.168.110.129 weight=5;  # 权重5,接收请求比例更高
        server 192.168.110.152 weight=3;  # 权重3
    }
    server {
        listen 80;
        location / {
            proxy_pass http://backend;  # 转发至后端地址池
        }
    }
}

三、安全加固:HTTPS 部署与 DNS 解析

企业级 Web 服务必须使用 HTTPS 协议(SSL/TLS 加密),避免数据传输过程中被窃取或篡改。HTTPS 部署的核心是 SSL 证书申请与 Nginx 配置。

(一)SSL 证书申请渠道

  1. 云服务商申请(推荐):阿里云、华为云、腾讯云等提供免费 DV 证书(域名验证型),支持自动解析与绑定,流程简便。
  2. 运营商申请:需完成域名备案,适用于企业级 EV 证书(增强验证型,显示企业名称)。
  3. 测试环境:可使用自签名证书(不推荐生产环境,浏览器会提示不安全)。

(二)HTTPS 部署完整流程

  1. 域名准备:注册域名(如www.qaq.net),并将域名与云服务器 ECS 的 IP 绑定(DNS 解析)。

    • A 记录:将域名解析为 IP(正向解析)
    • CNAME 记录:为域名设置别名(如www.qaq.net别名指向主域名)
    • 验证解析:使用nslookup www.qaq.net命令查看解析结果
  2. 证书下载与配置:从云服务商下载证书文件(通常包含.pem 和.key 文件),修改 Nginx 配置:

nginx

http {
    # HTTP请求强制跳转HTTPS(301永久重定向)
    server {
        listen 80;
        server_name www.qaq.net;
        return 301 https://$host$request_uri;
    }
    
    # HTTPS配置
    server {
        listen 443 ssl;
        server_name www.qaq.net;
        
        # 证书文件路径
        ssl_certificate /etc/nginx/cert/qaq.pem;
        ssl_certificate_key /etc/nginx/cert/qaq.key;
        
        # SSL优化参数
        ssl_protocols TLSv1.2 TLSv1.3;  # 支持的TLS版本
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;  # 加密套件
        ssl_session_timeout 10m;  # 会话超时时间
        
        # 业务配置
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
}
  1. 验证生效:重启 Nginx 服务(systemctl restart nginx),访问https://www.qaq.net,浏览器地址栏显示小锁图标即表示配置成功。

四、后端联动:Tomcat 应用服务器部署

Tomcat 作为 Java 应用服务器,需依赖 JDK 运行环境,主要用于部署 Java Web 项目(.jar 或.war 包)。

(一)Java 项目部署两种方式

  1. 传统部署(基于 Tomcat)

    • 开发人员通过 Maven 打包项目:mvn package --clean,生成.war 或.jar 包
    • 将打包文件放入 Tomcat 的webapps/目录
    • 修改 Tomcat 配置文件server.xml(如端口、虚拟主机)
    • 重启 Tomcat:bin/startup.sh(Linux)或bin\startup.bat(Windows)
  2. 简化部署(直接运行 Jar 包)

    • 开发人员打包生成.jar 包(含内置 Tomcat)
    • 服务器安装 JDK 环境(配置 JAVA_HOME)
    • 直接运行命令:java -jar xxx.jar
    • 验证服务:netstat -natulp | grep java 查看 8080 端口是否监听

(二)Nginx 反向代理 Tomcat 配置

通过 Nginx 转发动态请求至 Tomcat,实现静态资源与动态请求分离:

nginx

http {
    upstream tomcat_server {
        server 192.168.110.152:8080;
        server 192.168.110.129:8080;
    }
    server {
        listen 80;
        server_name localhost;
        
        # 静态资源匹配
        location ~* \.(html|css|js|jpg|png)$ {
            root /usr/share/nginx/html;
            expires 30d;  # 静态资源缓存30天
        }
        
        # 动态请求转发至Tomcat
        location ~* \.jsp$ {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;  # 传递客户端Host信息
            proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
        }
    }
}

五、高可用架构:Keepalived 与集群部署

单点故障是 Web 服务的致命隐患,通过 Keepalived 实现 Nginx 高可用,确保服务持续可用。

(一)高可用核心指标

系统可用性通过以下公式计算:可用性

  • MTBF(Mean Time Between Failure):平均故障间隔时间(系统正常运行的平均时长)
  • MTTR(Mean Time To Recovery):平均恢复时间(故障发生到恢复正常的时间)

常见可用性等级:

  • 99.9%(三个 9):年停机时间约 8.76 小时
  • 99.99%(四个 9):年停机时间约 52.6 分钟(企业主流标准)
  • 99.999%(五个 9):年停机时间约 5.26 分钟(核心业务高标准)

(二)Nginx+Keepalived 高可用配置

架构组成:
  • 主服务器(MASTER):Nginx(192.168.110.129)+ Keepalived
  • 备用服务器(BACKUP):Nginx(192.168.110.133)+ Keepalived
  • VIP(虚拟 IP):192.168.110.100(客户端统一访问入口)
Keepalived 配置文件核心区域:

nginx

# 1. 全局配置
global_defs {
    router_id LVS_DEVEL  # 路由标识(全局唯一)
}

# 2. VRRP热备组配置
vrrp_instance VI_1 {
    state MASTER  # 主服务器为MASTER,备用为BACKUP
    interface ens33  # 绑定的网卡
    virtual_router_id 51  # 热备组ID(主备必须一致)
    priority 100  # 优先级(主服务器高于备用,如主100,备90)
    advert_int 1  # 心跳检测间隔(1秒)
    
    # 认证配置
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    # 3. VIP配置
    virtual_ipaddress {
        192.168.110.100  # 虚拟IP
    }
}

# 4. 健康检测脚本(监控Nginx状态)
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 检测脚本路径
    interval 2  # 检测间隔(2秒)
    weight -20  # 检测失败时优先级降低20
}
健康检测脚本(check_nginx.sh):

bash

运行

#!/bin/bash
if [ $(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; then
    systemctl start nginx  # 尝试启动Nginx
    sleep 2
    if [ $(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; then
        systemctl stop keepalived  # 启动失败则停止Keepalived,触发VIP漂移
    fi
fi
高可用逻辑:
  1. 主备服务器通过 VRRP 协议发送心跳包,确认对方状态。
  2. 主服务器故障时(Nginx 停止),健康检测脚本触发 Keepalived 停止。
  3. 备用服务器检测到主服务器心跳消失,优先级自动成为最高,VIP 漂移至备用服务器。
  4. 主服务器恢复后,通过优先级抢占 VIP,恢复主备状态。

六、实用工具与故障排查

(一)抓包工具使用

抓包工具用于分析网络请求细节,定位通信故障,常用工具包括:

  • Fiddler/Wireshark:图形化工具,适合桌面环境,可查看请求头、请求体、状态码等。
  • tcpdump:Linux 命令行工具,适合服务器环境,例如抓取 VIP(192.168.110.100)的数据包:

    bash

    运行

    tcpdump -i ens33 host 192.168.110.100  # 抓取指定IP的数据包
    tcpdump -i ens33 port 80  # 抓取80端口的HTTP请求
    

(二)Nginx 常见状态码与故障处理

状态码分类 含义 典型故障与处理
2xx(成功) 请求正常处理 200 OK:正常响应;206 Partial Content:部分内容请求(如断点续传)
3xx(重定向) 请求需要进一步操作 301:永久重定向(HTTPS 跳转);302:临时重定向(临时跳转)
4xx(客户端错误) 客户端请求有误 404:资源不存在(检查 location 路径或文件是否存在);403:权限拒绝(调整目录权限为 755)
5xx(服务器错误) 后端服务故障 502:Bad Gateway(后端服务器 down 或配置错误,检查 upstream 地址);504:Gateway Timeout(后端响应超时,优化后端服务或调整 Nginx 超时参数)

(三)Nginx 优化方向

Nginx 优化可从 4 个维度入手,提升性能与稳定性:

  1. 系统层面:优化文件描述符(ulimit -n 65535)、内核参数(网络转发、TCP 连接优化)、防火墙规则(关闭不必要端口)。
  2. 服务层面:调整 Nginx 配置(工作进程数、连接数、缓存策略)、启用 Gzip 压缩、安装第三方模块(如限流模块)。
  3. 观测层面:配置访问日志与错误日志、搭建监控(Zabbix、Prometheus)、实现微服务链路追踪。
  4. 业务层面:与开发配合优化静态资源(压缩、CDN 加速)、动态请求限流、数据库查询优化。

七、面试高频问题汇总

  1. Nginx 反向代理与负载均衡怎么做?反向代理通过proxy_pass将请求转发至后端服务器;负载均衡通过upstream定义后端地址池,结合轮循、加权轮循等算法分发请求。

  2. Nginx 的 SSL 加密配置流程?申请 SSL 证书→域名与 IP 绑定→修改 Nginx 配置(监听 443 端口、指定证书路径)→HTTP 强制跳转 HTTPS。

  3. Nginx 与 HAProxy、LVS 的区别?

    • Nginx:支持 HTTP/HTTPS 协议,功能丰富(反向代理、负载均衡、缓存、限流),适合中高并发(万级)。
    • HAProxy:纯负载均衡器,支持 TCP/UDP 协议,并发性能优于 Nginx(十万级),无 Web 服务功能。
    • LVS:工作在内核层,性能最强(百万级并发),仅支持负载均衡,配置复杂,需配合 Keepalived 实现高可用。
  4. Nginx 如何限流?通过limit_req_zone模块实现,例如限制同一 IP1 分钟内最多访问 5 次:

    nginx

    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m;
    location / {
        limit_req zone=one burst=2 nodelay;
    }
    
  5. 如何拒绝某一网段访问?使用deny指令:location / { deny 192.168.110.0/24; allow all; }

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐