Nginx 笔记

1 Nginx 概述

为什么选择 Nginx

  • 高性能 & 高并发:采用事件驱动(epoll)和异步非阻塞架构,单机可轻松支撑数万并发连接,远优于传统的多进程/多线程模型。
  • 反向代理:隐藏后端真实服务,提供统一的请求入口,同时可配合缓存、压缩、安全过滤等增强能力。
  • 负载均衡:支持多种分发策略(轮询、权重、IP哈希、最少连接等),有效分摊后端压力,提升系统整体吞吐量。
  • 静态内容处理 :对静态文件(HTML、CSS、JS、图片等)的处理效率极高,且支持sendfile零拷贝技术,大幅降低CPU和内存开销。
  • 高可靠性 & 热部署:进程模型采用Master-Worker架构,支持平滑升级和配置热加载,无需中断服务。

2 虚拟主机配置

虚拟主机允许在同一台服务器上运行多个不同域名或端口的站点。

基础示例:

nginx 复制代码
server {
    listen       80;                 # 监听端口
    server_name  localhost;          # 域名或IP,支持通配符 *.example.com
    location / {
        root   html;                 # 静态资源根目录
        index  index.html index.htm; # 默认首页顺序
    }
}

多虚拟主机配置(基于域名区分):

nginx 复制代码
server {
    listen 80;
    server_name www.site1.com;
    root /var/www/site1;
}

server {
    listen 80;
    server_name www.site2.com;
    root /var/www/site2;
}

小技巧 :生产环境建议将每个server块独立成.conf文件,通过include引入,便于管理和维护。


3 location 匹配规则

语法结构

location [修饰符] /uri/ { ... }

修饰符详解:

修饰符 含义 优先级
= 精确匹配,完全一致才命中 最高
^~ 路径前缀匹配,命中后不再检查正则 次高
~ 区分大小写的正则匹配 第三
~* 不区分大小写的正则匹配 第三
无修饰符 普通前缀匹配(最长匹配原则) 最低
!~ / !~* 正则不匹配(少用,通常用于排除) ---

匹配优先级总结 :

精确匹配(=) > ^~ > 正则(~, ~*) > 普通前缀(最长匹配) > 默认/

配置示例及说明:

nginx 复制代码
# 1. 精确匹配首页,访问 / 时走此规则
location = / {
    root /usr/local/nginx/html;
}

# 2. 前缀匹配,访问 /static/ 下的任何路径都走这里
location ^~ /static/ {
    root /usr/local/nginx/html8088;
}

# 3. 正则匹配静态资源扩展名(不区分大小写)
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /usr/local/nginx/html8088;
    expires 30d;   # 开启浏览器缓存30天
}

# 4. 排除某些URL(不匹配 .do 结尾的请求)
location !~ \.do$ {
    try_files $uri $uri/ =404;
}

注意 :root和alias的区别------root会将location中的URI追加到路径后,而alias会替换掉匹配的部分,使用时容易混淆,建议优先用root。


4 反向代理配置

反向代理将客户端请求转发给内部后端服务,并返回响应。

基本用法:

nginx 复制代码
location / {
    proxy_pass http://localhost:8090/;
}

常用代理参数(推荐配置):

nginx 复制代码
location / {
    proxy_pass http://backend_server;
    proxy_set_header Host $host;                      # 传递原始Host
    proxy_set_header X-Real-IP $remote_addr;         # 传递真实客户端IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    proxy_buffering on;                              # 开启缓冲,提升性能
    proxy_http_version 1.1;                          # 支持长连接
    proxy_set_header Connection "";
}

代理WebSocket(如需支持长连接):

nginx 复制代码
location /ws/ {
    proxy_pass http://websocket_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

5 负载均衡配置

upstream 定义后端集群:

nginx 复制代码
upstream myapp {
    # 轮询(默认)
    server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;

    # 可选:备用服务器(其他服务器都挂时启用)
    server 192.168.122.135:8080 backup;
}

常用负载均衡策略:

策略 关键字 说明
轮询 默认 按顺序轮流分配
权重轮询 weight 权重越高分配比例越大
IP哈希 ip_hash; 同一客户端IP固定访问同一台后端,用于会话保持
最少连接 least_conn; 转发给当前连接数最少的服务器
一致性哈希 hash $request_uri consistent; 按URL哈希,适合缓存场景

完整配置示例:

nginx 复制代码
upstream backend {
    ip_hash;  # 保持会话一致性
    server 192.168.122.133:8080 weight=3;
    server 192.168.122.134:8080 weight=2;
    server 192.168.122.135:8080 weight=1 max_fails=3 fail_timeout=20s;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        include /etc/nginx/proxy_params;  # 统一代理参数文件
    }
}

健康检查 :Nginx社区版通过max_fails和fail_timeout实现被动健康检查;如需主动健康检查,可考虑使用Nginx Plus或引入第三方模块(如nginx-upstream-check)。


6 补充:性能优化与安全加固(新增)

性能优化建议:

  • 调整worker_processes为CPU核心数(auto)。
  • 设置worker_connections为1024~65535之间,提高并发能力。
  • 开启sendfile和tcp_nopush,提升静态文件传输效率。
  • 启用Gzip压缩,减少传输数据量。
nginx 复制代码
worker_processes auto;
events {
    worker_connections 10240;
    use epoll;
}
http {
    sendfile on;
    tcp_nopush on;
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}

安全加固建议:

  • 隐藏Nginx版本号:server_tokens off;
  • 限制请求方法:if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }
  • 设置安全Header:add_header X-Frame-Options "SAMEORIGIN" always;
  • 限制IP访问或请求频率(使用limit_req_zone模块)。
相关推荐
ai小陈12 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
by2099914 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
有毒的教程15 小时前
VMware仅主机模式:物理机 ↔ 虚拟机 文件共享
运维
笑鸿的学习笔记15 小时前
C++笔记之大块顺序写
java·c++·笔记
山岚的运维笔记17 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
海宇大数据18 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化远程公证会话初始化网关
运维·人工智能·架构·自动化
lisanmengmeng18 小时前
Nagios邮件报警的配置
linux·运维·服务器
Ruiery18 小时前
Linux 6.6内核 CPU 深度解析(六):cpufreq
linux·运维·服务器
天远数科19 小时前
零信任架构实战:基于天远全能消金报告构建自动化消费分期网关
运维·人工智能·架构·自动化
硅基手札19 小时前
【linux内核专栏 08】时间与定时器
linux·运维·服务器