Nginx 从入门到精通教学笔记

目录

一、初识 Nginx:什么是 Nginx?为什么要学?

1. 什么是 Nginx?

2. 为什么需要学习 Nginx?

二、Nginx 基础入门

1. 安装 Nginx(以 Linux 为例)

包管理器安装(推荐新手)

2. Nginx 基本操作命令

3. 核心配置文件解析(nginx.conf)

4.NGINX相关的目录结构

三、反向代理

1.正向代理

1.1正向代理概念(替客户端 “跑腿”)

1.2正向代理理解图

1.3正向代理核心配置文件

2.反向代理

2.1反向代理概念(替服务器 “接客”)

2.2反向代理理解图

2.3反向代理核心配置文件

四、负载均衡

1.概念

2. 原理图

3.负载均衡核心配置文件

4.负载均衡策略

五、动静分离

1.概念

2.原理图

3.动静分离核心配置文件

4.常见配置场景扩展

场景 1:静态资源部署在独立服务器(而非 Nginx 本地)

场景 2:匹配特定路径的静态资源(而非后缀)

场景 3:动态资源是 PHP 服务(如 WordPress)

大家好我是南山,今天带来的文档是nginx教学,有问题的小伙伴评论区留言哦,或者加qq群qq群里交流也行呢,我在哔哩哔哩上会发视频教学,感兴趣的同学也可以前去观看哦

qq群:614457375      哔站:GD-南山

一、初识 Nginx:什么是 Nginx?为什么要学?

1. 什么是 Nginx?

Nginx是一款高性能的 HTTP 服务器、反向代理服务器、负载均衡器

  • 核心特点:轻量级、占用资源少、并发能力强(单台服务器可支持数万并发连接)。
  • 功能场景:静态资源托管、反向代理、负载均衡、动静分离等。

2. 为什么需要学习 Nginx?

  • 性能优势:相比 Apache,Nginx 采用「异步非阻塞」架构,处理高并发场景更高效(尤其适合静态资源和反向代理)。
  • 广泛应用:互联网公司(如阿里、腾讯、百度)、云服务(如 AWS、阿里云)均大量使用
  • 功能全面:集 web 服务器、反向代理、负载均衡等功能于一体,简化架构设计。
  • 就业需求:后端开发、前端开发、运维工程师等等必备技能,招聘中高频出现。

二、Nginx 基础入门

1. 安装 Nginx(以 Linux 为例)

包管理器安装(推荐新手)
# Ubuntu/Debian
sudo apt update && sudo apt install nginx

# CentOS/RHEL
sudo yum install nginx  # 或 dnf install nginx

# centos7需要添加nginx仓库:   sudo yum install epel-release -y

2. Nginx 基本操作命令

# 启动
sudo systemctl start nginx  # 包管理器安装


# 停止
sudo systemctl stop nginx


# 重启(配置文件修改后生效)
sudo systemctl restart nginx


#热加载配置文件(平滑重启)
sudo systemctl reload nginx
sudo nginx -s reload


# 查看状态
sudo systemctl status nginx


# 验证配置文件是否正确
nginx -t  # 包管理器安装

