nginx https配置
一.https配置
HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
1.生成证书
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
2.配置ssl
server {listen 443 ssl;server_name ruoyi.https;ssl_certificate /home/ssl/server.crt;ssl_certificate_key /home/ssl/server.key;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers HIGH:!aNULL:!MD5;location / {proxy_pass http://localhost:8088;}
}
如果设置了密码,需要加上
server{……ssl_password_file /home/ssl/cert.pass;……
}
3.https优化
SSL 操作会消耗额外的 CPU 资源。CPU 占用最多的操作是 SSL 握手。有两种方法可以最大程度地减少每个客户端的这些操作数:
- 使保持活动连接能够通过一个连接发送多个请求
- 重用 SSL 会话参数以避免并行连接和后续连接的 SSL 握手
会话存储在工作进程之间共享并由 ssl_session_cache 指令配置的 SSL 会话缓存中。一兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。可以使用 ssl_session_timeout 指令增加此超时。以下是针对具有 10 MB 共享会话缓存的多核系统优化的示例配置:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
二.TCP反向代理
1.stream
#HTTP代理
http {server {listen 8002;proxy_pass http://localhost:8080/;}
}#TCP代理
stream {server {listen 13306;proxy_pass localhost:3306;}
}
2.tcp负载均衡
stream {upstream backend-mysql {server localhost:3306;server localhost:3307;keepalive 8;}server {listen 13306;proxy_pass backend-mysql;}
}
使用keepalive定义连接池里空闲连接的数量。
keepalive_timeout 默认60s。如果连接池里的连接空闲时间超过这个值,则连接关闭。
在最简单的 HTTP 实现中,客户端打开新连接,写入请求,读取响应,然后关闭连接以释放关联的资源。

在客户端读取响应后,保持连接处于打开状态,因此可以将其重新用于后续请求。

使用 keepalive 指令启用从 NGINX Plus 到上游服务器的保持活动连接,定义在每个工作进程的缓存中保留的与上游服务器的空闲保持活动连接的最大数量。当超过此数字时,将关闭最近最少使用的连接。如果没有 keepalives,您将增加更多的开销,并且连接和临时端口都效率低下。
现代 Web 浏览器通常会打开 6 到 8 个保持连接。
三.重写(return和rewrite)
nginx有两个重写指令:return和rewrite
1.return
服务端停止处理并将状态码status code返回给客户端
return code URL
return code text
return code
return URL
强制所有请求使用Https
错误写法
server {listen 8003;server_name ruoyi.loadbalance;return 301 https://localhost:8004;
}
正确写法
server {listen 8003;server_name ruoyi.loadbalance;return 301 https://192.168.56.105:8004;
}
转发和重定向
转发是服务端行为,重定向是客户端行为。
转发
发向代理proxy_pass属于转发,浏览器的访问栏输入的地址不会发生变化。

重定向
return,rewrite属于重定向,在客户端进行。浏览器的访问栏输入的地址会发生变化。

域名迁移,不让用户收藏的链接或者搜索引擎的链接失效
将请求从 www.old-name.com old-name.com 永久重定向到 www.new-name.com,包含http和https请求
server {listen 80;listen 443 ssl;server_name www.old-name.com old-name.com;return 301 $scheme://www.new-name.com$request_uri;
}
由于捕获了域名后面的 URL 部分,因此,如果新旧网站之间存在一对一的页面对应关系(例如,www.new-name.com/about 具有与 www.old-name.com/about 相同的基本内容),则此重写是合适的。如果除了更改域名之外还重新组织了网站,则通过省略以下内容,将所有请求重定向到主页可能会更安全
server {listen 80;listen 443 ssl;server_name www.old-name.com old-name.com;return 301 $scheme://www.new-name.com;
}
添加www
# add 'www'
server {listen 80;listen 443 ssl;server_name domain.com;return 301 $scheme://www.domain.com$request_uri;
}
状态码
- 2xx 成功
- 3xx 表示重定向
-
- 301 永久重定向
- 302 临时重定向
- 4xx 请求地址出错
-
- 403 拒绝请求
- 404 请求找不到
- 5xx 服务器内部错误
rewrite
如果指定的正则表达式与请求 URI 匹配,则 URI 将按照字符串中的指定进行更改。指令按其在配置文件中出现的先后顺序执行。
server {# ...rewrite ^(/download/.*)/media/(\w+)\.?.*$ $1/mp3/$2.mp3 last;rewrite ^(/download/.*)/audio/(\w+)\.?.*$ $1/mp3/$2.ra last;return 403;# ...
}
上面是使用该指令的示例 NGINX 重写规则。它匹配以字符串 /download 开头的 URL,然后在路径后面的某个位置包含 /media/ 或 /audio/ 目录。它将这些元素替换为 /mp3/,并添加相应的文件扩展名,.mp3 或 .ra。和 变量捕获未更改的路径元素。例如,/download/cdn-west/media/file1 变成了 /download/cdn-west/mp3/file1.mp3。如果文件名上有扩展名(如 .flv),则表达式会将其剥离,并将其替换为.mp3。
如果字符串包含新的请求参数,则以前的请求参数将追加到这些参数之后。如果不需要这样做,则在替换字符串的末尾放置一个问号可以避免附加它们,例如:replacement
rewrite ^/users/(.*)$ /show?user=$1? last;
last与break
last:如果当前规则不匹配,停止处理后续rewrite规则,使用重写后的路径,重新搜索location及其块内指令
break:如果当前规则不匹配,停止处理后续rewrite规则,执行{}块内其他指令
不使用last和break
在root /home/AdminLTE-3.2.0/pages下创建一个1.txt,里面内容是this is a file
server {listen 8000;server_name nginx-dev;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1;rewrite ^/new/(.*) /pages/$1;#根目录root /home/AdminLTE-3.2.0;#首页index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}}
默认按顺序执行。
访问 http://192.168.56.105:8000/old/1.txt
结果:this is rewrite test!
日志:
使用break
访问 http://192.168.56.105:8000/old/1.txt
1.匹配到了rewrite ^/old/(.*) /new/$1
2.break指令不执行后续的rewrite规则,以新的/new/1.txt路径去执行块内的其他指令
3. 去root目录下寻找文件, 由于不再村/home/AdminLTE-3.2.0/new/1.txt这个文件,返回404
server {listen 8000;server_name nginx-dev;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1 break;rewrite ^/new/(.*) /pages/$1;#根目录root /home/AdminLTE-3.2.0;#首页index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}}
访问 http://192.168.56.105:8000/old/1.txt

使用last
访问 http://192.168.56.105:8000/old/1.txt
1.匹配到了rewrite ^/old/(.*) /new/$1
2.last指令不执行后续的rewrite规则,以新的/new/1.txt路径去匹配location
3.先匹配到location /, 有匹配到location里的rewrite ^/new/(.*) /pages/$1规则,重定向到
/pages/1.txt
4.匹配到了location /pages/1.txt ,于是返回了this is rewrite test!
server {listen 8000;server_name nginx-dev;rewrite_log on;location / {rewrite ^/old/(.*) /new/$1 last;rewrite ^/new/(.*) /pages/$1;#根目录root /home/AdminLTE-3.2.0;#首页index index.html index2.html index3.html;}location /pages/1.txt {return 200 "this is rewrite test!";}}
访问 http://192.168.56.105:8000/old/1.txt
结果:this is rewrite test!
日志:
四.其他常见指令
gzip压缩
压缩响应通常会显著减小传输数据的大小。但是,由于压缩发生在运行时,因此它还会增加相当大的处理开销,从而对性能产生负面影响。NGINX在将响应发送到客户端之前执行压缩,但如果后端服务器已经对内容进行了压缩,则nginx不会再压缩。
若要启用压缩,请在参数中包含 gzip 指令。
gzip on;
gzip_types text/plain application/xml;
gzip_min_length 1000;
默认情况下,NGINX仅使用压缩MIME类型是text/html的响应。若要使用其他 MIME 类型压缩响应,可以使用 gzip_types 指令并列出其他类型。
若要指定压缩响应的最小长度,请使用 gzip_min_length 指令。默认值为 20 个字节(此处调整为 1000)。
sendfile
默认情况下,NGINX处理文件传输本身,并在发送之前将文件复制到缓冲区中。启用 sendfile 指令可消除将数据复制到缓冲区的步骤,直接将一个文件复制到另一个文件。
启用sendfile,类似Java中的零拷贝(zero copy)
location /download {sendfile on;tcp_nopush on; #...
}
将 tcp_nopush 指令与 sendfile 指令一起使用。这使NGINX能够在获得数据块后立即在一个数据包中发送HTTP响应标头。
try_files
try_files指令可用于检查指定的文件或目录是否存在;如果不存在,则重定向到指定位置。
如下,如果原始URI对应的文件不存在,NGINX将内部重定向到/www/data/images/default.gif
server {root /www/data;location /images/ {try_files $uri /images/default.gif;}
}
最后一个参数也可以是状态代码(状态码之前需要加上等号)。
在下面的示例中,如果指令的所有参数都无法解析为现有文件或目录,则会返回404错误。
location / {try_files $uri $uri/ $uri.html =404;
}
在下一个示例中,如果原始 URI 和附加尾随斜杠的 URI 都没有解析到现有文件或目录中,则请求将重定向到命名位置,该位置会将其传递到代理服务器。
location / {try_files $uri $uri/ @backend;
}location @backend {proxy_pass http://backend.example.com;
}
error_page
为错误指定显示的页面。值可以包含变量。
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
相关文章:
nginx https配置
一.https配置 HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。 1.生成证书 openssl genrsa -des3 -out server.key 20…...
每日一题洛谷P10901 [蓝桥杯 2024 省 C] 封闭图形个数c++
排序思想,只不过这时的排序与之前的略有不同,com函数中要先比较封闭图形再比较真实的大小,多了一步,但是原理还是一样的 #include<iostream> #include<algorithm> #include<vector> using namespace std; //统…...
拓展知识六:MetInfo6.0.0目录遍历漏洞原理分析
所需进行代码审计的文件路径: C:\phpStudy\WWW\MetInfo6.0.0\include\thumb.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\entrance.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\include\class\load.class.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\include…...
tar包部署rabbitMQ
部署erlang: 有网使用: sudo apt-get update sudo apt-get install libncurses5-dev libncursesw5-dev sudo yum install ncurses-devel 无网使用 tar zxvf ncurses.tar.gz mkdir ncurses cd ncurses-6.3/ ./configure --with-shared --without-debu…...
天锐蓝盾终端安全防护——企业终端设备安全管控
从办公室的台式电脑到员工手中的移动终端,这些设备不仅是工作的得力助手,更是企业数据的重要载体。然而,随着终端设备的广泛使用,安全风险也如影随形。硬件设备使用不当、数据随意传输等问题频发,使得企业数据面临着泄…...
MySQL高级特性与大数据应用
事务与锁机制 1.1 事务控制 START TRANSACTION; UPDATE account SET balance balance - 500 WHERE user_id 1001; UPDATE account SET balance balance 500 WHERE user_id 2002; COMMIT; -- 显式提交事务 ROLLBACK; -- 异常时回滚 1.2 锁机制 锁类型:共…...
小智机器人关键函数解析,Application::OutputAudio()处理音频数据的输出的函数
以下是对 Application::OutputAudio() 函数的详细解释: 源码: void Application::OutputAudio() { // 扬声器的输出auto now std::chrono::steady_clock::now();auto codec Board::GetInstance().GetAudioCodec();const int max_silence_seconds 10;…...
玛卡巴卡的k8s知识点问答题(五)
17. Init 类型容器有什么特点,主要用途? 特点: 启动顺序:Init 容器在普通容器启动之前运行,必须先完成所有 Init 容器后,Pod 的主容器才会启动。 顺序执行:如果定义了多个 Init 容器ÿ…...
3.27学习总结 爬虫+二维数组+Object类常用方法
高精度: 一个很大的整数,以字符串的形式进行接收,并将每一位数存储在数组内,例如100,即存储为[1][0][0]。 p2437蜜蜂路线 每一个的路线数前两个数的路线数相加。 #include <stdio.h> int a[1005][1005]; int …...
kafka零拷贝技术的底层实现
什么是 Sendfile? sendfile 是一种操作系统提供的系统调用(system call),用于在两个文件描述符(file descriptor)之间高效传输数据。它最初由 Linux 内核引入(从 2.1 版本开始)&…...
MFC中CMap类的用法和原理
1、CMap 的原理 CMap 是一个基于哈希表的映射类,它将唯一键映射到对应的值。其内部实现依赖于哈希算法,通过哈希函数将键转换为哈希值,然后将哈希值映射到哈希表中的某个位置。如果多个键的哈希值相同(即哈希冲突)&am…...
elementplus的el-tabs路由式
在使用 Element Plus 的 el-tabs 组件,实现路由式的切换(即点击标签页来切换不同的路由页面)。下面是一个基于 Vue 3 和 Element Plus 实现路由式 el-tabs 的基本步骤和示例。 步骤 1: 安装必要的库 在vue3项目安装 Vue Router 和 Element …...
数据结构初阶:单链表
序言: 本篇博客主要介绍单链表的基本概念,包括如何定义和初始化单链表,以及如何进行数据的插入,删除和销毁等操作。 1.单链表 1.1 概念与结构 概念:链表是一种非顺序的存储结构,数据元素的逻辑顺序是通过…...
北斗导航 | 改进伪距残差矢量的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进伪距残差矢量的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球卫星导航系统(GNSS)可靠性的核心技术。本文针对传统伪距残差矢量法在微小故障检测和多故障隔离中的不足,提出一种融合加权奇偶空间与动态阈值调整的改进算法。通过理论推导验证…...
RabbitMQ高级特性--TTL和死信队列
目录 1.TTL 1.1设置消息的TTL 1.1.1配置交换机&队列 1.1.2发送消息 1.1.3运行程序观察结果 1.2设置队列的TTL 1.2.1配置队列和交换机的绑定关系 1.2.2发送消息 1.2.3运行程序观察结果 1.3两者区别 2.死信队列 2.1 声名队列和交换机 2.2正常队列绑定死信交换机 …...
Java后端开发: 如何安装搭建Java开发环境《安装JDK》和 检测JDK版本
文章目录 一、JDK的安装1、 打开 Oracle 官方网址2、点击产品 二、检测JDK是否安装成功以及JDK版本的查看1. 打开命令行窗口检测是否安装成功查看 JDK 版本 一、JDK的安装 1、 打开 Oracle 官方网址 Oracle官网地址:https://www.oracle.com/cn/ 2、点击产品 打开下载的JDK文件…...
LabVIEW液压控制系统开发要点
液压控制系统开发需兼顾高实时性、强抗干扰性和安全性,尤其在重工业场景中,毫秒级响应延迟或数据异常都可能导致设备损坏。本文以某钢厂液压升降平台项目为例,从硬件选型、控制算法、安全机制三方面,详解LabVIEW开发中的关键问题与…...
鸿蒙Flutter实战:18-组合而非替换,现有插件快速鸿蒙化
引言 在对插件鸿蒙化时,除了往期文章现有Flutter项目支持鸿蒙II中讲到的使用 dependency_overrides 来配置鸿蒙适配库的两种方式以外,如果三方插件本身使用了联合插件的形式,也可以通过下面这种方式来添加鸿蒙平台的实现: depen…...
Qt之Service开发
一、概述 基于Qt的用于开发系统服务(守护进程)和后台服务,有以下几个优秀的开源 QtService 框架和库。 1. QtService (官方解决方案) GitHub: https://github.com/qtproject/qt-solutions/tree/master/qtservice 特点: 官方提供的服务框架 支持 Windows 服务和 Linux 守护…...
MFC添加免费版大漠3.1233
先创建一个MFC工程, 添加dm.dll 方法一:通过类向导-添加类-类型库中的MFC类-文件,选择dm.dll,如果没有"添加类型库中的MFC类"选项就用方法二添加 方法二:添加-新建项-MFC-Active或TypeLib-实现接口位置选…...
vue 图片放大到全局
背景: 在vue项目中,el-image组件图片组件用于展示图片,组件自带的属性preview-teleported,设置为true可以控制图片放大到全局 实现效果: 核心代码: //图片地址:BASEUrl /file/ item.file //这…...
人工智能入门(1)
人工智能导引 文章目录 人工智能导引artifiicial intelligence由图灵测试出发的六个领域贝叶斯方法分析成为大多数AI系统中不确定推理的现代方法基础 研究方法 机器学习计算机利用已经有的数据样本,得出某种规律模型,并利用模型预测未来的一种方法 回归算…...
Python爬虫:Feapder 的详细使用和案例
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Feapder 概述1.1 Feapder介绍1.2 Feapder 核心特点1.3 Feapder 主要组件1.4 Feapder的安装2. 基础爬虫编写2.1 创建爬虫2.2 运行爬虫3. 数据采集案例3.1 新闻网站采集3.2 电商商品采集3.3 使用 Spider 类创建更强大爬…...
mybatis里in关键字拼接id问题
我们一般会把ids集合用StrUtil.join(‘,’)转成"1,2,3"这种形式 然后放入in中 我们会这么写: select id, nick_name, icon from tb_user where id in (#{ids}) order by FIELD(id, #{ids})结果发现sql执行是这样的: select id, nick_name, icon from tb_user where…...
在rockylinux9.4安装mongodb报错:缺少:libcrypto.so.10文件库
问题点: rockylinux9.4系统环境报错: ./mongod: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory 解决方法: Ps:解压之后,检查mongodb的依赖环境…...
Spring Boot集成阿里云OSS:对象存储实战指南
Spring Boot集成阿里云OSS:对象存储实战指南 1. OSS是什么?为什么选择阿里云OSS? 对象存储(OSS) 是一种用于存储非结构化数据(如图片、视频、日志文件)的云服务,核心功能包括&#…...
【力扣hot100题】(019)旋转图像
比较考验脑子转不转得过来,最好先在纸上画一下图整理思路,不要和我一样上来就无脑套循环。 理解了思路还是好做的,每个小循环转一圈,大循环代表转的第几圈。小循环循环n-2i-1次,大循环循环(n1)…...
06_约束
文章目录 一、是什么二、实体完整性约束2.1、主键约束2.2、主键自增长2.3、唯一约束 三、域完整性约束3.1、非空约束3.2、默认值 四、引用完整性约束 一、是什么 用于限制加入表的数据的类型和规范,约束是添加在列上的,用来约束列的。 分类: …...
Anolis OS 8.4修复CVE-1999-0554漏洞记录
1. 使用TCP Wrappers配置白名单 通过修改/etc/hosts.allow和/etc/hosts.deny文件,仅允许特定IP访问NFS的mountd服务(需确保系统支持TCP Wrappers): 编辑/etc/hosts.allow,添加允许的客户端IP(如192.168.1…...
Seata AT模式的一些常见问题及其源码解析
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 Seata AT 基于两阶段提交协议的演变: 一阶段:业…...
