Nginx分布式框架详解86-92nginx反向搭理02

nginx的安全控制及SSL加密介绍

nginx的反向代理是如何来提升web服务器的安全呢?
答案是:安全隔离。

什么是安全隔离

通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。

如何使用SSL对流量进行加密

翻译成大家能熟悉的说法就是将我们常用的 http 请求转变成 https 请求,那么这两个之间的区别简单的来说两个都是 HTTP 协议,只不过 https 是身披 SSL 外壳的 http.

HTTPS 是一种通过计算机网络进行安全通信的传输协议。它经由 HTTP 进行通信,利用 SSL/TLS 建立全通信,加密数据包,确保数据的安全性。

SSL(Secure Sockets Layer)安全套接层
TLS(Transport Layer Security)传输层安全
上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS 和 SSL 在传输层和应用层对网络连接进行加密。

总结来说为什么要使用 https:

http 协议是明文传输数据,存在安全问题,而 https 是加密传输,相当于 http + SSL,并且可以防止流量劫持。
Nginx 默认不支持 https 开头的协议,如果要想使用 SSL,需要满足一个条件即需要添加一个模块 --with-http_ssl_module,而该模块在编译的过程中又需要 OpenSSL 的支持,OpenSSL 我们在 Nginx 安装 已经准备好了。

nginx添加ssl的支持

  1. 查看 configure arguments 的配置信息,拷贝出来
nginx -V
# 拷贝 configure arguments 后面的数据
  1. 完成 --with-http_ssl_module 模块的增量添加。
cd /usr/local/nginx/sbin
mv nginx nginx.backup
  1. 进入 Nginx 的安装目录,执行 make clean 清空之前编译的内容
cd /root/nginx-1.22.0
make clean
  1. 使用 configure 来配置参数,添加 ngx_http_ssl_module 模块,记得加上第(2)步拷贝的配置信息
./configure --with-http_ssl_module # 记得添加 configure arguments 后的数据
  1. 通过 make 模板进行编译
make
  1. 将 objs 下面的 nginx 可执行文件移动到 /usr/local/nginx/sbin 下
cd objs
mv nginx /usr/local/nginx/sbin/
  1. 在源码目录(安装包目录)下执行 make upgrade 进行升级,这个可以实现不停机添加新模块的功能
cd /root/nginx-1.22.0
make upgrade

nginx的ssl相关指令

该模块的指令都是通过 ngx_http_ssl_module 模块来解析的,我们上一步已经添加了。
ssl指令用来在指定的服务器开启https,默认关闭,可以使用 listen 443 ssl; 这种方式更通用些。

语法 默认值 位置
ssl <on off>; ssl off;

ssl 默认监听的是 443 端口,所以使用下面的指令和 ssl on 效果一致,因为下面的指令能突出 sll 的监听端口,所以建议使用它。

server{
	listen 443 ssl;
}

ssl_certificate 指令是为当前这个虚拟主机指定一个带有 PEM 格式证书的证书。

语法 默认值 位置
ssl_certificate ; http、server

ssl_certificate_key 指令用来指定 PEM secret key 文件的路径

语法 默认值 位置
ssl_ceritificate_key ; http、server

ssl_session_cache 指令用来配置用于 SSL 会话的缓存

语法 默认值 位置
ssl_sesion_cache <off none [builtin[:size]] [shared:name:size]>

选项介绍:

  • off:严格禁止使用会话缓存:Nginx 明确告诉客户端会话不能被重用
  • none:禁止使用会话缓存,Nginx 告诉客户端会话可以被重用,但实际上并不在缓存中存储会话参数(任性,言语同意用,行为取消用)
  • builtin:内置 OpenSSL 缓存,仅在一个工作进程中使用。缓存大小在会话中指定。如果未给出大小,则等于 20480 个会话。使用内置缓存可能会导致内存碎片
  • shared:所有工作进程之间共享缓存,缓存的相关信息用 name 和 size 来指定,同 name 的缓存可用于多个虚拟服务器
    name 是允许缓存的数据名,size 是允许缓存的数据大小,以字节为单位

