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;
}

注意rootalias的区别------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_failsfail_timeout实现被动健康检查;如需主动健康检查,可考虑使用Nginx Plus或引入第三方模块(如nginx-upstream-check)。


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

性能优化建议

  • 调整worker_processes为CPU核心数(auto)。
  • 设置worker_connections为1024~65535之间,提高并发能力。
  • 开启sendfiletcp_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模块)。
相关推荐
新时代牛马14 小时前
Linux 定时任务:crontab、anacron 与systemd timer
linux·运维·服务器
疯狂打码的少年15 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php
网硕互联的小客服16 小时前
怎样在CMD里用chkntfs /x C: 命令来取消磁盘自检?——原理与实践全解
运维·服务器·网络
布莱克60516 小时前
Linux 常用命令详解:从入门到实战
linux·运维·服务器
自小吃多16 小时前
PCB Editor软件复制、改变、删除操作笔记
笔记·嵌入式硬件
学习路上_write17 小时前
Linux黑马命令学习
linux·运维·服务器
Android系统攻城狮17 小时前
Linux Gstreamer深度解析之gst_audio_channel_reorder_map调用流程与实战(十八)
linux·运维·服务器·音视频进阶·gstreamer音视频进阶
新时代牛马18 小时前
docker run 起不来?从dockerd、containerd 到runc 一条线讲透
运维·docker·容器
TomEval18 小时前
【App 自动化】14 - App 自动化基础与环境
运维·自动化
动词ing18 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习