当前位置: 首页 > article >正文

Nginx 安全防护与 HTTPS 部署实战笔记

Nginx 安全防护与 HTTPS 部署实战笔记

一、核心安全配置

(一)编译安装 Nginx

  1. 安装支持软件
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
  • 作用:安装 Nginx 编译所需的开发包,包括 pcre、zlib、openssl 等库和头文件。
  1. 创建运行用户、组和日志目录
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
  • 作用:创建非交互式用户 nginx 运行 Nginx 服务,避免使用 root 权限,提升安全性;创建日志目录并设置权限。
  1. 编译安装 Nginx
tar zxf nginx-1.26.3.tar.gz 
cd nginx-1.26.3 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream 
make && make install
  • 关键参数说明:
    • --prefix:指定安装路径。
    • --user/--group:指定运行用户和组。
    • --with-http_ssl_module:启用 SSL 模块支持 HTTPS。
    • --with-http_realip_module:获取客户端真实 IP。
    • --with-http_stub_status_module:启用状态统计模块。
  1. 添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service

ini

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
  • 作用:将 Nginx 注册为系统服务,便于通过 systemctl 命令管理启动、重启和开机自启。

(二)隐藏版本号

  1. 查看原始版本号
curl -I 192.168.10.101
  • 输出示例:Server: nginx/1.26.3
  1. 修改配置文件隐藏版本号
vi /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;server_tokens off;     # 隐藏版本号...
}
nginx -t
nginx -s reload
  • 作用:通过server_tokens off指令隐藏 Nginx 版本号,避免攻击者针对特定版本进行攻击。

(三)限制危险请求方法

  1. 修改配置文件限制请求方法
vi /usr/local/nginx/conf/nginx.conf
server {...if ($request_method !~ ^(GET|HEAD|POST)$ ) {return 444;}...
}
  • 作用:使用正则表达式匹配请求方法,只允许 GET、HEAD、POST 方法,其他方法(如 PUT、DELETE、TRACE 等)返回 444(无响应关闭连接),防止 XST 攻击、文件修改风险和代理滥用。

(四)请求限制(CC 攻击防御)

  1. 使用 limit_req 模块限制请求速率
vi /usr/local/nginx/conf/nginx.conf

nginx

http {# 定义限制区(10MB内存/每秒10请求)limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;...server {location / {root html;index index.html index.php;limit_req zone=req_limit burst=20 nodelay;}...}
}
  • 关键参数说明:
    • limit_req_zone:定义共享内存区存储客户端 IP 和请求频率信息。
    • $binary_remote_addr:客户端 IP 地址的二进制格式,节省内存。
    • zone=req_limit:10m:共享内存区名为 req_limit,大小 10M。
    • rate=10r/s:每个 IP 每秒最多 10 个请求。
    • limit_req:应用速率限制。
    • burst=20:突发请求队列大小,超出速率限制的请求进入队列,队列满后返回 503。
    • nodelay:立即处理突发请求,不延迟。
  1. 压力测试验证
dnf install httpd-tools -y  # 安装ab测试工具
ab -n 300 -c 30 http://192.168.10.101/  # 发起300个请求,30个并发
  • 验证方法:查看 access.log 中 503 状态码的数量,确认 CC 攻击防御效果。

(五)防盗链

  1. 配置 Nginx 防盗链
vi /usr/local/nginx/conf/nginx.conf

nginx

location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {root html;valid_referers aaa.com *.aaa.com;if ($invalid_referer) {return 403;}
}
  • 关键参数说明:
    • ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$:匹配不区分大小写的静态资源文件后缀。
    • valid_referers:设置信任的 Referer 来源,只有来自aaa.com和子域名的请求被允许。
    • $invalid_referer:如果 Referer 不在信任列表中,该变量为 1,触发 403 禁止访问。

二、高级防护

(一)动态黑名单

  1. 编辑黑名单配置文件
vi /usr/local/nginx/conf/blockips.conf

plaintext

192.168.1.0/24 1; # 封禁整个网段
192.168.10.102 1; # 封禁IP
  • IP 地址后的数字含义:
    • 0:允许访问。
    • 1:返回 403 完全封禁。
    • 2:返回 444 静默断开。
    • 3:返回 503 服务不可用。
  1. 编辑主配置文件应用黑名单
vi /usr/local/nginx/conf/nginx.conf

nginx

