Nginx核心功能学习

一、Nginx核心认知回顾

Nginx是一款高性能的HTTP和反向代理服务器 同时支持IMAP/POP3/SMTP代理 核心优势在于"事件驱动"架构 能高效处理成千上万的并发连接

Nginx核心功能总览:静态资源服务 反向代理 负载均衡 SSL/TLS配置(HTTPS)URL重写 缓存机制 这六大功能是Nginx部署和使用的核心 也是实际工作中最常用的场景

Nginx核心功能详解

静态资源服务

功能说明

静态资源指无需后端解析 可直接返回给客户端的文件 包括HTML、CSS、JS、图片 视频 字体等Nginx对静态资源的处理效率极高 远超Apache 是部署静态网站 前端项目(如Vue、React打包后的项目)的首选

核心优势:支持文件压缩(gzip)断点续传 资源缓存 能大幅提升客户端访问速度 降低服务器带宽压力

实操配置(CentOS 8基于之前Nginx部署环境)

Nginx静态资源配置核心是"虚拟主机(server块)" 指定网站根目录 默认首页 搭配压缩 缓存配置优化访问体验

复制代码
# 编辑Nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf

# 静态资源服务核心配置(server块)
server {
    listen       80;  # 监听80端口(HTTP)
    server_name  www.static-test.com;  # 服务器域名/IP(需解析或配置本地hosts)

    # 静态资源根目录(存放HTML、CSS、JS等文件)
    root   /usr/local/nginx/static;  # 自定义目录,需提前创建
    # 默认首页(访问域名时优先加载的文件,按顺序匹配)
    index  index.html index.htm index.css;

    # 1. 静态资源压缩配置(gzip),降低带宽占用
    gzip on;  # 开启gzip压缩
    gzip_types text/html text/css text/javascript application/json image/jpeg image/png;  # 需压缩的文件类型
    gzip_min_length 1k;  # 文件大小超过1k才压缩
    gzip_comp_level 6;  # 压缩级别(1-9,级别越高压缩率越高,占用CPU越多)

    # 2. 静态资源缓存配置(客户端缓存,减少重复请求)
    location ~* \.(jpg|png|gif|css|js)$ {  # 匹配指定后缀的静态文件
        expires 7d;  # 缓存7天(客户端再次访问时直接读取本地缓存)
        add_header Cache-Control "public, max-age=604800";  # 缓存控制头
    }

    # 3. 访问控制(允许所有IP访问,也可限制特定IP)
    location / {
        try_files $uri $uri/ /index.html;  # 若请求文件不存在,跳转至index.html(适配前端路由)
        # 限制特定IP访问(可选)
        # allow 192.168.1.100;  # 允许该IP访问
        # deny all;  # 禁止其他所有IP访问
    }

    # 错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

注意事项

  • 静态资源目录需提前创建 且赋予正确权限(chmod -R 755 /usr/local/nginx/static)避免Nginx无法读取文件
  • gzip压缩虽能降低带宽 但会占用服务器CPU资源 生产环境建议压缩级别设为4-6 平衡性能和压缩效果
  • 缓存时间需根据资源更新频率调整 静态资源(如图片、字体)可设置较长缓存(7-30天)动态更新的静态资源(如JS、CSS)可设置较短缓存(1-3天)

反向代理

功能说明

反向代理是指Nginx接收客户端的所有请求 再将请求转发到后端的应用服务器(如Tomcat、PHP-FPM、Python Flask)客户端无需直接访问后端服务器 仅与Nginx交互

核心作用:

  • 隐藏后端服务器地址 提升系统安全性(避免后端服务器直接暴露在公网)
  • 分担后端服务器压力 Nginx可处理静态资源请求 仅将动态请求转发至后端
  • 实现端口转发(如客户端访问80端口,Nginx转发至后端8080端口)

实操配置

假设后端Tomcat服务运行在本机8080端口 Nginx监听80端口 将所有动态请求(.jsp)转发至Tomcat 静态请求由Nginx直接处理

复制代码
server {
    listen       80;
    server_name  www.proxy-test.com;

    # 静态资源处理(Nginx直接返回)
    root   /usr/local/nginx/static;
    index  index.html index.htm;

    # 反向代理配置:将.jsp结尾的请求转发至Tomcat
    location ~ \.jsp$ {
        proxy_pass http://127.0.0.1:8080;  # 后端服务器地址(Tomcat地址+端口)
        # 传递客户端信息至后端(重要,避免后端获取不到客户端真实IP)
        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;
    }

    # 若需将所有请求都转发至后端(全代理),配置如下:
    # location / {
    #     proxy_pass http://127.0.0.1:8080;
    #     proxy_set_header Host $host;
    #     proxy_set_header X-Real-IP $remote_addr;
    # }
}

注意事项

  • proxy_pass后面的地址需正确(后端服务器IP+端口)若后端是集群 可配置 upstream 集群名称(后续负载均衡会讲解)
  • proxy_set_header 必须配置 否则后端服务器获取到的客户端IP会是Nginx服务器的IP 无法定位真实客户端
  • 可通过location匹配不同路径 实现"静态资源Nginx处理 动态请求转发后端" 提升整体性能

负载均衡

功能说明

当后端应用服务器集群时 Nginx可将客户端请求按照指定策略分发到不同的后端服务器 实现"负载分担"避免单台服务器压力过大 同时实现"故障转移"(某台后端服务器宕机 Nginx自动将请求转发至其他正常服务器)提升系统可用性

Nginx默认支持3种负载均衡策略 可根据后端服务器性能 业务需求选择

常用负载均衡策略

  1. 轮询(默认):请求按顺序分发到后端服务器 适用于后端服务器性能一致的场景 若某台服务器宕机 Nginx会自动跳过该服务器 不影响服务

  2. 权重(weight):根据后端服务器性能设置权重 权重越高 接收的请求越多 适用于后端服务器性能不一致的场景(如高性能服务器权重设为3 普通服务器设为1)

  3. IP哈希(ip_hash):根据客户端IP地址哈希计算 将同一客户端的请求始终分发到同一台后端服务器 适用于需要会话保持的场景(如用户登录后 后续请求需访问同一台服务器获取会话信息)

实操配置

复制代码
# 编辑Nginx主配置文件,在http块中配置upstream(后端集群)
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 1. 配置后端服务器集群(upstream名称自定义,如tomcat_cluster)
    upstream tomcat_cluster {
        # 轮询策略(默认,可省略weight)
        server 127.0.0.1:8080;  # 后端服务器1
        server 127.0.0.1:8081;  # 后端服务器2
        server 127.0.0.1:8082;  # 后端服务器3

        # 权重策略(示例)
        # server 127.0.0.1:8080 weight=3;  # 权重3,接收3/6的请求
        # server 127.0.0.1:8081 weight=2;  # 权重2,接收2/6的请求
        # server 127.0.0.1:8082 weight=1;  # 权重1,接收1/6的请求

        # IP哈希策略(示例)
        # ip_hash;
        # server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
        # server 127.0.0.1:8082;

        # 故障转移配置(可选,超时时间设置)
        proxy_connect_timeout 5s;  # 连接后端服务器超时时间
        proxy_read_timeout 10s;    # 读取后端服务器响应超时时间
    }

    # 2. 虚拟主机配置,将请求转发至集群
    server {
        listen       80;
        server_name  www.loadbalance-test.com;

        location / {
            proxy_pass http://tomcat_cluster;  # 转发至upstream集群
            # 传递客户端信息至后端
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

SSL/TLS配置

功能说明

HTTPS是在HTTP基础上加入SSL/TLS加密协议 实现客户端与服务器之间的数据加密传输 防止数据被窃取 篡改 是目前Web服务的必备配置(尤其是涉及用户登录 支付等敏感信息的场景)

Nginx支持SSL/TLS协议 需提前获取SSL证书(可通过Let's Encrypt申请免费证书 或购买商业证书)证书格式通常为.pem(公钥)和.key(私钥)

实操配置(基于免费SSL证书)

复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;

    # SSL全局配置(优化加密性能)
    ssl_protocols TLSv1.2 TLSv1.3;  # 支持的SSL协议版本(禁用不安全的TLSv1.0、TLSv1.1)
    ssl_prefer_server_ciphers on;  # 优先使用服务器端加密套件
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;  # 高强度加密套件
    ssl_session_cache shared:SSL:10m;  # SSL会话缓存,提升复用率
    ssl_session_timeout 10m;  # SSL会话超时时间

    # HTTPS虚拟主机配置(监听443端口)
    server {
        listen       443 ssl;  # 监听443端口(HTTPS默认端口)
        server_name  www.https-test.com;  # 域名(需与SSL证书匹配)

        # SSL证书路径(将证书上传至Nginx的conf/cert目录)
        ssl_certificate      cert/xxx.pem;  # 证书公钥文件
        ssl_certificate_key  cert/xxx.key;  # 证书私钥文件

        # 网站根目录(静态资源)
        root   /usr/local/nginx/static;
        index  index.html index.htm;

        # 反向代理(可选,转发至后端服务器)
        location / {
            proxy_pass http://tomcat_cluster;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    # 配置HTTP自动跳转至HTTPS(推荐,强制使用HTTPS)
    server {
        listen       80;
        server_name  www.https-test.com;
        return 301 https://$server_name$request_uri;  # 301永久跳转,搜索引擎会更新地址
    }
}

缓存机制(提升访问速度)

功能说明

Nginx缓存机制分为"客户端缓存"(之前静态资源配置中提到的expires)和"服务器端缓存" 服务器端缓存是指Nginx将后端服务器返回的响应数据缓存起来 当后续有相同请求时 Nginx直接返回缓存数据 无需再次请求后端 大幅提升响应速度 降低后端服务器压力

适用场景:后端接口响应较慢 数据更新频率低的场景(如商品详情页 新闻详情页)

实操配置(服务器端缓存)

复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 配置缓存路径(自定义缓存目录,需提前创建)
    proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=7d use_temp_path=off;
    # 说明:
    # levels=1:2:缓存目录层级(1级目录+2级子目录,避免单个目录文件过多)
    # keys_zone=my_cache:10m:缓存区域名称my_cache,占用内存10MB(存储缓存key)
    # max_size=10g:缓存文件最大容量10GB,超过后自动删除最久未使用的缓存
    # inactive=7d:缓存文件7天未被访问,自动删除
    # use_temp_path=off:禁止使用临时目录,避免缓存文件频繁移动

    server {
        listen       80;
        server_name  www.cache-test.com;

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

            # 启用服务器端缓存
            proxy_cache my_cache;  # 关联上面配置的缓存区域
            proxy_cache_key "$host$request_uri";  # 缓存key(根据域名+请求路径生成,确保唯一)
            proxy_cache_valid 200 304 1h;  # 状态码200、304的响应,缓存1小时
            proxy_cache_valid any 1m;  # 其他状态码的响应,缓存1分钟
            proxy_cache_min_uses 3;  # 请求超过3次后才缓存(避免缓存一次性请求)
            proxy_cache_bypass $cookie_nocache $arg_nocache;  # 满足条件时,不使用缓存(如带nocache参数的请求)
            proxy_no_cache $cookie_nocache $arg_nocache;  # 满足条件时,不缓存响应
        }
    }
}

Nginx核心功能配置注意事项汇总

  1. 配置文件语法:Nginx配置文件对语法要求严格,括号、分号不能遗漏,修改后需执行"/usr/local/nginx/sbin/nginx -t"检查语法,无误后再重启(reload)

  2. 权限问题:Nginx运行用户(默认nobody)需拥有静态资源目录、缓存目录、证书目录的读取权限,否则会出现403错误

  3. 日志排查:若配置生效后出现异常,可查看Nginx错误日志(/usr/local/nginx/logs/error.log),定位问题(如端口被占用、路径错误、后端连接失败)

  4. 性能优化:根据服务器配置调整worker_processes(工作进程数,建议设为CPU核心数)、worker_connections(每个进程最大并发连接数),提升Nginx并发处理能力

  5. 结合Linux安全:部署Nginx时,需配合Linux系统安全配置(如防火墙开放80、443端口,限制Nginx进程权限,定期更新Nginx版本修复漏洞)

相关推荐
河码匠2 小时前
Linux sar 命令
linux·运维·网络
偷懒下载原神2 小时前
【linux操作系统】进程间通信--管道
linux·运维·服务器
非凡ghost2 小时前
1by1(轻量级音乐播放器)
windows·学习·音视频·软件需求·teamviewer
林鸿群2 小时前
Cocos2d-x v4 官方文档学习总结
学习·游戏引擎·cocos2d
gameboy0312 小时前
在Nginx上配置并开启WebDAV服务的完整指南
java·运维·nginx
!沧海@一粟!2 小时前
VMware升级操作指南与常见问题
linux·运维·服务器
早起CaiCai2 小时前
【Ocean modeling + book(一个章节)】海洋模型与业务化海洋学发展综述
学习
weixin_443478512 小时前
Flutter学习之导航与路由
java·学习·flutter
咕泡科技2 小时前
从0到1系统学习大模型:一份接地气的入门指南
人工智能·python·学习