学习Linux——工具——nginx

NGINX工具讲解

前言

本篇文章适合纯小白,新手参考学习

Nginx(发音 "engine x")是一款高性能、轻量级的 HTTP 服务器、反向代理服务器和负载均衡器。凭借 高并发、低内存占用、稳定性强 的核心优势,它已成为互联网架构中的核心组件 ------ 无论是中小型网站的静态资源服务,还是大型分布式系统的反向代理与负载均衡,Nginx 都能轻松胜任。

本文将从基础概念、安装配置、核心功能到实战场景,带你学习 Nginx。

一、Nginx 核心优势与应用场景

1.1 为什么选择 Nginx?

相比 Apache、IIS 等传统服务器,Nginx 的核心优势集中在「性能」和「灵活性」:

  • 高并发支持:单台服务器可轻松支撑 10 万 + 并发连接(Apache 通常仅能支撑数千级),核心原因是 Nginx 采用「事件驱动(epoll)」模型,而非传统的「多进程 / 多线程」模型,资源占用极低。
  • 多核心功能:集静态资源服务、反向代理、负载均衡、动静分离、SSL 终结、缓存等功能于一体,无需额外部署其他组件。
  • 跨平台与稳定性:支持 Linux、Windows、FreeBSD 等系统,运行时内存占用通常在几 MB 到几十 MB,7x24 小时运行故障率极低。
  • 配置简单灵活:配置文件语法清晰,支持动态加载配置(无需重启服务),可快速适配不同业务场景。

1.2 典型应用场景

  1. 静态资源服务器:直接提供 HTML、CSS、JavaScript、图片、视频等静态文件(最常用场景,性能远超 Apache)。
  2. 反向代理:隐藏后端业务服务器 IP,将用户请求转发至后端服务(如 Java Spring Boot、Python Django 应用),实现请求隔离与安全防护。
  3. 负载均衡:将高并发请求分发至多台后端服务器,避免单台服务器过载,提升系统可用性与吞吐量。
  4. 动静分离:静态资源(图片、CSS)由 Nginx 直接处理,动态请求(接口调用、数据查询)转发至后端应用服务器,减少后端压力。
  5. SSL 终结:统一处理 HTTPS 证书解密,后端服务无需关心 SSL 协议,降低后端复杂度。
  6. 缓存加速:缓存后端高频访问的响应结果,下次请求直接返回缓存数据,提升响应速度。
  7. 限流与防盗链:限制单 IP 访问频率,防止恶意请求;禁止第三方网站盗用自身静态资源(如图片、视频)。

二、安装NGINX

nginx官方参考文档:nginx 文档

2.1方法一:yum/dnf安装

前提条件:保证仓库配置完成,可参考《学习Linux------软件管理》中仓库相关内容,使用命令dnf install -y nginx进行一键式安装。

当显示Complete时,表示完成安装,如下图所示:

Installed:后续表示安装了以下三个内容

  • nginx:nginx 主程序(x86_64 架构,版本 2:1.20.1-22.el9)
  • nginx-core:nginx 的核心功能组件(和主程序版本一致)
  • nginx-filesystem:nginx 需要的目录 / 文件权限配置(noarch 表示 "不区分架构")

2.2方法二:使用rpm进行安装(适合定制化)

安装依赖包:dnf install gcc-c++ pcre-devel zlib-devel openssl-devel -y

从官网下载地址选择自己需要的包,右键复制内容nginx: download

本篇内容使用的1.28.0:https://nginx.org/download/nginx-1.28.0.tar.gz,

使用命令:wget https://nginx.org/download/nginx-你自己的版本号.tar.gz,通过ls命令我们发现已经获取压缩包nginx-1.28.0.tar.gz

进行解压到指定目录,并开始编译配置nginx模块(自定义内容)

使用tar -zxf nginx-1.28.0.tar.gz -C /usr/local/ && cd /usr/local/nginx-1.28.0命令进行解压到指定目录,并切换到那个目录。

bash 复制代码
#创建nginx用户(安全需要,可选择,如果没有下面的配置中需取消用户相关内容)
groupadd nginx  # 创建 nginx 用户组
useradd -g nginx -s /sbin/nologin -M nginx  # 创建 nginx 用户(-s 禁止登录,-M 不建家目录,更安全)

