我正在尝试创建一个反向代理来接受到托管的各种不同 Web 服务器的所有 HTTPS 和 HTTP 连接,我已经设法使 SSL 直通正常工作,最初我们相信我们可以将所有 HTTP 流量重定向到 HTTPS ,但是由于某些设备限制,我们需要 HTTP 流量实际使用端口 80。
我已经尝试了几次让它工作,但我所做的一切几乎都会导致同样的错误。查看access.log和error.log,我注意到所有HTTP流量都没有从上游接收到任何地址信息,因此不会将任何数据传递给proxy_pass。我不认为列出我尝试执行此操作的所有方法会有帮助,但如果有人认为这确实有帮助,我可以详细说明所有方法。
我已经将模块化 .conf 包含到 nginx.conf 中以简化阅读它,但 SSL 直通部分(流块)位于不同的 .conf 中(如果这出于某种原因而重要)。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
stream {
map $ssl_preread_server_name $name {
site1.com site1_backend;
site2.com site2_backend;
site3.com site3_backend;
}
upstream site1_backend {
server 1.1.1.1:443;
server 1.1.1.2:443;
}
upstream site2_backend {
server 2.1.1.1:443;
}
upstream site3_backend {
server 3.1.1.1:443
server 3.1.1.2:443
}
server {
listen 443;
proxy_pass $name;
ssl_preread on;
}
}
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 90;
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
}
所以我想出了如何做到这一点,它比我想要的稍微不太优雅,并且可能会被改进,但它确实可以作为 HTTPS 连接的 SSL 直通,并且 SSL 正在被终止以允许设备使用 HTTP 连接使用 HTTP 进行通信以正确重定向。
我为这两个组件添加了一条分隔线,因为配置是模块化的,但我认为作为完整的配置更容易理解。
负载均衡器充当冗余,您可以将其扩展到代理可以处理的任意数量的 Web 服务器。
我相信我的错误是尝试在与stream{}而不是http{}相同的块中处理HTTP连接。理论上,由于 map 是 http 的指令(而不是流,但显然无论如何都可以工作),因此应该可以稍微清理一下配置,并为所请求的任何服务器创建一个带有变量的 proxy_pass 。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
#################################################################################
# include /etc/nginx/conf.d/ssl-passthrough.conf
#################################################################################
stream {
map $ssl_preread_server_name $name {
site1.com https_site1;
site2.com https_site2;
site3.com https_site3;
}
upstream https_site1 {
server 1.1.1.1:443;
server 1.1.1.2:443 backup;
}
upstream https_site2 {
server 2.1.1.1:443;
}
upstream http_site3 {
server 3.1.1.1:443;
server 3.1.1.2:443 backup;
}
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received"
"$upstream_connect_time"';
access_log /var/log/nginx/stream_access.log basic;
error_log /var/log/nginx/stream_error.log;
server {
listen 443;
ssl_preread on;
proxy_pass $name;
}
}
#################################################################################
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
#################################################################################
# include /etc/nginx/conf.d/proxy_http.conf
#################################################################################
upstream http_site1 {
server 1.1.1.1;
server 1.1.1.2 backup;
}
upstream http_site2 {
server 2.1.1.1;
}
upstream http_site3 {
server 3.1.1.1;
server 3.1.1.2 backup;
}
server {
listen 80;
server_name site1.com;
location / {
proxy_pass http://http_site1;
}
}
server {
listen 80;
server_name site2.com;
location / {
proxy_pass http://http_site2;
}
}
server {
listen 80;
server_name site3.com;
location / {
proxy_pass http://http_site3;
}
}
#################################################################################
}
我希望这对某人有帮助,因为我找不到任何人以这种方式询问 ssl 直通和 ssl 终止,如果有人有任何优化想法或只是可能错误的事情,欢迎任何反馈!