文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Nginx使用stream模块分流实现端口复用

2023-08-19 05:43

关注

使用Nginx复用端口有很多方法,最普遍的方法是在不同的server块中监听同一端口,根据不同的主机名完成分流。本文介绍了一种较新的端口复用方法,它可以方便地对TLS加密的TCP数据进行分流。

1 Nginx stream分流

Nginx一般都工作在应用层,可以通过多个虚拟主机对端口的监听实现分流。其实,Nginx在1.0.9版本以后增加了stream模块,它利用SNI协议(TLS的扩展协议)对同一端口的不同主机转发流量,这一转发过程在传输层完成。

2 分流示例

下面展示了一个stream分流的实例,它根据不同的域名(capa.ink和crps.ink),将请求转发到不同的服务(web1和web2),实现了443端口的复用。

注意,请确保你的nginx中包含stream模块,否则请重新编译安装!

下面展示了stream块的配置方法(位于nginx.conf)。注意stream块与http块并列。

stream {    map $ssl_preread_server_name $stream_map {        capa.ink web1;        crps.ink web2;    }    upstream web1 {        server 127.0.0.1:8000;    }    upstream web2 {        server 127.0.0.1:8001;    }        #复用443端口    server {        listen 443 reuseport;        listen [::]:443 reuseport;        proxy_pass $stream_map;        ssl_preread on;    #重点,一定要加这句    }}

此时,nginx应该已经可以根据域名分别将请求分流到8000或8001端口了,我们在配置server块时即可直接监听这个端口。

以下代码展示了一个完整的基于php的网页的配置方案,它对应着上面配置中的"web1"服务,我们只需关心server块中前三行内容。由于该域名的请求已经由stream模块转向8000端口,所以在这里只需要监听8000端口即可。

server {        listen 8000 ssl http2;        server_name capa.ink;        port_in_redirect off;        ssl_certificate /document/mywebsite/certification/capa.ink_bundle.pem;        ssl_certificate_key /document/mywebsite/certification/capa.ink.key;        ssl_session_timeout 5m;        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;        ssl_prefer_server_ciphers on;        root /document/mywebsite;        index index.php;        if (!-e $request_filename) {                rewrite ^(.*)$ /index.php$1 last;        }        location ~ .*\.php(\/.*)*$ {                root           /document/mywebsite;                fastcgi_split_path_info ^(.+?.php)(/.*)$;                fastcgi_pass    127.0.0.1:9005;                fastcgi_index   index.php;                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;                include         fastcgi_params;    }}

3 总结

在Nginx中,用stream块复用端口,与用server块复用端口的区别在于,stream块在传输层就完成了域名的传输,并完成分流;而server块在应用层才读取数据中包含的域名信息,再进行分流。stream可以在加密传输的情况下很方便地复用端口,如果要处理非加密的http协议,那么传统的server块完全能够胜任。

来源地址:https://blog.csdn.net/diqiudq/article/details/126907193

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