一、初识Nginx:它是什么,为什么必备?

简单说,Nginx 是一款轻量级的 Web 服务器,就像互联网服务的“高效门卫”——专门负责接收用户的浏览器请求、合理分发任务给后端服务,最后把处理结果返回给用户。

它的三大优点让它成为互联网标配:

  • ⚡️ 高性能:C语言开发,采用事件驱动的异步非阻塞处理方式框架(不用等一个请求处理完再接下一个,能同时高效处理大量请求),具备极好的IO性能,轻松应对10万+并发
  • 💾 低消耗内存占用少,处理静态资源时,每万连接仅占用2.5MB左右内存,低配服务器也能稳定运行。
  • 🔧 高扩展:模块化设计,支持HTTP/2WebSocket等现代协议,能实现多种功能——静态资源托管、反向代理、负载均衡,还能做安全防护。

二、核心概念速通

2.1 Web服务器 vs 应用服务器

类型 核心职责 代表产品 典型场景 类比
Web服务器 直接处理HTTP请求,返回静态资源 Nginx、Apache 展示HTML、图片、CSS、JS等静态文件;
转发请求
超市货架,直接拿东西
应用服务器 运行业务逻辑,生成动态内容 Tomcat\JBoss 处理用户登录、订单提交等动态请求;
提供API服务
超市后厨,加工食材(处理请求)后再给你

小提示:现在很多应用服务器(比如Tomcat)也自带Web服务器功能,但处理静态资源的效率远不如Nginx。

2.2 正向代理 和 反向代理

代理的核心是“中间转发”,分清正向和反向,关键看“替谁干活”:
在这里插入图片描述

正向代理(forward proxy):替客户端“跑腿”
位于客户端目标服务器之间,客户端想访问目标服务器时,先把请求发给代理服务器,代理再转发请求、获取结果后返回给客户端。
典型例子:VPN(帮你突破网络限制,访问外网资源)、公司内网代理(帮内网电脑访问互联网)。
核心特点代理设置在客户端(比如你电脑上配置VPN),目标服务器只知道请求来自代理,不知道真实客户端IP。
优点:隐藏客户端IP、突破访问限制、缓存资源提高访问速度。

反向代理(reverse proxy):替服务器“接活”
客户端直接向网站域名发起请求,请求先到达反向代理服务器,再由代理转发给内网的Web服务器(比如Tomcat),服务器处理完后,通过代理把结果返回给客户端。
典型例子:负载均衡(把请求分给多台服务器)、网站静态资源代理。
核心特点代理设置在服务器端(用户看不到),客户端只知道访问的是代理服务器,不知道内网真实服务器的IP。
优点:隐藏服务器IP、分担服务器压力(负载均衡)、缓存资源提速、提供安全防护。

总结:看一个代理服务器是正向代理还是反向代理,要看是站在谁的角度来分析问题

正向代理 VS 反向代理

类型 通俗理解 例子
正向代理 替客户端干活(帮你访问目标服务器) VPN(帮你翻出去看外网)
反向代理 替服务器干活(帮服务器接请求) 快递柜(帮快递员收快递,你去柜里取)

三、Linux 下安装 Nginx

以最常用的CentOS系统为例,全程用命令行操作,复制粘贴即可完成(虚拟机、云服务器都适用)。

3.1 安装步骤

步骤1:安装依赖工具
Nginx运行需要gcczlib等工具,先一次性安装:

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

步骤2:下载并解压Nginx安装包

wget https://nginx.org/download/nginx-1.22.0.tar.gz  # 下载安装包
tar -zxvf nginx-1.22.0.tar.gz  # 解压
cd nginx-1.22.0  # 进入解压目录

步骤3:指定安装目录并编译安装
把Nginx安装到/usr/local/nginx(默认常用路径,方便后续管理):

./configure --prefix=/usr/local/nginx  # 安装到/usr/local/nginx
make && make install  # 编译并安装

步骤4:设置全局快捷命令
默认情况下,Nginx命令只能在安装目录的sbin文件夹下执行,设置软链接后,任何目录都能调用:

ln -s /usr/local/nginx/sbin/nginx /usr/bin/  # 建立软链接

步骤5:验证安装成功

nginx -v  # 查看Nginx版本

如果输出“nginx version: nginx/1.22.0”,说明安装成功!

3.2 Nginx目录结构速查

安装完成后,/usr/local/nginx目录下的核心文件结构:

