Trojan不能通过7层分流转发,因此不能通过虚拟主机的方法通过Nginx分流
但是,可以通过SNI转发,使得Nginx处理不同的流量。
最新版的lnmp集成了ngx_stream_ssl_preread_module,因此基本上一键安装就包含了Stream模块,典型的配置文件如下:
stream { # 这里就是 SNI 识别,将域名映射成一个配置名 map $ssl_preread_server_name $backend_name { site.A web; site.B proxy_trojan; # 域名都不匹配情况下的默认值 default web; } # web,配置转发详情 upstream web { server 127.0.0.1:44330; } # trojan,配置转发详情 upstream trojan-go { server 127.0.0.1:44333; } #Proxy 中间层,先转发到中间层在下方由Nginx继续做处理以便交付给trojan前卸载流量的proxy protocol (因为trojan不支持proxy protocol特性) upstream proxy_trojan { server 127.0.0.1:44334; } # 监听 443 并开启 ssl_preread # proxy_protocol用于解决真实IP获取问题,后端服务也必须同时在 listen 规则里面配置接受 server { listen 443 reuseport; listen [::]:443 reuseport; proxy_pass $backend_name; proxy_protocol on; ssl_preread on; } # 这里的 server 就是用来帮 Trojan 卸载proxy_protocol协议的中间层处理场所 # 原来的 upstream trojan-go 配置不需要改动 server { listen 44334 proxy_protocol; proxy_pass trojan-go; } }
Stream块在http块之前
此后,由于多次转发了,blog没有办法获得访问者的真实IP,虽然我们在上述配置中提到了这一问题,
但是,在Server块还要添加一下:
……………… listen 44330 ssl proxy_protocol; #Real IP set_real_ip_from 127.0.0.1; real_ip_header proxy_protocol; ………………
这样博客就可以获得访问者的真实IP了。