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模块)。
相关推荐
因_崔斯汀1 小时前
Nginx 开启 Gzip 完整配置
nginx
一个处女座的程序猿1 小时前
Computer之Server:caddy(可扩展的服务器平台)的简介、安装和使用方法、案例应用之详细攻略
运维·服务器·server·caddy
RisunJan1 小时前
Linux命令-whoami(显示当前有效用户名)
linux·运维·chrome
_Narcissus_2 小时前
二分算法笔记及例题
数据结构·c++·笔记·算法·蓝桥杯·查找·二分算法
Hammer_Hans2 小时前
DFT笔记112
笔记
angushine2 小时前
Docker部署镜像管理
运维·docker·容器
FAREWELL000752 小时前
学习笔记-热更新导航
笔记·学习
潘正翔2 小时前
jenkins构建cicd流水线
运维·服务器·ci/cd·容器·自动化·jenkins·cicd
可莉丝婷2 小时前
光模块产线自动化设备品牌推荐:艾利特选型指南
运维·自动化