
以下を設定しようとしています:
┌──────────────────┐ ┌────────────────────┐ ┌─────────┐
│ │ │ │ │ │
│ Router │ │ │ │Server 1 │
│ NAT │Port forward│ │ │ │
│ │ ────────► │ Server 0 │ │HTTP > │
│ │ │ │ │HTTPS │
│ │ │ 1.example.com ───────────► │redirect │
│ │ │ 2.example.com ────┐ └─────────┘
└──────────────────┘ └────────────────────┘ │ 192.168.178.8
192.168.178.4 │
│ ┌─────────┐
│ │ │
│ │ │
│ │Server 2 │
└─► │ │
│HTTP only│
│ │
└─────────┘
192.168.178.7
サーバー 0 を、トラフィックを転送するだけの完全に透過的なプロキシとして動作させたいです。クライアントがサーバー 0 と TLS 接続を確立するのではなく、サーバー 1/2 と直接確立し、サーバー 1/2 での HTTP-01 チャレンジ ベースの自動証明書生成と更新が引き続き機能するようにします。
答え1
編集: リバース プロキシ (SSL トンネルを終了する) とコンテンツ サーバー間の接続が安全でないことが懸念される場合は、これが機能し安全であるにもかかわらず、コンテンツ サーバーとリバース プロキシ間にアップストリーム SSL または SSH や IPSEC などの安全なトンネルを構成する方がよい場合があります。
動作しました:
ファイル構造:
ngnix/
config/
nginx.conf
http_server_name.js
docker-compose.yml
nginx.conf
load_module modules/ngx_stream_js_module.so;
events {}
stream {
js_import main from http_server_name.js;
js_set $preread_server_name main.get_server_name;
map $preread_server_name $http {
1.example.com server1_backend_http;
2.example.com server2_backend_http;
}
map $ssl_preread_server_name $https {
1.example.com server1_backend_https;
2.example.com server2_backend_https;
}
upstream server1_backend_http {
server 192.168.178.8:80;
}
upstream server1_backend_https {
server 192.168.178.8:443;
}
upstream server2_backend_http {
server 192.168.178.7:80;
}
server {
listen 443;
ssl_preread on;
proxy_pass $https;
}
server {
listen 80;
js_preread main.read_server_name;
proxy_pass $http;
}
}
ドッカー
version: '3'
services:
ngnix:
image: nginx
container_name: ngnix
restart: unless-stopped
volumes:
- ./config/ngnix.conf:/etc/nginx/nginx.conf:ro
- ./config/http_server_name.js:/etc/nginx/http_server_name.js:ro
ports:
- "192.168.178.4:80:80"
- "192.168.178.4:443:443"
var server_name = '-';
/**
* Read the server name from the HTTP stream.
*
* @param s
* Stream.
*/
function read_server_name(s) {
s.on('upload', function (data, flags) {
if (data.length || flags.last) {
s.done();
}
// If we can find the Host header.
var n = data.indexOf('\r\nHost: ');
if (n != -1) {
// Determine the start of the Host header value and of the next header.
var start_host = n + 8;
var next_header = data.indexOf('\r\n', start_host);
// Extract the Host header value.
server_name = data.substr(start_host, next_header - start_host);
// Remove the port if given.
var port_start = server_name.indexOf(':');
if (port_start != -1) {
server_name = server_name.substr(0, port_start);
}
}
});
}
function get_server_name(s) {
return server_name;
}
export default {read_server_name, get_server_name}
ドキュメンテーション:
ngx_http_アップストリームモジュール
ngx_http_map_モジュール
ngx_stream_proxy_モジュール
編集#1:
読むこのブログ投稿詳細情報
編集#2:正規表現を使用して、デフォルトのバックエンドと他のドメインの例外 を
設定したり、ドメインのパラメータに基づいてバックエンドを動的に選択したりすることもできます。
この要点詳細情報