例如:

ssl_session_cache builtin:1000 shared:SSL:10m;  

10m 的 m 是兆。

ssl_session_timeout 指令用于开启 SSL 会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间,默认值超时时间是 5 秒

语法 默认值 位置
ssl_session_timeout ssl_session_timeout 5m; http、server

ssl_ciphers 指令指出允许的密码,密码指定为 OpenSSL 支持的格式

语法 默认值 位置
ssl_ciphers ; ssl_ciphers HIGH:!aNULL:!MD5; http、server

可以直接在 Linux 系统上使用 openssl ciphers 查看 OpenSSl 支持的格式

openssl ciphers

ssl_prefer_server_ciphers 指令指定是否服务器密码优先客户端密码,默认关闭,建议开启。

语法 默认值 位置
ssl_perfer_server_ciphers <on off>; ssl_perfer_server_ciphers off;

nginx如何通过阿里云购买ssl证书

方式一:使用阿里云/腾讯云等第三方服务进行购买免费版
需要购买域名进行证书的绑定,否则证书无法使用。

阿里云购买免费SSL证书详细文档

nginx使用openssl生成证书

这个方式适用于学习阶段,实际开发阶段使用方式一

  1. 先要确认当前系统是否有安装 OpenSSL
openssl version

安装下面的命令进行生成(一步一步来)

  1. 创建 /root/cerr 目录并进入
mkdir /root/cert
cd /root/cert
  1. 指定加密算法和加密方式,生成 server.key
# genrsa 是加密算法,des3 是加密方式,-out 代表输入长度为 2048 的 server.key
openssl genrsa -des3 -out server.key 2048

# 然后它会让你注册 server.key 的密码
# 输入密码 ......
  1. 根据你注册的 server.key 密码,生成 server.csr 文件,生成后它会让你注册你的基本信息,因为是个人的,所以信息随便填写
openssl req -new -key server.key -out server.csr

# 这里注册你的基本信息,信息随便填写


5. 备份 server.key

cp server.key server.key.org
  1. 重新生成 server.key 文件,并输入刚才注册的密码
openssl rsa -in server.key.org -out server.key

# 会让你重新输入注册密码
  1. 生成 server.crt 文件
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  1. 最后使用 ls 查看目录下是否生成相应的文件:
ls -lh

total 16K
-rw-r--r-- 1 root root 2.0K Sep 24 12:03 server.crt
-rw-r--r-- 1 root root 1.8K Sep 24 12:00 server.csr
-rw------- 1 root root 3.2K Sep 24 12:02 server.key
-rw------- 1 root root 3.3K Sep 24 12:01 server.key.org

SSL实例模板(通用)

nginx.conf添加如下内容:

server {
    listen 80;
}
# ssl配置
server {
    listen 443 ssl;
    server_name mayanan.cn;
    ssl_certificate /usr/local/nginx/keys/6569749_www.mayanan.cn.pem;
    ssl_certificate_key /usr/local/nginx/keys/6569749_www.mayanan.cn.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 表示使用的加密套件的类型
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;  # 表示使用的TLS协议的类型
    ssl_prefer_server_ciphers on;

    location / {
        root html;
        index index.html index.htm;
    }

}

其实这个模板就是 Nginx 解压目录的 conf 目录下的 nginx.conf 内容。

建议:配置SSL证书的时候,不要修改原来server模块(listen 80模块),应该新建一个server模块。

解决默认http问题

配置完 SSL 证书还远远不安全。如果直接输入 www.frx.com,会默认加上『 http:// 』 而不是『 https:// 』,如何修改为『 https:// 』呢,我们利用 Rewrite 功能:

 server {
    listen 80;
    server_name mayanan.cn;
    location / {
        proxy_pass http://gin-blog;
        rewrite ^(.*)$ https://mayanan.cn$1;
    }
}
upstream gin-blog {
    server 172.17.82.242:8000;
    server 172.17.82.242:8001;
    server 172.17.82.242:8002;
}

