Nginx笔记

一、Nginx 基础概念
  1. Nginx 是什么?
    • 一款高性能的HTTP 服务器反向代理服务器负载均衡器
    • 特点:轻量级、高并发(支持 10 万 + 并发连接)、低内存占用、可扩展性强。
  1. Nginx 与 Apache 的核心区别?
对比项 Nginx Apache
并发处理 基于异步非阻塞 IO 模型(事件驱动) 基于多进程 / 多线程模型
内存占用 低(并发 1 万时约 2-3MB / 进程) 高(并发 1 万时内存占用明显更高)
适用场景 高并发静态资源、反向代理、负载均衡 动态内容(如 PHP 模块集成)
  1. Nginx 的工作模式(master-worker 模型)
    • master 进程:管理 worker 进程(启动、重启、关闭),读取配置文件。
    • worker 进程 :处理实际请求(并发连接),数量通常设为CPU 核心数(充分利用多核)。
    • 优势:某个 worker 进程异常退出时,master 会自动重启,保证服务可用性。
二、Nginx 核心功能及应用场景
  1. 反向代理
    • 定义:客户端请求 Nginx,Nginx 转发到后端服务器,再将结果返回客户端(客户端不知道后端服务器)。
    • 作用:隐藏后端服务 IP、统一入口管理、实现动静分离。
    • 核心配置:

      location /api/ {
      proxy_pass http://backend_server; # 转发到后端服务
      proxy_set_header Host host; # 传递客户端Host头 proxy_set_header X-Real-IP remote_addr; # 传递客户端真实IP
      }

  1. 负载均衡
    • 定义:将客户端请求均匀分发到多个后端服务器,避免单点压力过大。
    • 常用策略(upstream模块):
策略 说明 适用场景
轮询(默认) 按顺序依次分发请求 后端服务器性能一致时
权重(weight) server 192.168.1.1 weight=5; 后端服务器性能不均(权重越高分配越多)
ip_hash 同一 IP 请求固定分发到同一服务器 需保持会话的场景(如登录状态)
least_conn 优先分发到连接数最少的服务器 后端负载差异大时
    • 配置示例:

      upstream backend {
      ip_hash; # 启用IP哈希策略
      server 192.168.1.101 weight=3; # 权重3
      server 192.168.1.102 weight=2; # 权重2
      server 192.168.1.103 down; # 标记为不可用
      }

      server {
      listen 80;
      location / {
      proxy_pass http://backend; # 引用upstream
      }
      }

  1. 静态资源服务
    • 优势:Nginx 处理静态资源(HTML、CSS、JS、图片)效率远高于 Tomcat 等应用服务器。
    • 核心配置:

      server {
      listen 80;
      server_name static.example.com;
      root /usr/share/nginx/static; # 静态资源目录

      复制代码
      # 缓存配置(减少重复请求)
      location ~* \.(jpg|jpeg|png|css|js)$ {
          expires 7d;  # 缓存7天
          add_header Cache-Control "public";
      }

      }

  1. 动静分离
    • 定义:静态资源(HTML、图片)由 Nginx 直接处理,动态资源(JSP、PHP)转发到后端应用服务器。
    • 作用:减轻后端服务器压力,提高访问速度。
    • 配置示例:

      server {
      listen 80;
      server_name example.com;

      复制代码
      # 静态资源(Nginx直接处理)
      location ~* \.(html|css|js|jpg)$ {
          root /usr/share/nginx/static;
      }
      
      # 动态资源(转发到Tomcat)
      location /api {
          proxy_pass http://tomcat_server:8080;
      }

      }

  1. SSL/TLS 加密(HTTPS)
    • 作用:通过 SSL 证书加密传输,保障数据安全。
    • 核心配置:

      server {
      listen 443 ssl;
      server_name example.com;

      复制代码
      # SSL证书配置
      ssl_certificate /etc/nginx/ssl/example.crt;
      ssl_certificate_key /etc/nginx/ssl/example.key;
      
      # 加密协议优化
      ssl_protocols TLSv1.2 TLSv1.3;
      ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;

      }

      HTTP自动跳转HTTPS

      server {
      listen 80;
      server_name example.com;
      return 301 https://hostrequest_uri;
      }

三、Nginx 配置文件结构
  1. 核心配置文件:/etc/nginx/nginx.conf(主配置)、/etc/nginx/conf.d/(子配置,通过include引入)。

  2. 配置结构(从外到内)

    1. 全局块(main):影响整个Nginx

    user nginx; # 运行用户
    worker_processes auto; # worker进程数(建议设为CPU核心数)
    error_log /var/log/nginx/error.log; # 错误日志

    2. 事件块(events):影响Nginx网络连接

    events {
    worker_connections 10240; # 每个worker最大连接数
    use epoll; # 事件驱动模型(Linux推荐epoll)
    }

    3. HTTP块:HTTP协议相关配置(可包含多个server)

    http {
    include mime.types; # MIME类型
    default_type application/octet-stream;

    复制代码
     # 4. 上游服务器(负载均衡)
     upstream backend {
         server 192.168.1.101;
         server 192.168.1.102;
     }
     
     # 5. 服务器块(server):虚拟主机配置
     server {
         listen 80;  # 监听端口
         server_name example.com;  # 域名
         
         # 6. location块:匹配URL路径,处理请求
         location / {
             root /usr/share/nginx/html;
             index index.html;
         }
     }

    }