3. 核心配置文件解析(nginx.conf

默认路径:

  • 包管理器安装:/etc/nginx/nginx.conf
    # 全局块:配置影响整个 Nginx 的参数
    user nginx;  # 运行 Nginx 的用户
    worker_processes auto;  # 工作进程数(建议设为 CPU 核心数或 auto)
    error_log /var/log/nginx/error.log;  # 错误日志路径
    pid /run/nginx.pid;  # 进程 ID 文件
    
    # 事件块:配置网络连接相关参数
    events {
        worker_connections 1024;  # 单个工作进程的最大连接数
        use epoll;  # 高效的事件驱动模型(Linux 推荐)
    }
    
    # HTTP 块:配置 HTTP 服务器的核心参数
    http {
        include /etc/nginx/mime.types;  # 媒体类型映射
        default_type application/octet-stream;
    
        # 日志格式定义
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
        a***ess_log /var/log/nginx/a***ess.log main;  # 访问日志路径
    
        sendfile on;  # 启用高效文件传输模式
        tcp_nopush on;  # 优化 TCP 传输
        tcp_nodelay on;
        keepalive_timeout 65;  # 长连接超时时间
        types_hash_max_size 4096;
    
        include /etc/nginx/conf.d/*.conf;  # 引入子配置文件(推荐按站点拆分)
    
        # 服务器块:配置单个站点(可多个)
        server {
            listen 80;  # 监听端口
            server_name localhost;  # 域名(如 example.***)
            root /usr/share/nginx/html;  # 网站根目录
            index index.html index.htm;  # 默认首页
    
            # location 块:匹配 URL 路径,配置请求处理规则
            location / {
                try_files $uri $uri/ =404;  # 尝试访问文件/目录,否则返回 404
            }
        }
    }

4.NGINX相关的目录结构

下图圈起来的需要熟悉

三、反向代理

1.正向代理

1.1正向代理概念(替客户端 “跑腿”)

正向代理就像「客户端的专属跑腿小弟」:你(客户端)想访问某个目标服务器(比如外网网站),但因为网络限制(如内网不能直接上外网)或不想暴露自己的 IP,就把请求交给「代理服务器」,由代理服务器帮你去访问目标服务器,拿到结果后再转发给你。

关键:你必须明确知道「代理服务器的地址」,并手动配置到浏览器 / APP 中(比如设置 HTTP 代理)。

1.2正向代理理解图
┌───────────┐       ┌───────────────┐       ┌───────────────┐
│  客户端    │       │  正向代理服务器  │       │  目标服务器    │
│ (你/浏览器)│◄────►│ (Nginx/Proxy) │◄────►│ (外网网站/服务)│
└───────────┘       └───────────────┘       └───────────────┘
       ▲                    ▲                    ▲
       │                    │                    │
       │  1. 客户端配置代理  │  2. 代理替客户端请求  │  3. 目标服务器只看到代理IP
       │  (知道代理存在)  │  (隐藏客户端真实IP)  │  (不知道真实客户端)
1.3正向代理核心配置文件
server {
        listen 8080;  # 代理服务器监听端口(客户端要连接这个端口)
        
        # 正向代理HTTP请求
        location / {
            proxy_pass $scheme://$http_host$request_uri;  # 转发请求到目标服务器
            proxy_set_header Host $http_host;  # 传递原始主机名
            proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP(可选)
        }
}

2.反向代理

2.1反向代理概念(替服务器 “接客”)

用户(客户端)想访问某个服务(比如 www.xxx.***),但他不知道后端有多少台服务器在提供服务 —— 他只需要访问「代理服务器」(对外暴露的唯一 IP / 域名),由代理服务器根据规则(如负载均衡、路径匹配),把请求转发给后端的某台服务器,服务器处理完后,再由代理把结果返回给用户。

关键:用户完全不知道后端有多少台服务器,只感知到代理服务器的存在(甚至感知不到,因为代理的域名就是网站本身的域名)。

2.2反向代理理解图
┌───────────┐       ┌───────────────┐       ┌───────────────┐
│  客户端              反向代理服务器           后端服务器集群  
│(用户/浏览器)◄────► (Nginx/Proxy)◄────►    服务器:8080  
└───────────┘       └───────────────┘       ├───────────────┤
                                         
       ▲                    ▲                         ▲
       │                    │                         │
       │ 1. 客户端只访问代理  │  2. 代理转发请求到后端   │  3. 后端服务器只看到代理IP
       │  (不知道后端集群)  │  (实现负载均衡/高可用)  │  (不知道真实客户端)
2.3反向代理核心配置文件

   server {
        listen 80;  # Nginx代理监听80端口(用户访问此端口)
        server_name localhost;  # 本地测试用localhost,服务器可改公网IP/域名

        # 核心反向代理:所有请求直接转发到指定后端服务器
        location / {
            # proxy_pass 后面直接跟后端服务器地址(IP:端口,我随便写的192.168.3.100:8080)
            proxy_pass http://192.168.3.100:8080;  

            # 可选但实用的配置(传递关键信息给后端,不影响核心代理功能)
            proxy_set_header Host $host;  # 把用户访问的域名/IP传给后端
            proxy_set_header X-Real-IP $remote_addr;  # 把用户真实IP传给后端(方便后端日志排查)
    
    }
}

四、负载均衡

1.概念

Nginx 负载均衡的核心是 “分发请求、分摊压力” —— 通过 Nginx 作为统一入口,将海量客户端请求均匀转发到后端多台服务器,避免单台服务器过载。

2. 原理图

┌───────────┐       ┌───────────────┐       ┌───────────────┐
│  客户端              Nginx负载均衡器          后端服务器集群  
│(用户/浏览器)◄────►   (统一入口)  ◄────►    服务器A:8081  
└───────────┘       └───────────────┘       ├───────────────┤
                                            │  服务器B:8082 
                                            ├───────────────┤
                                            │  服务器C:8083 
                                            └───────────────┘
       ▲                    ▲                         ▲
       │                    │                         │
       │ 1. 客户端只访问代理  │  2. Nginx按规则分发请求  │  3. 后端服务器处理后
       │  (不知道后端集群)  │  (避免单台过载)        │    结果通过Nginx返回

关键流程说明:
1. 客户端只知道 Nginx 的地址(如 www.xxx.***),所有请求都发送给 Nginx;
2. Nginx 内部维护 “后端服务器列表”,根据预设的负载均衡策略(如轮询、权重)选择一台后端服务器;
3. 后端服务器处理请求后,将结果返回给 Nginx,再由 Nginx 转发给客户端;
4. 若某台后端服务器故障(如 8082 端口不可用),Nginx 会自动剔除它,后续请求不再转发(实现高可用)。

3.负载均衡核心配置文件

# 1. 定义后端服务器集群(名称:backend_servers,可自定义)
upstream backend_servers {
    # 后端服务器1:IP+端口,权重3(接收3份请求)
    server 192.168.3.10:8081 weight=3 max_fails=3 fail_timeout=30s;
    # 后端服务器2:IP+端口,权重2(接收2份请求)
    server 192.168.3.11:8082 weight=2 max_fails=3 fail_timeout=30s;
    # 后端服务器3:IP+端口,权重1(接收1份请求),down表示手动下线(临时维护用)
    # server 192.168.3.12:8083 weight=1 down;
}

# 2. Nginx负载均衡器配置(对外暴露的服务)
server {
    listen 80;  # 监听80端口(HTTP默认端口,用户直接访问)
    server_name www.xxx.***;  # 对外域名(本地测试用localhost,服务器用公网IP/域名)

    # 3. 所有请求转发到后端集群(核心负载均衡规则)
    location / {
        proxy_pass http://backend_servers;  # 转发到上面定义的集群(必须和upstream名称一致)
        
        # 可选但关键的参数(传递客户端信息给后端,便于排查)
        proxy_set_header Host $host;  # 传递用户访问的域名
        proxy_set_header X-Real-IP $remote_addr;  # 传递用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链IP(多代理场景)
        
        # 连接超时配置(避免后端卡死后Nginx一直等待)
        proxy_connect_timeout 10s;  # 连接后端超时时间
        proxy_read_timeout 30s;  # 读取后端响应超时时间
    }
}

4.负载均衡策略

五、动静分离

1.概念

Nginx 动静分离是 “静态资源由 Nginx 直接处理,动态请求转发给后端服务器” 的架构设计,核心目的是 减轻后端服务器压力、提升访问速度(Nginx 处理静态资源的性能是后端 Tomcat/Java 服务的 10 倍以上)。

2.原理图

┌─────────────┐        ┌─────────────────────────────┐
│  客户端集群                   Nginx服务器         
│(用户/浏览器) ◄─────►  (动静分离核心:路由分发)  
└─────────────┘        └─────────────┬───────────────┘
                                     │
                   ┌─────────────────┴─────────────────┐
                   ▼                                   ▼
┌─────────────────────────┐               ┌─────────────────────────┐
│  静态资源(Nginx本地/CDN)                 动态服务集群(后端服务器) 
│  (/usr/share/nginx/static)               (Tomcat/Java/PHP服务) 
│   图片、CSS、JS、HTML)                      登录、查询、订单等逻辑 
└─────────────────────────┘               └─────────────────────────┘

### 关键流程说明:
1. 客户端发送请求到Nginx(统一入口);
2. Nginx根据「请求路径/文件后缀」判断资源类型:
   - 若为静态资源(如 `http://xxx.***/img/logo.png`):Nginx直接从本地目录或CDN读取文件,返回给客户端(不经过后端);
   - 若为动态请求(如 `http://xxx.***/api/user/info`):Nginx转发请求到后端服务器,后端处理后通过Nginx返回结果;
3. 全程客户端只与Nginx交互,无感知资源来源(本地/后端)。

3.动静分离核心配置文件

http {
    # 可选:配置静态资源缓存(生产环境推荐,减少重复请求)
    proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:10m max_size=10g inactive=7d use_temp_path=off;

    server {
        listen 80;
        server_name www.xxx.***;  # 本地测试用localhost,服务器用公网IP/域名

        # #######################
        # 1. 处理静态资源(核心规则)
        # 匹配后缀:jpg/png/css/js等静态文件,直接返回
        # #######################
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|html|txt|pdf|mp4)$ {
            root /usr/share/nginx/static;  # 静态资源的本地根目录(上面准备的目录)
            expires 7d;  # 缓存7天(浏览器会本地缓存,7天内不重复请求Nginx)
            add_header Cache-Control "public, max-age=604800";  # 缓存控制头(秒=7*24*3600)
            proxy_cache static_cache;  # 启用上面定义的缓存(可选)
            proxy_cache_valid 200 304 7d;  # 200/304状态码缓存7天
            try_files $uri =404;  # 找不到文件返回404,避免转发到后端
        }

        # #######################
        # 2. 处理动态资源(核心规则)
        # 匹配路径:/api/ 开头的请求(如接口),转发到后端服务器
        # #######################
        location /api/ {
            proxy_pass http://192.168.3.10:8080;  # 后端动态服务地址(替换为你的真实地址)
            
            # 传递客户端信息给后端(必配,便于日志排查)
            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_cache off;
            expires -1;
        }

        # #######################
        # 3. 默认规则(可选)
        # 其他未匹配的请求,可转发到后端或返回首页
        # #######################
        location / {
            root /usr/share/nginx/html;  # Nginx默认首页目录
            index index.html index.htm;
        }
    }
}

4.常见配置场景扩展

场景 1:静态资源部署在独立服务器(而非 Nginx 本地)

若静态资源较多,可单独部署到静态服务器(如 192.168.3.20:80),Nginx 转发静态请求到该服务器:

# 静态资源转发到独立静态服务器(替换本地root配置)
location ~* \.(jpg|png|css|js)$ {
    proxy_pass http://192.168.3.20:80;  # 静态服务器地址
    expires 7d;
    proxy_cache static_cache;
}
场景 2:匹配特定路径的静态资源(而非后缀)

比如 /static/ 路径下的所有资源都视为静态资源:

location /static/ {
    root /usr/share/nginx;  # 实际路径是 /usr/share/nginx/static/
    expires 7d;
    try_files $uri =404;
}
# 访问 http://xxx.***/static/img/logo.png → 对应 /usr/share/nginx/static/img/logo.png
场景 3:动态资源是 PHP 服务(如 WordPress)
# 匹配.php后缀的动态请求,转发到PHP-FPM服务(默认9000端口)
location ~ \.php$ {
    root /usr/share/nginx/html;  # PHP项目根目录
    fastcgi_pass 127.0.0.1:9000;  # PHP-FPM地址
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;  # 加载PHP-FPM参数配置(yum安装默认存在)
}
转载请说明出处内容投诉
CSS教程网 » Nginx 从入门到精通教学笔记

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买