「最小权限隔离 + 安全防护」 ------ 简单说就是不让 Nginx 用最高权限(root)运行,避免漏洞被利用后危害整个系统,从操作者视角拆解具体作用:

  1. 避免 root 权限泄露(最核心安全作用)
  • 若不创建专属用户,Nginx 会默认用 root 用户运行(系统最高权限);
  • 一旦 Nginx 出现漏洞(比如被黑客通过恶意请求攻击),黑客就能获得 root 权限,直接操控整个服务器(删文件、偷数据、植入病毒等);
  • 创建 nginx 用户后,在配置文件中指定 user nginx;,Nginx 进程就会以「低权限用户」运行,即使被攻破,黑客也只能操作 nginx 用户有权限的文件(比如网站静态资源),无法触及系统核心文件(如 /etc/passwd/usr/sbin 等)。

2. 控制文件访问权限(避免误操作 / 越权)

  • Nginx 运行时需要读取网站文件(HTML/CSS/JS)、配置文件,写入日志文件;
  • nginx 用户分配「仅必要权限」:比如只让它可读网站根目录(/usr/share/nginx/html)、可写日志目录(/var/log/nginx),无权修改系统其他目录;
  • 好处:
    • 防止 Nginx 进程误删 / 篡改系统文件;
    • 避免网站文件被其他用户(比如普通登录用户)随意修改(只需把网站文件的所有者设为 nginx,其他用户无写入权限)。
  1. 符合「最小权限原则」(运维规范)
  • 服务器运维的核心安全原则:「程序只给完成工作必需的权限,不多给一分」;
  • Nginx 作为 Web 服务,不需要 root 权限的任何功能(比如修改系统配置、管理其他进程),用低权限的 nginx 用户完全能满足需求;
  • 生产环境中,所有服务(Nginx、MySQL、PHP 等)都应该创建专属用户运行,互不干扰,即使一个服务出问题,也不会影响其他服务。

4. 便于日志 / 进程管理(运维实用价值)

  • 查看 Nginx 进程时,能快速识别:ps -ef | grep nginx 会显示进程所有者是 nginx,一眼区分 Nginx 进程和其他进程;
  • 日志文件(access.logerror.log)的所有者会是 nginx,后续清理日志、分析日志时,不会因权限问题报错(比如普通用户无法删除 root 所属的日志文件);
  • 若多个 Web 服务共存(比如同时跑 Nginx 和 Apache),各自用专属用户,能避免日志混淆、权限冲突。

配置nginx模块

官方模块内容:nginx模块内容或者直接使用命令./configure --help

bash 复制代码
#使用以下进行配置 记得删除注释
./configure \
--prefix=/usr/local/nginx \                  # 指定Nginx安装根目录
--user=nginx \                               # 指定Nginx运行用户为nginx(安全隔离)
--group=nginx \                              # 指定Nginx运行用户组为nginx(权限统一管理)
--sbin-path=/usr/local/nginx/sbin/nginx \    # 指定Nginx启动程序存放路径
--conf-path=/etc/nginx/nginx.conf \          # 指定Nginx主配置文件路径(符合Linux配置规范)
--pid-path=/run/nginx.pid \                  # 指定PID文件路径(记录主进程ID,用于进程管理)
--error-log-path=/usr/local/nginx/logs/error.log \  # 指定错误日志路径(排查运行异常)
--http-log-path=/usr/local/nginx/logs/access.log \  # 指定访问日志路径(记录用户访问记录)
--with-http_ssl_module \                     # 启用HTTPS支持模块(实现https加密访问)
--with-http_v2_module \                      # 启用HTTP/2协议模块(提升网站加载速度)
--with-http_realip_module \                  # 启用获取客户端真实IP模块(穿透代理/CDN)
--with-http_sub_module \                     # 启用HTTP内容替换模块(无需改源码替换网页内容)
--with-http_stub_status_module \             # 启用Nginx状态监控模块(查看连接数、请求数等)
--with-http_gzip_static_module \             # 启用静态文件Gzip压缩模块(减小文件体积、省带宽)
--with-threads \                             # 启用线程支持(多线程模式,提升并发处理效率)
--with-file-aio \                            # 启用异步I/O支持(优化大文件处理性能,避免阻塞)
--with-pcre \                                # 使用系统自带PCRE正则库(支持URL匹配、Rewrite规则)
--with-stream \                              # 启用TCP/UDP代理模块(可代理MySQL、Redis等非HTTP服务)