四、Nginx 性能优化核心配置
  1. 并发连接优化

    events {
    worker_connections 10240; # 每个worker最大连接数(默认1024)
    multi_accept on; # 允许worker同时接收多个连接
    }

    • 最大并发数 = worker_processes × worker_connections
  1. 连接超时优化

    http {
    keepalive_timeout 65; # 长连接超时时间(默认75s)
    tcp_nodelay on; # 禁用Nagle算法,减少延迟
    client_header_timeout 10s; # 客户端请求头超时
    client_body_timeout 10s; # 客户端请求体超时
    }

  2. 缓存与压缩优化

    启用gzip压缩(减小传输体积)

    gzip on;
    gzip_types text/plain text/css application/json; # 压缩指定类型
    gzip_comp_level 5; # 压缩级别(1-9,5平衡性能和压缩率)

    静态资源缓存

    location ~* .(jpg|css|js)$ {
    expires 30d; # 缓存30天
    add_header Cache-Control "public, max-age=2592000";
    }

  3. CPU 亲和性(减少进程切换)

    worker_processes 4; # 4核CPU
    worker_cpu_affinity 0001 0010 0100 1000; # 绑定每个worker到不同核心

五、Nginx 常见问题及解决方案
  1. 502 Bad Gateway
    • 原因:后端服务器未启动、后端崩溃、连接超时。
    • 排查:
      1. 检查后端服务器是否正常:curl http://backend_server
      1. 增加超时配置:

    location / {
    proxy_pass http://backend;
    proxy_connect_timeout 30s; # 连接后端超时
    proxy_read_timeout 60s; # 读取后端响应超时
    }

  1. 504 Gateway Timeout

    • 原因:后端处理请求超时(如数据库查询慢)。
    • 解决:
      1. 优化后端业务逻辑(如减少查询耗时)。
      1. 调整 Nginx 超时参数:proxy_read_timeout 120s;
  1. Nginx 启动失败
    • 常见原因:配置文件语法错误(nginx -t检查)、端口被占用(netstat -tulpn | grep 80)。
  1. 如何实现 Nginx 高可用?
    • 方案:结合Keepalived实现主从架构,主节点故障时自动切换到从节点。
    • 核心:双机共享虚拟 IP(VIP),通过健康检查监测 Nginx 状态。
六、Nginx 高频面试题
  1. Nginx 的 worker 进程数为什么设为 CPU 核心数?
    • 答:Nginx 基于异步非阻塞模型,每个 worker 进程可处理多个连接;绑定 CPU 核心能减少进程切换开销,充分利用多核性能。
  1. 反向代理和正向代理的区别?
    • 正向代理:代理客户端(如 VPN),客户端知道目标服务器。
    • 反向代理:代理服务器(如 Nginx),客户端不知道后端服务器。
  1. Nginx 负载均衡的 ip_hash 策略解决了什么问题?
    • 答:解决会话保持问题(如用户登录状态),确保同一用户的请求始终分发到同一后端服务器。
  1. 如何查看 Nginx 的访问日志和错误日志?
    • 访问日志:默认/var/log/nginx/access.log(记录请求来源、URL、状态码)。
    • 错误日志:默认/var/log/nginx/error.log(记录启动、运行错误)。
  1. Nginx 如何实现限流?
    • 用limit_req模块限制请求频率:

      http {
      limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 每IP每秒10个请求

      复制代码
      server {
          location / {
              limit_req zone=one burst=5;  # 允许5个突发请求
          }
      }

      }

相关推荐
风已经起了7 分钟前
FPGA学习笔记——简单的乒乓缓存(RAM)
笔记·学习·fpga开发
天上掉下来个程小白42 分钟前
Docker-07.Docker基础-数据卷挂载
运维·docker·微服务·容器
whabc1001 小时前
ssh连接VirtualBox中的Ubuntu24.04(win11、putty、NAT 模式)
运维·ssh
热爱生活的五柒1 小时前
服务器突然之间特别卡,什么原因?
运维·服务器
KhalilRuan2 小时前
秋招笔记-8.4
笔记
zly35002 小时前
Linux(centos)安全狗
linux·运维·服务器
是孑然呀2 小时前
【笔记】重学单片机(51)(下)
笔记·单片机·嵌入式硬件
zhangxiaomm3 小时前
pytorch 学习笔记(2)-实现一个线性回归模型
pytorch·笔记·学习
失因3 小时前
Linux 权限管理与 ACL 访问控制
linux·运维·服务器·数据库·centos