NGINX 配置内网访问的实现步骤

2025-05-21 15:50

本文主要是介绍NGINX 配置内网访问的实现步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下...

需求

我们有一个测试站的域名: https://test.zhiexa.com/ 这个域名是公网域名, 我希望限制其访问,只有在内网,或者办公室 IP 能够访问 ,该如何配置呢?

1. geo 模块配置

首先在虚拟主机文件中domain-vhost.conf添加,全局模块

# 添加允许的IP地址
geo $allowed_ip {
    default 0;  # 默认拒绝所有IP

    # 内网地址范围
    10.0.0.0/8 1;      # 允许所有10开头的内网IP
    172.16.0.0/12 1;   # 允许172.16-172.31范围的内网IP
    192.168.0.0/16 1;  # 允许所有192.168开头的内网IP

    # 添加特定的外网IP(示例) xxx.xxx.xxx.137 改成自己希望可以访问的IP
    xxx.xxx.xxx.137 1;  # 允许特定的办公室IP
   
}

这部分使用 geo 模块创建了一个变量 $allowed_ip ,用于判断访问IP是否在允许列表中:

  • 值为0表示禁止访问yUTndLCh
  • 值为1表示允许访问

2. 访问控制判断

在server 段里面配置

# 在server 段配置
if ($allowed_ip = 0) {
    return 403;  # 如果IP不在允许列表中,返回403禁止访问错误
}

3. 错误页面配置

在server 段里面配置

# 先配置错误页面,将403错误重定向到一个命名location
error_page 403 @403_handler;

# 使用命名location来处理403错误
location @403_handler {
    root /usr/local/nginx/html;
    try_files /403.html =404;
    
    # 强制添加调试头信息 可以不用添加,调试使用
    add_header X-Debug-Path $document_root always;
    add_header X-Debug-File $request_filename always;
    add_header X-Debug-Uri $uri always;
    add_header X-Debug-Request-Uri $request_uri always;
    add_header X-Debug-Remote-Addr $remote_addr always;
    
    # 确保内容类型正确
    default_type text/html;
    charset utf-8;
    
    # 详细的错误日志
    error_log /usr/local/nginx/logs/403_debug.log debug;
}

# 正确配置错误页面 403.html 放在这个位置 /usr/local/nginx/html/403.html
location = /403.html {
    root /usr/local/nginx/html;
    internal;  # 只允许内部重定向访问,不能直接从外部访问
}
  • error_page 403 @403_handler 将403错误重定向到一个命名location

  • location @403_handler 定义了处理403错误的具体方式,包括显示自定义错误页面和添加调试信息

  • location = /403.html 定义了403错误页面的位置,并设置为internal,防止直接访问

整个配置的工作流程是:

  • 当有请求访问服务器时,Nginx检查访问IP
  • 通过geo模块判断IP是否在允许列表中
  • 如果不在允许列表中,返回403错误
  • 403错误被重定向到自定义错误页面
  • 同时记录详细的调试信息和日志
  • 这样就实现了只允许特定IP访问,其他IP都会被拒绝并显示自定义错误页面的功能。

我需要准备一个 403.html 页面 , 这个页面放到 /usr/local/nginx/html China编程这个目录下面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>访问被拒绝 - 智AI</title>
    <style>
        body {
            font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
            background-color: #f8f9fa;
            color: #333;
            display: Flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            padding: 0 20px;
        }
        .container {
            max-wihttp://www.chinasem.cndth: 600px;
            background-color: white;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            padding: 40px;
            text-align: center;
        }
        .icon {
            font-size: 64px;
            margin-bottom: 20px;
            color: #f44336;
        }
        h1 {
            font-size: 28px;
            margin-bottom: 20px;
            color: #333;
        }
        p {
            font-size: 16px;
            line-height: 1.6;
            color: #666;
            margin-bottom: 30px;
        }
        .btn {
            display: inline-block;
            background-color: #1890ff;
            color: white;
            text-decoration: none;
            padding: 10px 20px;
            border-radius: 4px;
            font-size: 16px;
            transition: background-color 0.3s;
        }
        .btn:hover {
            background-color: #40a9ff;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="icon">&#x1F6AB;</div>
        <h1>访问被拒绝</h1>
        <p>很抱歉,您当前的IP地址没有权限访问此页面。此页面仅限内部网络或授权IP访问。</p>
        <p>如需访问,请使用公司网络或联系管理员将您的IP添加到白名单。</p>
        <!-- 换成 公网正式域名  -->
        <a href="https://blog.csdn.net/u010339879" rel="external nofollow"  class="btn">前往公开网站</a>
    </div>
</body>
</html>

4. 一个完整的配置

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}


# 添加允许的IP地址
geo $allowed_ip {
    default 0;

    # 内网地址范围
    10.0.0.0/8 1; # 10.0.0.0 - 10.255.255.255
    172.16.0.0/12 1; # 172.16.0.0 - 172.31.255.255
    192.168.0.0/16 1; # 192.168.0.0 - 192.168.255.255

    # 添加特定的外网IP(示例)
    222.65.141.137 1; # office ip
    47.116.213.148 1; # 测试服务器IPIP_ADDRESS 1;
}


