IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Nginx 七层及四层反向代理配置 -> 正文阅读

[网络协议]Nginx 七层及四层反向代理配置


本文旨在测试 nginx对 http服务 https 服务 的代理方式。

部署测试 http服务

准备测试服务程序 gintest 并启动如下

[root@localhost ~]# sudo nohup ./gintest 9000 &
[1] 4229
[root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@localhost ~]# 
[root@localhost ~]# curl http:localhost:9000
curl: (6) Could not resolve host: http:localhost; 未知的错误
[root@localhost ~]# curl http://localhost:9000
{"message":"测试程序,服务器ip:192.168.90.9,端口:9080"}[

nginx反向代理 http服务

安装 nginx 并修改配置文件 ,对 web服务进行代理如下

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://192.168.90.9:9000;
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

启动 nginx 并访问,结果如下 代理成功

在这里插入图片描述

nginx 通过 https反向代理 http服务

使用 https 服务需要安装http_ssl_module 否则会报错 『ssl parameter requires ngx_http_ssl_module』

重新编译安装 nginx
nginx源码根目录执行如下命令 ,重新编译 ,输出目录保持不变

 ./configure   --with-http_stub_status_module --with-http_ssl_module
 
 make && make install 安装 

成功后可以看到我们的 nginx 目录下已经安装了新版本的 nginx

在这里插入图片描述
配置 nginx
提前准备好一套证书和私钥, tls.crt tls.key

nginx http 模块配置中,增加如下配置

  server {
        listen       443 ssl;
        server_name  www.mytest.com;

        ssl_certificate      /root/tls.crt;
        ssl_certificate_key  /root/tls.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_pass http://192.168.90.9:9000;
            root   html;
            index  index.html index.htm;
        }
    }

重新加载 配置

[root@localhost conf]# ../sbin/nginx -s   reload

访问测试
通过https访问应用成功,如下:

在这里插入图片描述
这种情况下需要将 应用的证书配置到nginx,如果 nginx代理了很多应用,每个应用证书不同,那么需要配置很多证书。
nginx提供了 stream 模块用于 tcp/udp 请求直接转发后台服务器处理,不用配置证书。如下

Nginx Stream模块负载均衡测试

准备测试用 https服务

准备一个 java https 服务
部署 tomcat及 web示例应用
在这里插入图片描述

生成tomcat 证书

[root@mysql tomcat]# keytool -genkey -v -alias tomcat -keyalg RSA -keystore /root/tomcat/certs/tomcat.keystore -validity 365
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  zhang
您的组织单位名称是什么?
  [Unknown]:  pcitc
您的组织名称是什么?
  [Unknown]:  ptitc
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  bj
CN=zhang, OU=pcitc, O=ptitc, L=bj, ST=bj, C=bj是否正确?
  []:  y

正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 365 天):
         CN=zhang, OU=pcitc, O=ptitc, L=bj, ST=bj, C=bj
输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):  
[正在存储/root/tomcat/certs/tomcat.keystore]

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /root/tomcat/certs/tomcat.keystore -destkeystore /root/tomcat/certs/tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
[root@mysql tomcat]# ll certs
总用量 4
-rw-r--r-- 1 root root 2201 3月   3 00:14 tomcat.keystore

配置 tomcat SSL 连接
tomcat 配置文件 server.xml中增加如下内容 :

在这里插入图片描述
https服务访问测试
通过 https 访问web服务成功
https://192.168.90.20:8443/testWeb/index.jsp
在这里插入图片描述

nginx stream 安装配置

nginx 安装 stream 模块
重新编译安装 nginx

./configure   --with-stream

make && make install 

配置 nginx stream
nginx.conf配置文件中增加 stream配置(和 http 模块并列)
在这里插入图片描述

访问测试
通过 nginx 443 端口可以在没有配置证书的情况下可以通过 https访问后台的应用。
在这里插入图片描述

负载均衡策略

该模块支持的负载均衡策略如下:
Round Robin 轮询– 默认情况下,NGINX 使用 Round Robin 算法对流量进行负载平衡,将其按顺序定调用上游组中的服务器。因为是默认方法,所以没有 round?robin 指令 不配置即为 轮询。
Least Connections 最少连接数:( least_conn) - NGINX 选择当前活动连接数较少的服务器。
Least Time ( least_time;仅适用于 NGINX Plus ) – 选择具有最低平均延迟和最少活动连接数的服务器。用于计算最低平均延迟的方法取决于 least_time 指令中包含以下哪些参数:
connect – 连接上游服务器的时间
first_byte – 接收第一个数据字节的时间
last_byte – 从服务器接收完整响应的时间
示例如下:

upstream stream_backend {
    least_time first_byte;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

Hash ( hash) – NGINX 根据用户定义的header选择服务器,例如源 IP 地址 ( $remote_addr),如下:

upstream stream_backend {
    hash $remote_addr;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

哈希负载平衡方法常用于保持会话。指定一个 consistent 选项 可以使用 ketama 一致性hash算法:

hash $remote_addr consistent;

默认采用轮询算法

nginx stream 中upstream 配置两个后台服务器如下:

upstream testjava{
    server 192.168.90.20:8443;
    server 192.168.90.21:8443;
}
server {
    listen 443;
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
    proxy_pass testjava;
}

进行访问测试 两个后台服务器轮流被访问
在这里插入图片描述
在这里插入图片描述

一致性 hash 算法测试

nginx.conf stream 模块 中配置如下

upstream testjava{
    hash $remote_addr consistent;
    server 192.168.90.20:8443;
    server 192.168.90.21:8443;
}

server {
    listen 443;
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
    proxy_pass testjava;
}

多次访问都访问到同一个后台服务器,证明会话保持成功

在这里插入图片描述

参考文档:http://www.wjhsh.net/felixzh-p-8696552.html

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:57:23  更:2022-03-04 15:58:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:24:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码