/usr/local/nginx/
├── conf/           # 配置文件目录(最核心的nginx.conf在这里)
│   └── nginx.conf  # 主配置文件(所有功能都靠它配置)
├── html/           # 默认网站根目录(存放静态资源)
├── logs/           # 日志文件目录(访问日志、错误日志)
└── sbin/           # 可执行文件目录(nginx启动命令在这里)

3.3 常用Nginx命令(必记)

任何目录下都能执行这些命令,管理Nginx服务:

nginx -v          # 查看Nginx版本
nginx -t          # 测试配置文件是否正确(修改配置后必做)
nginx             # 启动Nginx服务
nginx -s stop     # 立即停止服务(不管正在处理的请求)
nginx -s quit     # 优雅停止(处理完当前请求再停止,推荐用这个)
nginx -s reload   # 重载配置文件(修改配置后生效,不用重启服务)

启动完成后查看nginx进程 ps -ef | grep nginx

3.4 常见问题处理

问题1:Windows下启动Nginx失败,报错“bind() to 0.0.0.0:80 failed”
原因:80端口被其他服务占用(最常见的是IIS服务)。
解决方案:以管理员身份打开cmd,输入命令关闭IIS服务:net stop w3svc
如果还是占用,可通过“netstat -ano | findstr :80”查找占用端口的进程,结束对应进程即可。

四、 核心配置文件详解:nginx.conf

Nginx 的所有功能都靠conf/nginx.conf配置,它的结构像 “套娃”,从外到内分 3 层,层层递进:

  1. 全局块:控制Nginx整体运行参数(比如工作进程数)
  2. events块:控制网络连接相关参数(比如最大连接数)
  3. http块:最核心的配置层,包含代理、缓存、虚拟主机等配置,可嵌套多个server块

完整配置文件

# 1. 全局块:Nginx整体配置
worker_processes  1;  # 工作进程数,建议设成CPU核心数(如4核就设4,充分利用资源)

# 2. events块:网络连接相关配置
events {
    worker_connections  1024;  # 每个进程最大连接数(1024足够新手用)
    # 最大并发连接数 ≈ 工作进程数 × 每个进程连接数
}

# 3. http块:核心配置层,可包含多个server(虚拟主机)
http {
    include   mime.types; # 引入文件类型映射表(告诉Nginx不同后缀的文件是什么类型)
    default_type  application/octet-stream; # 默认文件类型(未知类型时用这个)
    
    # sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off 
    sendfile        on; #开启高效文件传输模式(处理静态资源时必开,提速)
    keepalive_timeout  65; # 长连接超时时间(单位:秒),避免频繁建立连接
    client_max_body_size 10M;  # 设置最大请求体为 10MB,用于限制客户端请求体的最大大小。这个配置项主要用于处理文件上传和其他大数据量传输的场景。
    
    # 3.1 负载均衡配置(可选,多个服务器分工时用)
    upstream nginx-cluster{ # 定义集群名称(自定义,比如nginx-cluster)
        ip_hash;  # 负载均衡策略1:按客户端IP哈希分配,同IP固定访问一台服务器(解决会话保持问题)
        # hash $request_uri;  # 策略2:按URL哈希分配,相同URL固定访问一台服务器(缓存优化用)
        # hash_method crc32;  # 配合URL哈希的算法   
        #负载均衡策略3:fair(第三方);按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
        
        # 集群中的服务器列表,可配置多个
        server 192.168.200.129:8081 wight=3; # weight=3:权重3,承担3/4的请求
        server 192.168.200.129:8082 backup; # backup:备用服务器,其他服务器忙/down时才启用
        # 可选参数说明:
        # down:暂时剔除该服务器(不参与负载)
        # max_fails:允许请求失败的次数(默认1)
        # fail_timeout:失败后暂停访问的时间(比如30s)
    }
    
    # 3.2 server块:每一个server就是一个虚拟主机站点(一个server对应一个网站/服务),包括server全局块、location块
    server { 
        listen       80;#(HTTP默认端口,访问时可省略端口)
        server_name  localhost; # 域名(可填多个,用空格分隔,比如www.mysite.com localhost)
        # 当请求 localhost:80 时,该请求会被匹配进该代码块的server{}中执行                 

         # 3.3 location块:匹配请求路径,指定处理方式(核心中的核心)
        location / {
            root   html; # 网站根目录(对应/usr/local/nginx/html)
            index  index.html index.htm; # 默认索引文件(访问目录时优先找这些文件)
        }
        
        # 错误页面配置,当请求的文件不存在时,返回404错误页面          
        error_page 404 /404.html;  
        # 定义/40x.html的位置          
        location = /40x.html {              
             # 此处可以配置额外的指令,如代理、重写等,但在此配置中为空          
        }  

        
        # 错误页面配置,当发生500、502、503、504等服务器内部错误时,返回相应的错误页面
        error_page   500 502 503 504  /50x.html;
        # 定义/50x.html的位置  
        location = /50x.html {
            root   html;
        }
        
        # 动态请求匹配到path为'api'(如http://localhost/api)的就转发给nginx-cluster处理 
        location /api {
            proxy_pass http://nginx-cluster; # 负载均衡配置,请求会被平均分配到上面定义的集群
        }

       # ~表示以正则表达式进行匹配, (.*) 表示捕获MEDIA后的所有字符
       location ~/wemedia/MEDIA/(.*) {
        # 访问/wemedia/MEDIA/xxx时,转发到指定网关
        proxy_pass http://heima-wemedia-gateway/$1; # $1对应上面捕获的参数
        proxy_set_header HOST $host; # 保留原请求的主机名
        proxy_pass_request_body on; # 允许转发请求体(比如上传文件)
        proxy_pass_request_headers on; # 允许转发请求头
        proxy_set_header X-Real-IP $remote_addr; # 告诉后端 真实发出请求的客户端IP, $remote_addr用以记录客户端的ip地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理链路
    } 
 
        # 静态资源缓存:图片、文档等设置15天缓存(客户端本地缓存,减少服务器压力)
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        #对JavaScript和CSS文件设置缓存过期时间,客户端可以在24小时内使用本地缓存
        location ~ .*.(js|css)?$
        {
            expires 24h;
        }
        
        # 允许访问/.well-known目录下的所有文件(通常用于WebFinger、OAuth等协议验证  
        location ~ /.well-known {       
           allow all;    
         }
         
        # 禁止访问隐藏文件(即以点开头的文件或目录,比如.git,.env   
        location ~ /. {
                deny all;    
        }
        
        # 访问日志配置:记录所有访问请求到指定日志文件   
        access_log /user/logs/admin.log;                                    
    }
}