nginx的反向代理+负载均衡+ssl小案例:

server {
    listen 80;
    server_name www.mayanan.cn mayanan.cn;
    location / {
        rewrite ^(.*)$ https://mayanan.cn$1;
    }
}
upstream gin-blog {
    server 172.17.82.242:8000;
    server 172.17.82.242:8001;
    server 172.17.82.242:8002;
}

# ssl配置
server {
    listen 443 ssl;
    server_name www.mayanan.cn mayanan.cn;
    ssl_certificate /usr/local/nginx/keys/6569749_www.mayanan.cn.pem;
    ssl_certificate_key /usr/local/nginx/keys/6569749_www.mayanan.cn.key;
    ssl_session_cache    shared:SSL:1m;  # 多个工作进程共享缓存:缓存名称:缓存大小
    ssl_session_timeout 5m;  # 缓存超时时间
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 表示使用的加密套件的类型
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;  # 表示使用的TLS协议的类型
    ssl_prefer_server_ciphers on;  # 服务器的密码优先于客户端的密码

    location / {
        root html;
        index index.html index.htm;
    }

    location /apis/ {
        proxy_pass http://gin-blog/;
    }
}

反向代理系统调优

反向代理值 Buffer 和 Cache。

Buffer 翻译过来是「缓冲」,Cache 翻译过来是「缓存」。

https://cdn.staticaly.com/gh/xustudyxu/image-hosting1@master/20220802/image.6p7uoj5ab0k0.webp

客户端通过代理服务器向被代理服务器获取数据后,代理服务器在获取的数据存储在缓存「瓶子」里,客户端再次获取相同资源时,直接从缓存「瓶子」里获取数据,不需要向被代理服务器获取数据,减轻压力。

相同点:

两种方式都是用来提供 IO 吞吐效率,都是用来提升 Nginx 代理的性能。
不同点:

缓冲主要用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦此次操作完成后,就可以删除
缓存主要是备份,将被代理服务器的数据缓存一份到代理服务器,这样的话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除

Proxy Buffer 相关指令

proxy_buffering 指令用来开启或者关闭代理服务器的缓冲区,默认开启。

语法 默认值 位置
proxy_buffering <on off>; proxy_buffering on;

proxy_buffers 指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。

语法 默认值 位置
proxy_buffers ; proxy_buffers 8 4k 8K;(与系统平台有关)
  • number:缓冲区的个数
  • size:每个缓冲区的大小,缓冲区的总大小就是 number * size

proxy_buffer_size 指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与 proxy_buffers 中的 size 一致即可,当然也可以更小。

语法 默认值 位置
proxy_buffer_size ; proxy_buffer_size 4k 8k;(与系统平台有关)

proxy_busy_buffers_size 指令用来限制同时处于 BUSY 状态的缓冲总大小。

语法 默认值 位置
proxy_busy_buffers_size ; proxy_busy_buffers_size 8k 16K;

proxy_temp_path 指令用于当缓冲区存满后,仍未被 Nginx 服务器完全接受,响应数据就会被临时存放在磁盘文件上的该指令设置的文件路径下

语法 默认值 位置
proxy_temp_path ; proxy_temp_path proxy_temp; http、server、location

注意 path 最多设置三层。

proxy_temp_file_write_size 指令用来设置磁盘上缓冲文件的大小。

语法 默认值 位置
proxy_temp_file_write_size ; proxy_temp_file_write_size 8K 16K;

网站调优模板(通用)

proxy_buffering on;
proxy_buffers 4 64k;
proxy_buffer_size 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;

反向代理将客户端真实ip添加到请求头里面去

location /apis/ {
    proxy_pass http://gin-blog/;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
posted @ 2022-09-24 16:32  专职  阅读(53)  评论(0编辑  收藏  举报