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了。