server {
    listen 80;
    server_name test.zhChina编程iexa.com;

    # 添加访问日志以便调试
    Access_log /usr/local/nginx/logs/test.com.access.log main;
    error_log /usr/local/nginx/logs/test.com.error.log debug;
	
    # 重定向到https
    return 302 https://$host$request_uri;
}


server {
    listen 443 ssl;
    server_name test.zhiexa.com;


    # 添加访问日志以便调试
    access_log /usr/local/nginx/logs/test.com.ssl.access.log main buffer=16k flush=5s;
    error_log /usr/local/nginx/logs/test.com.ssl.error.log debug;

    # 先配置错误页面
    error_page 403 @403_handler;

    # 使用命名location来处理403错误
    location @403_handler {
        root /usr/local/nginx/html;
        try_files /403.html =404;

        # 强制添加调试头信息
        add_header X-Debug-Path $document_root always;
        add_header X-Debug-File $request_filename always;
        add_header X-Debug-Uri $uri always;
        add_header X-Debug-Request-Uri $request_uri always;
        add_header X-Debug-Remote-Addr $remote_addr always;

        # 确保内容类型正确
        default_type text/html;
        charset utf-8;

        # 详细的错误日志
        error_log /usr/local/nginx/logs/403_debug.log debug;
    }


    if ($allowed_ip = 0) {
        return 403;
    }

    # 正确配置错误页面
    location = /403.html {
        root /usr/local/nginx/html;
        internal;
    }

    ssl_certificate cert/zhiexa.com.pem;
    ssl_certificate_key cert/zhiexa.com.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECChina编程DHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;


    # 开启 Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/Javascript text/XML application/xml application/xml+RSS text/javascript;


    # 根路径配置
    location / {
        root /aaa/zhiexa-cloud-web/dist/;
        try_files $uri $uri/ /index.html;
        index index.html;
        error_log /usr/local/nginx/logs/test.com.root.error.log debug;

        # HTML 文件缓存控制
        location ~* \.(html|htm)$ {
            add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0" always;
            expires off;
            # add_header X-Debug-Path $document_root always;
            # add_header X-Debug-Uri $uri always;
        }

        # 设置 .css 和 .js 文件的缓存时间为 4 小时
        location ~* \.(css|js)$ {
            expires 4h;
            add_header Cache-Control "public, no-transform";
        }

        # 设置图片文件的缓存时间为 4 小时
        location ~* \.(gif|jpg|jpeg|png|svg)$ {
            expires 4h;
            add_header Cache-Control "public, no-transform";
        }
    }


    location /h5 {
        root /service/customized-h5;
        try_files $uri $uri/ /index.html;
        index index.html;

        # 禁用 HTML 文件的缓存
        location ~* \.(html|htm)$ {
            add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0" always;
            expires off;
        }

        # 设置 .css 和 .js 文件的缓存时间为 4 小时
        location ~* \.(css|js)$ {
            expires 4h;
            add_header Cache-Control "public, no-transform";
        }

        # 设置图片文件的缓存时间为 4 小时
        location ~* \.(gif|jpg|jpeg|png|svg)$ {
            expires 4h;
            add_header Cache-Control "public, no-transform";
        }
    }


    location /api/file-assistant {
        # 真实代理的IP:PORT 
        proxy_pass http://172.xxx.xxxx.xxx:8200;
        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_connect_timeout 300; #代理连接web超时时间
        proxy_send_timeout 600; #web回传数据至代理超时时间
        proxy_read_timeout 600; #代理等待web响应超时时间


        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        proxy_cache off;
        proxy_buffering off;
    }


    location /zhiexa/prompt/api/v1 {
        # 真实代理的IP:PORT 
        proxy_pass http://172.xxx.xxxx.xxx:8009/zhiexa/prompt/api/v1;
        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_connect_timeout 300; #代理连接web超时时间
        proxy_send_timeout 300; #web回传数据至代理超时时间
        proxy_read_timeout 300; #代理等待web响应超时时间


        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        proxy_buffering on; #开启代理缓冲区,web回传数据至缓冲区,代理边收边传给客服端
        proxy_buffer_size 32k; #代理接收web响应的头部信息的缓冲区大小
        proxy_buffers 4 128k; # 缓冲代理接收单个长连接内包含的web相应的数量和大小
    }

}

配置完成后 重启 NGINX ,或者重新加载配置文件即可 。

# 检查配置文件 是否存在语法错误
nginx -t 

# 重新加载配置文件
nginx -s reload 

参考文档

Nginx 官方文档 ngx_http_geo_module

Nginx 官方文档

Nginx 核心模块文档

Nginx 变量说明

Nginx 开发从入门到精通

到此这篇关于NGINX 配置内网访问的实现步骤的文章就介绍到这了,更多相关NGINX 配置内网访问内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)! 

这篇关于NGINX 配置内网访问的实现步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154708

相关文章

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3