问题描述
这是设置:fowarding_proxy
-> server_1
,server_2
server_1
-> app1.domain.com
,app2.domain.com
server_2
-> app3.domain.com
,app4.domain.com
每个服务器都在运行带有基于jwilder/nginx-proxy + letsencrypt setup的Nginx反向代理的docker守护程序。
两台服务器都位于同一路由器的后面,我需要一种基于主机名将流量正确路由到每个路由器的方法。我一直在尝试使用Nginx流模块,因为我不希望转发代理处理任何ssl终止,但是$ssl_preread_name
指令不能(似乎)捕获HTTP流量上的主机名,我无法在流模块中的server
指令上执行301。解决此问题的最佳方法是什么?
我提供了当前正在使用的配置示例,并尝试了多次迭代。打开任何建议。
(此外,什么都没有登录到access.log)
Forward_proxy Nginx.conf
user Nginx;
worker_processes 1;
error_log /var/log/Nginx/error.log warn;
pid /var/run/Nginx.pid;
events {
worker_connections 1024;
}
stream {
# bare bones content,still nothing written to the log.
log_format main '[$time_local] $remote_addr'
access_log /var/log/Nginx/access.log main;
map $ssl_preread_server_name $name {
app1.domain.com server1;
app2.domain.com server1;
app3.domain.com server2;
app4.domain.com server2;
}
upstream server1 {
server server1:80;
}
upstream server2 {
server server1:80;
}
upstream server1_ssl {
server server1:443;
}
upstream server2_ssl {
server server1:443;
}
server {
listen 80;
proxy_pass $name;
ssl_preread on;
}
server {
listen 443;
proxy_pass "${name}_ssl";
ssl_preread on;
}
}
解决方法
想出一个解决方案,很高兴听到更好的解决方案。
我创建了两个新的Nginx容器,而不是单个转发代理:一个用于HTTP流量,另一个用于HTTPS流量,并将它们都放在一个docker-compose文件中,以便于管理。
HTTP-forwarding-proxy
auto lambda = [](unsigned int param)
{
std::bitset<10> bits(param);
std::cout << "inside lambda bits[8] = " << bits[8] << std::endl;
bool b = bits[8];
// ^^^^^^
return b;
};
HTTPS-forwarding-proxy
http {
map $host $name {
default server1;
app3.strangedreamsinc.com server2;
app4.strangedreamsinc.com server2;
}
upstream server1 {
server server1_ip:8080;
}
upstream server2 {
server server2:8080;
}
server {
listen 80 default_server;
server_name _;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://$name;
}
}
}
我不认为没有更好的方法,而且可能有一些我在忽略的事情,但这使我可以透明地将流量路由到正确的反向代理,并且仍然支持letencrypt协议将SSL应用于我的服务器