编译并安装:make && make install

编译完成后使用nginx可执行路径 -v/-V进行验证

如果忘记可执行路径可使用whereis nginx进行查询

bash 复制代码
[root@nginx nginx-1.28.0]# whereis nginx
nginx: /etc/nginx /usr/local/nginx

创建服务文件(我们这种安装方式还没有服务文件,所以需要手写配置)

bash 复制代码
cat > /usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
Documentation=http: nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

至此,所有安装步骤完成

2.3基础配置

使用nginx -h命令查看nginx命令帮助:

上图内容的精简解读:

  1. 版本 / 帮助(查信息)
  • nginx -v:显示 nginx 版本
  • nginx -V:显示版本 + 编译配置
  • nginx -h/nginx -?:显示帮助文档
  1. 配置验证(改配置后必用)
  • nginx -t:测试配置文件是否合法
  • nginx -T:测试配置 + 打印配置内容
  • nginx -t -q:测试仅输出错误信息(静默模式)
  1. 进程控制(日常管理)
  • nginx -s stop:强制停止 nginx(不推荐)
  • nginx -s quit:优雅停止(处理完当前请求再停,推荐)
  • nginx -s reload:重载配置文件(改配置后用,无需停服务)
  • nginx -s reopen:重新打开日志文件(日志切割后用)
  1. 自定义配置(进阶)
  • nginx -p [路径]:指定 nginx 工作目录(默认 /usr/share/nginx)
  • nginx -e [文件路径]:指定错误日志路径(默认 /var/log/nginx/error.log)
  • nginx -c [文件路径]:指定配置文件路径(默认 /etc/nginx/nginx.conf)
  • nginx -g "指令":临时添加全局配置(如nginx -g "gzip on;"

2.4核心目录结构(nginx架构)

我们假设所有的NGINX文件全在一个目录/usr/local/nginx中,下表则是他们的结构

plaintext 复制代码
/usr/local/nginx/
├── conf/                  # 配置文件目录(核心!)
│   ├── nginx.conf         # 主配置文件(全局配置入口)
│   ├── mime.types         # 文件类型映射表(识别 .html/.css 等)
│   └── extra/             # 自定义配置文件目录(推荐分文件管理)
├── html/                  # 默认静态资源目录
│   ├── index.html         # 默认首页(访问 80 端口时默认显示)
│   └── 50x.html           # 错误页面(500/502 等错误时显示)
├── logs/                  # 日志目录
│   ├── access.log         # 访问日志(记录所有用户请求)
│   ├── error.log          # 错误日志(记录 Nginx 运行错误)
│   └── nginx.pid          # PID 文件(记录 Nginx 主进程 ID)
└── sbin/                  # 可执行程序目录
    └── nginx              # Nginx 核心命令(启动、停止、重启等)

三、通过小实验了解Nginx

我们可以把NGINX这个工具理解为一个管理互联网的小卖部,主配置文件就是管理规则、html等文件就是商品、log等日志就是记录、sbin就是执行小卖部的一些决策

配置nginx.conf文件(主配置文件):确定以下规则

讲解之前先带大家做一个最简单小实验让大家感受乐趣

首先编写conf文件配置一个8080端口的服务,在物理机中访问虚拟机中的一个html文件:

bash 复制代码
#更改配置文件
[root@nginx ~]# vim /etc/nginx/nginx.conf
[root@nginx ~]# vim /etc/nginx/nginx.conf
worker_processes  1;# 对应使用CPU核心数 → 招1个员工
events {
    worker_connections  1024;# 每个CPU服务数 → 这个员工最多同时接待1024个顾客(并发连接上限)
}

http {
    include       mime.types;# 识别"商品类型" → 知道HTML是"说明书"、图片是"海报",不搞混文件格式
    default_type  application/octet-stream;# 不认识的文件 → 按"原始包裹"处理,不瞎折腾

    sendfile        on;# 开启"快速取货" → 员工直接从货架递货,不用先放自己手里,省时间
    keepalive_timeout  65;# 顾客逗留时限 → 买完没动静65秒后送离,避免占位置

    server {
        listen       8080;# 监听8080端口 → 开放8080号窗口,顾客只能从这个窗口下单
        server_name  localhost;# 服务主机(127.0.0.1)→ 只接待本地熟客(本机访问),外地顾客暂不接
        
        location / {
            root   /usr/local/nginx/html/;# 指定商品货架 → 所有货(HTML、图片等)都放这个目录
            index  a.html;# 默认推荐商品 → 顾客一开窗先给"爆款a.html",想换别的输文件名就行
        }
        
        error_page   500 502 503 504  /50x.html;# 服务故障时 → 货架倒了/员工忙不过来(500类错误),给顾客看致歉信
        location = /50x.html {# 致歉信配置
            root   html;# 用默认小货架 → 致歉信是开业自带的,放Nginx默认html目录里
        }
        
    }
}

编写html文件:商品内容

bash 复制代码
[root@nginx html]# echo '<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Nginx 测试页面</title>
    <style>
        body { width: 90%; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif; text-align: center; }
        h1 { color: #2c3e50; margin-top: 50px; }
        p { color: #34495e; font-size: 18px; }
        .tip { color: #27ae60; font-weight: bold; margin-top: 30px; }
    </style>
</head>
<body>
    <h1>🎉 Nginx 服务运行正常!</h1>
    <p>这是通过 echo 命令生成的测试页面</p>
    <p class="tip">服务器 IP: 请替换为你的服务器公网/内网 IP</p>
    <p>当前时间: '$(date +"%Y-%m-%d %H:%M:%S")'</p>
</body>
</html>' > /usr/local/nginx/html/a.html

启动服务验证结果

bash 复制代码
#打开防火墙端口 拿到营业许可证
[root@nginx html]# firewall-cmd --permanent --add-port=8080/tcp
success
[root@nginx html]# firewall-cmd --reload 
success
[root@nginx html]# firewall-cmd --list-ports 
8080/tcp
#启动服务 开店了
[root@nginx html]# systemctl start nginx

虚拟机访问crullocalhost:8080物理机访问 虚拟机ip:8080

四、Nginx 配置文件深度解析

Nginx 的配置核心是 conf/nginx.conf,其语法遵循「层级嵌套」规则,核心结构分为 4 层:全局块 → Events 块 → HTTP 块 → Server 块 → Location 块

官方文档:[HTTP 负载均衡 |NGINX 文档](

4.1 配置文件基本语法规则

在开始解析前,先明确 3 个基础语法(避免配置报错):

  1. 配置项格式:关键字 值;(值与分号之间需空格,分号不可省略);
  2. 层级嵌套:子块(如 Events、Server)需放在父块(如全局、HTTP)的大括号 {} 内;
  3. 注释:# 注释内容(单行注释,无多行注释);
  4. 空格与换行:配置文件对空格、换行不敏感,可通过缩进优化可读性。

4.2 全局块(Global):Nginx 整体配置

全局块是配置文件的最外层,配置项对整个 Nginx 服务生效,主要设置进程、日志等核心参数。

nginx 复制代码
# 1. 工作进程数:建议设为 CPU 核心数(如 4 核 CPU 设为 4),或 auto 自动识别
worker_processes auto;

# 2. 错误日志:指定日志路径与日志级别(debug > info > notice > warn > error > crit)
# 生产环境建议设为 warn 或 error,避免日志过大
error_log logs/error.log warn;

# 3. PID 文件:存储 Nginx 主进程 ID,用于进程管理(如停止、重启)
pid logs/nginx.pid;

# 4. 工作进程优先级:数值越小优先级越高(-20 ~ 19),默认 0
worker_priority 0;

4.3 Events 块:网络连接配置

Events 块用于配置 Nginx 的网络连接模型,直接影响并发性能,核心参数如下:

nginx 复制代码
events {
    # 1. 每个工作进程的最大连接数(默认 1024)
    # 注意:此值不能超过系统的最大文件描述符限制(可通过 ulimit -n 查看)
    worker_connections 10240;

    # 2. 事件驱动模型:Linux 系统推荐用 epoll(性能最优),FreeBSD 用 kqueue
    use epoll;

    # 3. 允许多个连接同时被一个工作进程接收(提升并发处理效率)
    multi_accept on;

    # 4. 禁用 Nagle 算法:减少网络延迟,适合小数据包传输(如接口请求)
    tcp_nodelay on;
}

4.4 HTTP 块:Web 服务核心配置

HTTP 块是配置 Web 服务的核心,包含所有与 HTTP/HTTPS 相关的全局配置,同时可嵌套多个 Server 块(虚拟主机)。

nginx 复制代码
http {
    # 1. 引入文件类型映射表:让 Nginx 识别不同后缀的文件(如 .html 是文本类型)
    include mime.types;

    # 2. 未知文件类型默认处理方式:按二进制流传输
    default_type application/octet-stream;

    # 3. 日志格式配置:定义访问日志的记录格式(可自定义字段)
    log_format main '$remote_addr [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    # 启用访问日志,按 main 格式记录到 logs/access.log
    access_log logs/access.log main;

    # 4. 性能优化参数
    sendfile on;          # 启用零拷贝技术(加速文件传输,减少 CPU 占用)
    tcp_nopush on;        # 配合 sendfile 使用,提升网络传输效率
    keepalive_timeout 65; # TCP 连接超时时间(秒):用户连接后无操作 65 秒断开
    client_max_body_size 10m; # 限制客户端上传文件最大大小(默认 1m,根据业务调整)

    # 5. Gzip 压缩配置:减小响应文件体积,提升页面加载速度
    gzip on;                  # 启用 Gzip 压缩
    gzip_comp_level 6;        # 压缩级别(1-9,6 是平衡值:压缩比与性能兼顾)
    gzip_min_length 1k;       # 仅压缩大于 1KB 的文件(小文件无需压缩)
    gzip_buffers 16 8k;       # 压缩缓冲区大小
    gzip_http_version 1.1;    # 支持的 HTTP 协议版本
    # 需压缩的文件类型(文本类文件优先压缩,图片/视频无需压缩)
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_vary on;             # 向客户端返回压缩标识,避免兼容问题

    # 6. 虚拟主机配置(核心!一个 Server 块对应一个虚拟主机)
    include conf/extra/*.conf; # 推荐将虚拟主机配置拆分到 extra 目录,便于管理
}

4.5 Server 块:虚拟主机配置

Server 块对应「虚拟主机」,一个 Nginx 可配置多个 Server 块,实现「一个端口多个域名」或「多个端口多个服务」的隔离。

核心参数说明:

  • listen:监听的端口(如 80 对应 HTTP,443 对应 HTTPS);
  • server_name:监听的域名(可配置多个,用空格分隔,支持通配符 *);
  • root:该虚拟主机的静态资源根目录;
  • index:默认首页文件(多个文件按优先级排序)。
示例 1:配置 80 端口静态资源服务(基础场景)
nginx 复制代码
# 保存为 conf/extra/static_80.conf,通过 HTTP 块的 include 引入
server {
    listen 80;                  # 监听 80 端口(HTTP 默认端口)
    server_name localhost www.mystatic.com; # 监听的域名(本机+自定义域名)

    root /usr/local/nginx/html; # 静态资源根目录
    index index.html index.htm; # 默认首页文件(访问 / 时优先找 index.html)

    # 字符编码设置:避免中文乱码
    charset utf-8;

    # 访问日志:单独记录该虚拟主机的访问日志(便于排查问题)
    access_log logs/static_80_access.log main;

    # 错误页面配置:404 错误返回自定义页面
    error_page 404 /404.html;
    location = /404.html {
        root /usr/local/nginx/html;
        internal; # 仅允许内部跳转,禁止用户直接访问 /404.html
    }

    # 静态资源缓存优化:图片、CSS、JS 缓存 7 天,减少重复请求
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|svg)$ {
        expires 7d; # 缓存 7 天
        add_header Cache-Control "public, max-age=604800"; # 缓存控制头
        add_header ETag ""; # 禁用 ETag 校验,提升缓存效率
    }
}
示例 2:配置 443 端口 HTTPS 服务(生产环境必备)

HTTPS 需先申请 SSL 证书(可从 Let's Encrypt 免费申请),配置如下:

nginx 复制代码
# 保存为 conf/extra/https_443.conf
server {
    listen 443 ssl; # 监听 443 端口(HTTPS 默认端口)
    server_name www.mydomain.com; # 绑定的域名(需与证书匹配)

    # SSL 证书配置
    ssl_certificate /usr/local/nginx/conf/cert/www.mydomain.com.pem; # 证书公钥路径
    ssl_certificate_key /usr/local/nginx/conf/cert/www.mydomain.com.key; # 证书私钥路径

    # SSL 安全优化参数
    ssl_protocols TLSv1.2 TLSv1.3; # 仅支持安全的 TLS 版本(禁用 SSLv3、TLSv1.0/1.1)
    ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # 加密套件
    ssl_session_timeout 10m; # SSL 会话超时时间
    ssl_session_cache shared:SSL:10m; # SSL 会话缓存

    root /usr/local/nginx/html;
    index index.html;

    access_log logs/https_443_access.log main;
}

# 可选:将 80 端口请求重定向到 443(强制 HTTPS)
server {
    listen 80;
    server_name www.mydomain.com;
    return 301 https://$host$request_uri; # 301 永久重定向到 HTTPS
}

4.6 Location 块:请求路径匹配与处理

Location 块嵌套在 Server 块内,用于「匹配用户请求的路径」,并执行对应的处理逻辑(如返回静态文件、转发请求、缓存等)。

4.6.1 Location 匹配规则(核心!)

Location 支持多种匹配模式,优先级从高到低如下:

匹配模式 语法示例 说明 优先级
精确匹配 location = /path 仅匹配 /path 路径(完全一致) 最高
前缀匹配(^~) location ^~ /static/ 匹配以 /static/ 开头的路径,不继续匹配正则 次高
正则匹配(~) location ~ \.html$ 区分大小写的正则匹配(如 .html 结尾)
正则匹配(~*) location ~* \.jpg$ 不区分大小写的正则匹配(如 .jpg/.JPG
普通前缀匹配 location /path 匹配以 /path 开头的路径,会继续匹配正则 最低
4.6.2 常用 Location 配置示例
nginx 复制代码
server {
    listen 80;
    server_name localhost;
    root /usr/local/nginx/html;
    index index.html;

    # 1. 精确匹配:访问 / 时返回 index.html
    location = / {
        index index.html;
    }

    # 2. 前缀匹配:访问 /static/ 开头的路径(如 /static/css/style.css),缓存 30 天
    location ^~ /static/ {
        expires 30d;
        add_header Cache-Control "public";
    }

    # 3. 正则匹配:访问 .html 结尾的路径,禁用缓存(实时更新页面)
    location ~* \.html$ {
        expires -1; # 禁用缓存
        add_header Cache-Control "no-store, no-cache, must-revalidate";
    }

    # 4. 反向代理:访问 /api/ 开头的路径,转发至后端 Java 服务
    location /api/ {
        proxy_pass http://127.0.0.1:8080/; # 后端服务地址(末尾 / 不可省略)
        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
    }

    # 5. 防盗链:仅允许自家域名(www.mydomain.com)引用图片资源
    location ~* \.(jpg|png|gif|jpeg)$ {
        valid_referers none blocked www.mydomain.com; # 允许的引用域名
        if ($invalid_referer) {
            return 403; # 非法引用返回 403 禁止访问
        }
    }
}

五、总结及常见问题

5.1 配置文件修改后不生效

  • 原因 1:配置文件有语法错误(未通过 nginx -t 检查);
  • 原因 2:未执行 nginx -s reload 重新加载配置;
  • 原因 3:配置项放错层级(如 Location 块放在 Server 块外);
  • 解决方案:先执行 nginx -t 检查语法,再执行 nginx -s reload

5.2 访问 Nginx 报 403 Forbidden

  • 原因 1:root目录或文件权限不足(Nginx 工作进程无读取权限);

    解决方案:修改目录权限:

    bash 复制代码
    hmod -R 755 /usr/local/nginx/html
  • 原因 2:root目录下无index配置的首页文件(如 index.html);

    解决方案:添加首页文件,或修改index 配置;

  • 原因 3:Location 块配置了deny all,禁止了访问;

    解决方案:删除deny all,或添加allow 允许指定 IP。

5.3 访问 Nginx 报 502 Bad Gateway

  • 原因 1:反向代理的后端服务未启动(如 8080 端口无服务);

    解决方案:启动后端服务,或检查proxy_pass地址是否正确;

  • 原因 2:后端服务端口被防火墙拦截;

    解决方案:开放后端端口

    bash 复制代码
    firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload
  • 原因 3:Nginx 无法连接后端服务(网络不通或后端服务故障);

    解决方案:在 Nginx 服务器上执行curl http://127.0.0.1:8080

    ,验证是否能访问后端服务。

5.4 访问 Nginx 报 504 Gateway Timeout

  • 原因:后端服务响应超时(Nginx 等待后端响应超过 proxy_read_timeout 配置);

  • 解决方案:

    1. 优化后端服务性能(根本解决);
    2. 增加 Nginx 代理超时配置:
    nginx 复制代码
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_read_timeout 120s; # 延长读取超时时间至 120 秒
    }

5.5 启动NGINX服务时端口占用

  • 原因:httpd默认80端口和NGINX默认80端口冲突;

  • 解决方案:

    1. 关停httpd服务(根本解决)

      bash; 复制代码
      systemctl stop httpd.service
    2. 更改 Nginx 端口配置:

    nginx 复制代码
    server {
        ..........
            listen       8080;#除80其他端口
        ..........
            }

:在 Nginx 服务器上执行curl http://127.0.0.1:8080

,验证是否能访问后端服务。

5.4 访问 Nginx 报 504 Gateway Timeout

  • 原因:后端服务响应超时(Nginx 等待后端响应超过 proxy_read_timeout 配置);

  • 解决方案:

    1. 优化后端服务性能(根本解决);
    2. 增加 Nginx 代理超时配置:
    nginx 复制代码
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_read_timeout 120s; # 延长读取超时时间至 120 秒
    }

5.5 启动NGINX服务时端口占用

  • 原因:httpd默认80端口和NGINX默认80端口冲突;

  • 解决方案:

    1. 关停httpd服务(根本解决)

      bash; 复制代码
      systemctl stop httpd.service
    2. 更改 Nginx 端口配置:

    nginx 复制代码
    server {
        ..........
            listen       8080;#除80其他端口
        ..........
            }
相关推荐
爱吃山竹的大肚肚36 分钟前
根据每个键对应的列表里所有实体的 count 最大值,将整个字典从大到小重新排列
linux·运维·windows
7澄136 分钟前
Servlet 前后端交互实战(登录/注册案例)
运维·服务器·ajax·servlet·jquery·form·前后端交互
通义灵码40 分钟前
Java 后端开发工程师使用 Qoder 实现面向 API 的运维平台前端开发
java·运维·状态模式
aml258__42 分钟前
一、Cisco(OSPF DR选举机制深度实验:从原理到配置的完整指南)251202
运维·网络·智能路由器·路由协议·ospf协议·dr选举机制·ccnp实验
YongCheng_Liang44 分钟前
从零开始:Nginx 服务器安装、配置与实战使用完全指南
运维·服务器·nginx
码农101号1 小时前
Linux - redis下载以及基础使用
linux·运维·redis
linux修理工1 小时前
vagrant ansible 配置
linux·运维·服务器·数据库·centos
忆林5201 小时前
关于微服务多链路调用405(客户端通过nginx请求后端A,A通过调用B的nginx请求B的后端)
服务器·nginx·微服务
绯雨千叶1 小时前
修改Docker镜像和容器的默认存储目录(迁移原有数据)
运维·docker·容器