tip: http块可以配置多个server块(多个网站),每个server块中可以配置多个location块(不同路径的处理规则),灵活应对多服务场景。

五、Nginx实战配置:5个最常用场景

学会这5个实战配置,能覆盖80%的日常需求,

场景1:部署静态资源(HTML、图片、CSS等)

Nginx处理静态资源的效率远高于Tomcat,生产环境中,官网、博客等静态网站都用Nginx部署。

配置步骤

  1. 把静态文件(比如index.html、图片文件夹)放到/usr/local/nginx/html目录;
  2. 修改nginx.conf的server块:
server {
    listen 80;
    server_name www.mysite.com;  # 你的域名

    location / {
        root /usr/local/nginx/html;  # 静态文件存放目录
        index index.html;  # 默认首页(访问域名时直接显示index.html)
    }

    # 图片缓存30天,减少服务器压力
    location ~* \.(jpg|png|gif)$ {
        expires 30d;  # 浏览器缓存30天,减少服务器负载和用户等待时间
    }
}

修改完成后,执行nginx -t测试配置,再执行nginx -s reload生效,访问http://www.mysite.com就能看到静态页面了。

场景2:反向代理:隐藏真实服务器IP

比如你有一个Tomcat服务跑在192.168.1.100:8080,想让用户通过http://www.mysite.com访问(不用输8080端口),就用反向代理。

server {
    listen 80;
    server_name www.mysite.com;

    location / {
        proxy_pass http://192.168.1.100:8080;  # 转发到Tomcat
        proxy_set_header Host $host;  # 告诉Tomcat真实域名
        proxy_set_header X-Real-IP $remote_addr;  # 告诉Tomcat真实用户IP
    }
}

用户访问www.mysite.com时,完全感受不到Tomcat的存在,Nginx 会偷偷把请求转给 Tomcat,再把结果返回给用户。用户看不到真实服务器地址。

场景3:负载均衡:多服务器分担压力

如果网站访问量很大,一台服务器扛不住,就用多台服务器组成“集群”,让Nginx把请求均匀分发出去。