http {...geo $block_ip {default 0;          # 默认允许访问include /usr/local/nginx/conf/blockips.conf;  # 包含黑名单}...server {...if ($block_ip) {    # 判断标记值return 403;     # 封禁动作}...}
}
  • 关键参数说明:
    • geo:Nginx 内置模块,基于客户端 IP 生成变量$block_ip
    • default 0:默认允许访问,不在黑名单中的 IP 返回 0。
    • include:包含黑名单配置文件。
  1. 自动添加黑名单脚本
#!/bin/bash
# 自动封禁访问超过100次的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '{if($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
  • 作用:统计 access.log 中访问次数超过 100 次的 IP,自动添加到黑名单。

三、Nginx HTTPS 配置

(一)HTTPS 概念

  1. HTTPS 定义:HTTPS = HTTP + SSL/TLS,在 HTTP 之下 TCP 之上添加 SSL 层,用于对应用层数据加解密,保障数据传输安全。
  2. HTTP 不安全的原因
    • 窃听风险:明文传输,中间人可获取通信内容。
    • 篡改风险:中间人可篡改报文内容。
    • 冒充风险:可能访问钓鱼网站,无法确认对方身份。
  3. 安全通信的四大原则
    • 机密性:数据加密,防止窃听。
    • 完整性:数据传输中未被篡改,接收方能识别。
    • 身份认证:确认对方真实身份,防止冒充。
    • 不可否认:不可否认已发生的行为。
  4. HTTPS 通信原理
    • 混合加密:握手阶段使用非对称加密协商对称加密密钥,数据传输阶段使用对称加密提高效率。
    • 数字证书:解决公钥传输信任问题,由 CA 颁发,包含公钥、域名、有效期等信息,通过 CA 私钥签名,客户端使用系统内置的 CA 公钥验签。

(二)Nginx 配置 HTTPS 证书

  1. 使用 openssl 生成自签名证书和私钥
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key \
-out /etc/nginx/ssl/nginx-selfsigned.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
  • 关键参数说明:
    • -x509:生成自签名证书。
    • -nodes:不加密私钥。
    • -days 365:证书有效期 1 年。
    • -newkey rsa:2048:生成 2048 位 RSA 私钥。
    • -subj:证书主题信息,按需修改国家、省市、组织、域名等。
  1. Nginx 启用 HTTPS
vi /usr/local/nginx/conf/nginx.conf

nginx

server {listen 443 ssl;  # 监听HTTPS端口server_name localhost;  # 域名或IP# 指定证书和私钥路径ssl_certificate      /etc/nginx/ssl/nginx-selfsigned.crt;ssl_certificate_key  /etc/nginx/ssl/nginx-selfsigned.key;# SSL协议和加密套件配置(提升安全性)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers on;# 其他配置location / {root /usr/local/nginx/html;index index.html;}
}# 可选:将HTTP请求重定向到HTTPS
server {listen 80;server_name localhost;return 301 https://$host$request_uri;
}
nginx -t
nginx -s reload
  • 关键参数说明:
    • listen 443 ssl:监听 443 端口并启用 SSL。
    • ssl_certificate/ssl_certificate_key:指定证书和私钥路径。
    • ssl_protocols:指定允许的 SSL/TLS 协议版本,禁用不安全的旧版本。
    • ssl_ciphers:指定加密套件,选择安全强度高的套件。
    • ssl_prefer_server_ciphers on:优先使用服务器端的加密套件。
  1. 浏览器验证
  • 访问https://服务器IP,浏览器会提示证书不安全(自签名证书),测试环境可忽略警告继续访问。

相关文章:

Nginx 安全防护与 HTTPS 部署实战笔记

Nginx 安全防护与 HTTPS 部署实战笔记 一、核心安全配置 (一)编译安装 Nginx 安装支持软件 dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar作用:安装 Nginx 编译所需的开发包&#…...

Python Day34 学习

今日内容 通过“心脏病数据集”对之前的内容进行复习,再进行新内容“元组和OS模块”的学习。 机器学习模型建模和评估(先不考虑调参) 基于之前已经预处理过的心脏病数据集 划分数据值 模型训练与模型评估 # 随机森林 rf_model RandomFo…...

【ASR】基于分块非自回归模型的流式端到端语音识别

论文地址:https://arxiv.org/abs/2107.09428 摘要 非自回归 (NAR) 模型在语音处理中越来越受到关注。 凭借最新的基于注意力的自动语音识别 (ASR) 结构,与自回归 (AR) 模型相比,NAR 可以在仅精度略有下降的情况下实现有前景的实时因子 (RTF) 提升。 然而,识别推理需要等待…...

国芯思辰|国产FRAM SF25C128助力监控系统高效低功耗解决方案,对标MB85RS128/FM25V01

监控系统已成为保障公共安全、维护社会秩序的重要工具。随着监控系统的不断发展,对数据存储的要求也越来越高,不仅需要大容量、高速度的存储设备,还要求其具备高可靠性和低功耗等特性。国产铁电存储器 SF25C128作为一种新型非易失性存储器&am…...

攻防世界逆向刷题笔记(新手模式9-1?)

bad_python 看样子是pyc文件损坏了。利用工具打开,发现是MAGIC坏了。搜下也没有头绪。 攻防世界-难度1- bad_python - _rainyday - 博客园 python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 看WP才知道36已经提示了pyc版本了。参考第二个文章&am…...

【golang】能否在遍历map的同时删除元素

Go 团队在设计时确实允许在迭代时删除当前元素,但是不建议直接使用 for k, v : range m 删除。对于单线程读写情况: 主要原因如下: 1. 迭代变量重用问题 Go 的 range 循环会重用迭代变量的内存地址。当你使用 for k, v : range m 时&#xf…...

制作一款打飞机游戏58:子弹模式组合

今天我们将继续深入探讨子弹模式系统,并在我们的模式编辑器上做一些收尾工作。 子弹模式系统的乐趣 首先,我想说,这个子弹模式系统真的非常有趣。看着屏幕上不断喷射的子弹,感觉真是太棒了! 合并修饰符 今天&#…...

使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!

在应用开发领域,JSON/XML数据结构因其灵活性和通用性,成为开发者存储和交换数据的首选。然而,传统管理工具在处理这些半结构化数据时,往往存在可视化效果差、编辑效率低等问题,严重影响开发者的工作效率。 现在&#…...

Qt基础:数据容器类

数据容器类 1. QList1.1 使用创建和初始化添加和删除元素访问和修改元素查找和判断元素遍历列表排序和筛选与其他容器的转换 1.2 完整示例 1. QList 在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和…...

Vue3监听对象数组属性变化方法

在Vue3中,监听对象数组中某个属性的变化可以通过以下几种方法实现: 方法一:深度监听整个数组并比较属性变化 使用 watch 函数并启用 deep: true,在回调中遍历比较新旧数组的特定属性。 javascript 复制 下载 import { ref, …...

深入了解PyTorch:起源、优势、发展与安装指南

深入了解PyTorch:起源、优势、发展与安装指南 目录 引言PyTorch简介PyTorch的优势 动态计算图直观易用的API强大的社区支持丰富的生态系统高性能与可扩展性 PyTorch的发展历程PyTorch的主要组件 Torch.TensorAutograd自动求导nn模块TorchvisionTorchText和TorchAu…...

DeepSeek智能对话助手项目

目录: 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…...

浅谈Mysql的MVCC机制(RC与RR隔离级别)

MVCC(Multi-Version Concurrency Control)多版本并发控制 说这个我们先来了解一下Mysql的隔离级别,因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR(可重复读) 其他的隔离级别是读未提交(…...

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)

我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…...

【git】 pull + rebase 或 pull + merge什么区别?

在Git中,pull + rebase 和 pull + merge 是两种整合远程分支更新的方式,其核心区别在于如何处理提交历史。以下是详细对比: 核心区别 操作提交历史结构合并方式冲突处理适用场景pull + merge保留分支分叉和合并节点创建新的合并提交(Merge Commit)一次性解决所有冲突公共…...

1. 编程语言进化史与JavaScript

引言 作为一名开发者,理解编程语言的演进历史和核心特性是至关重要的。接下来将从编程语言的三个历史阶段入手,重点解析JavaScript的起源、特性及其与相关技术的关系,同时补充进制转换的基础知识,为初学者构建完整的知识体系。 一、编程语言的三大历史阶段 1. 机器语言(…...

Vue3 中 Axios 深度整合指南:从基础到高级实践引言

在现代前端开发中,与后端API的交互是构建动态应用的核心环节。Axios作为最流行的HTTP客户端之一,以其简洁的API和强大的功能在前端生态中占据重要地位。本文将全面探讨如何在Vue3项目中高效整合Axios,从基础配置到高级封装,从性能…...

MySQL#Select语句执行过程

服务端程序架构 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序mysqld。 Select语句执行过程 连接层 客户端和服务器端建立连接,客户端发送 SQL 至服务器端 SQL层 SQL语句处理 查询缓存: 缓存命中该SQL执行结果直…...

hbuilder中h5转为小程序提交发布审核

【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 ,您不是这个应用的项目成员。1、联系这个应用的所有者,请求加入项目成员(https://dev.dcloud.net.cn "成员管理"-"添加项目成员")…...

文档注释:删还是不删

问题:代码中存在大量的文档注释,占用大量篇幅,一次难以看完整个文件,于是诞生了一个想法:删除所有文档注释,于是问了下 DeepWiki 文档注释对tree - sitter有影响吗?文档注释对Roocode大模型理解…...

【数据结构】单链表练习

1.链表的中间节点 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 用快慢指针来解决 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* he…...

JVM 性能优化终极指南:全版本兼容、参数公式与场景实战

一、引言 JVM 优化的核心难点在于版本兼容性与场景适配性。从 Java 8 到 Java 21,JVM 的内存模型、GC 策略和默认参数发生了巨大变化;从高并发 Web 到大数据批处理,不同业务场景对延迟、吞吐量的要求也截然不同。本文基于历史会话中用户关注…...

分布式爬虫监控架构设计

1. 监控架构核心组件 1.1 日志集中管理 设计目标:聚合所有节点的运行日志,支持实时查询与异常分析。 实现方式: 日志采集:各节点通过 logging 模块将日志发送至中央存储(如Elasticsearch或Redis)。 日志…...

MySQL的参数 innodb_force_recovery 详解

MySQL的参数 innodb_force_recovery 详解 innodb_force_recovery 是 InnoDB 存储引擎的一个重要参数,用于在数据库崩溃恢复时控制恢复行为的级别。这个参数主要在数据库无法正常启动时使用,可以帮助我们从损坏的数据库中恢复数据。 一 参数概述 参数名…...

学习vue3:跨组件通信(provide+inject)

目录 一,关于跨组件通信概述 二,跨组件传值 案例1(爷传孙) 三,跨组件传函数 案例2(爷传孙) 疑问:孙子传给爷爷是否可行呢? 一,关于跨组件通信概述 之前我们学习了父子组件的传…...

Alibaba Sentinel 入门教程:从理论到实战

文章目录 第一部分:理论篇1. Sentinel 简介2. Sentinel 核心原理2.1 资源与规则2.2 Sentinel 工作主流程2.3 核心类解析 3. Sentinel 功能支持与使用流程3.1 流量控制3.2 熔断降级3.3 系统自适应保护3.4 热点参数限流3.5 黑白名单控制3.6 使用流程 4. Sentinel 架构…...

2.3 TypeScript 非空断言操作符(后缀 !)详解

在 TypeScript 中,当你开启了严格的空值检查(strictNullChecks)后,变量如果可能是 null 或 undefined,就必须在使用前进行显式的判断。为了在某些场景下简化代码,TypeScript 提供了非空断言操作符&#xff…...

【菜狗work前端】小程序加if判断时不及时刷新 vs Web

零、前提&#xff1a; 实现input输入数字不大于10000&#xff08;需要配合typenumber&#xff0c;maxlength5&#xff0c;这里没写&#xff09; 一、探究代码&#xff1a; <input v-model"model1" input"changeModel1" placeholder"请输入拒收件…...

01 NLP的发展历程和挑战

1.人工智能行业介绍 ANI、AGI、ASI 以下是弱人工智能&#xff08;ANI&#xff09;、强人工智能&#xff08;AGI&#xff09;和超强人工智能&#xff08;ASI&#xff09;的对比表格&#xff1a; 类型定义当前状态弱人工智能&#xff08;ANI&#xff09;专注于特定任务&#x…...

TCP 三次握手:详解与原理

无图、长文警告&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 一、引言二、TCP 三次握手的过程&#xff08;一&#xff09;第一次握手&#xff1a;SYN&#xff08;同步序列号&#xff09;&#xff08;二&#xff09;第二次握手&#xff1a;SYN-ACK&#xff08;同…...