http {
    # 定义服务器集群(叫mycluster)
    upstream mycluster {
        server 192.168.1.100:8080 weight=3;  # 权重3(承担3/4请求)【性能好的服务器权重设置高】
        server 192.168.1.101:8080;  # 权重默认1(承担1/4请求)
    }

    server {
        listen 80;
        server_name www.mysite.com;

        location / {
            proxy_pass http://mycluster;  # 转发到集群
        }
    }
}

这样,4 个请求中,3 个会发给 100 服务器,1 个发给 101 服务器,有效分担单台服务器的压力。

场景4:配置HTTPS(加密传输,让网址显示小绿锁)

HTTPS是安全的HTTP协议,需要SSL证书(阿里云、腾讯云可申请免费证书),配置后网址会显示“小绿锁”,保护用户数据传输安全。

server {
    listen 443 ssl; # 监听443端口(HTTPS默认端口)
    server_name example.com; # 你的域名
    
    # 替换成你的SSL证书和私钥路径(从证书服务商处获取)
    ssl_certificate /path/to/your/fullchain.pem; # 证书公钥文件
    ssl_certificate_key /path/to/your/private.key;# 证书私钥文件
    
    ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议版本(安全且兼容)
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # 加密套件
    ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件
    
    location / {
        root /path/to/your/https/static/files; # HTTPS对应的静态文件目录
        index index.html index.htm;
    }
}

配置完成后,访问https://example.com就能看到小绿锁了。如果需要强制HTTP跳转到HTTPS,可以再添加一个80端口的server块:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;  # 强制跳转到HTTPS
}

场景五:安全防护配置

server {
    listen 80;
    server_name example.com;
    location / {
        # 防止 SQL 注入等攻击
        rewrite ^/(.*)$ /index.php?param=$1 break;
        # 限制请求方法,只允许 GET 和 POST
        if ($request_method !~ ^(GET|POST)$ ) {
          return 444;
        }
        # 防止跨站请求伪造
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";
        add_header X-XSS-Protection "1; mode=block";
    }
}

通过 rewrite 指令,可以防止一些常见的 Web 攻击,如 SQL 注入。这种限制请求方法,可以减少服务器被恶意利用的风险。同时,添加了一些 HTTP 头部来增强浏览器安全,如防止点击劫持和跨站脚本攻击(XSS)等。

六、负载均衡策略详解

Nginx支持多种负载均衡策略,根据业务场景选择合适的即可,用表格清晰总结:

策略 配置指令 核心特点 适用场景
轮询 默认(无需额外指令) 均匀分配请求给每台服务器 所有服务器性能相近,无会话保持需求
权重 weight=数值 按权重分配,权重越高,收到的请求越多 服务器性能差异大(高配置服务器权重高)
IP哈希 ip_hash 同一客户端IP固定访问一台服务器 需要会话保持(比如用户登录后不能切换服务器)
最少连接 least_conn 请求优先分配给当前连接数最少的服务器 长连接服务(比如WebSocket)
URL哈希 hash $request_uri 相同URL固定服务器 静态资源缓存优化(同一资源只缓存一次)
响应时间 fair 请求优先分配给响应速度最快的服务器 对响应速度要求高的场景(需安装第三方模块

常用策略配置示例

1. 权重策略(最常用)

upstream backend {
    server backend1.example.com weight=3; # 设置backend1的权重为3
    server backend2.example.com; # backend2的权重为默认值1
    server backend3.example.com weight=5; # 设置backend3的权重为5
}

2. IP哈希策略(会话保持)

upstream backend {
    ip_hash; # 启用IP哈希算法
    server backend1.example.com;
    server backend2.example.com;
}

3. URL哈希策略(缓存优化)

upstream backend {
    hash $request_uri; # 启用URL哈希算法
    server backend1.example.com;
    server backend2.example.com;
}

根据请求的URL哈希值来决定将请求发送到backend1还是backend2。

4. fair 响应时间策略

upstream backend {
    fair; # 启用公平调度算法
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

七、性能优化技巧

通过简单的配置调整,就能大幅提升Nginx的性能,
1. 工作进程优化(充分利用CPU)

worker_processes auto;  # 自动匹配CPU核心数(比手动设置更灵活)
worker_cpu_affinity auto;  # CPU亲和性(让进程绑定CPU核心,减少切换开销)

2. 连接数优化(提高并发能力)

events {
    worker_connections 10000;  # 提高每个进程的最大连接数(根据服务器配置调整)
    use epoll;  # Linux高性能事件模型(处理高并发的关键)
}

3. 缓冲优化(减少I/O开销)

http {
    proxy_buffers 16 32k;  # 代理缓冲区大小(16个32KB的缓冲区)
    proxy_buffer_size 64k;  # 代理缓冲区默认大小
}

4. Gzip压缩(减少传输体积)

http {
    gzip on;  # 开启Gzip压缩
    gzip_types text/plain text/css application/json application/javascript;  # 压缩的文件类型
    gzip_min_length 1024;  # 小于1KB的文件不压缩(避免浪费资源)
    gzip_comp_level 6;  # 压缩级别(1-9,级别越高压缩率越高,但CPU消耗越大)
}

八、常见问题解决方案

问题1:端口冲突(80/443端口被占用)

# 1. 查找占用80端口的进程
sudo lsof -i :80

# 2. 停止冲突的服务(比如Apache)
sudo systemctl stop apache2

# 3. 如果无法停止冲突服务,修改Nginx监听端口(比如把80改成8081)
server {
    listen 8081;  # 改为未被占用的端口
    # 其他配置不变
}

问题2:静态资源访问403(权限不足)

403错误通常是目录/文件权限不足,或Nginx用户没有访问权限:

# 1. 给静态资源目录设置正确权限
chmod -R 755 /usr/local/nginx/html  # 755:所有者可读写执行,其他人可读可执行

# 2. 确认Nginx用户权限(修改nginx.conf的全局块)
user www-data;  # 确保该用户有访问静态资源目录的权限

问题3:负载均衡时请求分发不均

# 1. 检查服务器健康状态,确保所有服务器正常运行
# 2. 调整负载策略(比如改用least_conn)
upstream backend {
    least_conn;  # 优先分配给连接数最少的服务器
    server backend1:80 max_fails=3 fail_timeout=30s;  # 失败3次后,30秒内不再分配
    server backend2:80 max_fails=3 fail_timeout=30s;
}

九、最佳实践总结

1. 分层配置:让配置更易维护

不建议把所有配置都写在nginx.conf里,推荐分层配置(Linux系统):

/etc/nginx/
├── nginx.conf          # 主配置(全局、events、http基础配置)
├── conf.d/             # 通用配置(比如Gzip、负载均衡)
├── sites-available/    # 可用站点配置(所有网站的配置都放这里)
└── sites-enabled/      # 启用的站点(通过软链接关联sites-available的配置)

好处:新增/删除网站时,只需操作sites-enabled的软链接,不用修改主配置。

2. 安全加固:避免被攻击

  • 定期更新Nginx版本,修复安全漏洞;
  • 禁用不必要的模块(编译安装时用--without-模块名);
  • 配置WAF(比如ModSecurity),防御SQL注入、XSS等攻击;
  • 禁止访问隐藏文件(前面配置过的location ~ /. { deny all; })。

3. 监控与日志:及时发现问题

http {
    # 访问日志:用JSON格式,便于分析
    access_log /var/log/nginx/access.log json;
    # 错误日志:只记录警告及以上级别,减少日志体积
    error_log /var/log/nginx/error.log warn;

    # 启用Nginx状态监控(仅允许本地访问)
    location /nginx_status {
        stub_status;  # 显示连接数、请求数等状态
        allow 127.0.0.1;  # 允许本地访问
        deny all;  # 禁止外部访问
    }
}

访问http://localhost/nginx_status,就能看到Nginx的运行状态。

4. 性能测试工具:

# 1. Apache Bench(ab):压力测试工具(测试10000个请求,并发100)
ab -n 10000 -c 100 http://test.site/

# 2. 查看Nginx编译参数(确认启用的模块)
nginx -V

# 3. 查看完整配置(包括引入的其他文件)
nginx -T

总结与后续学习方向
通过本文,可以掌握Nginx的核心概念、安装配置、实战场景和优化技巧,足以应对日常开发中的大部分需求。

如果想进一步深入,可以学习这些方向:

  • OpenResty:基于Nginx的Lua扩展,实现更复杂的业务逻辑(比如接口限流、灰度发布);
  • Nginx集群:多台Nginx部署,实现高可用(避免单点故障);
  • 日志分析:用ELK栈(Elasticsearch、Logstash、Kibana)分析Nginx日志,监控系统状态。
    Nginx的核心是“简单高效”,新手不用追求一次性掌握所有功能,先把基础配置和实战场景用熟,再逐步深入即可~
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