问题描述
我正在尝试将 Nginx(基于 bitname/Nginx:latest)配置为等效于 Synology 反向代理。这是因为在 Synology 中缺少通配符重定向。这样做时,我面临许多问题;因此,我请求帮助以正确配置 Nginx。
要求
- HTTPS 升级
- 将任何通配符子域 (443) 重定向到端口 30'000
- 隐藏用户可见的重定向端口
- 必须支持 WebSockets(在 Synology 以下标题:升级 $http_upgrade AND Connection $connection_upgrade)
示例
- 浏览器调用 http://app1.my-example.com/
- 重定向到 https://app1.my-example.com:30000/
- 浏览器显示:https://app1.my-example.com/,通过端口 30000 解析
当前代码(目前无法使用)
# Test
server {
listen 8080;
server_name ~^(.*)\.my\-example.com$;
access_log /opt/bitnami/Nginx/logs/yourapp_access.log;
error_log /opt/bitnami/Nginx/logs/yourapp_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass https://$host:30000$request_uri/;
proxy_redirect off;
}
}
# Catch malicIoUs requests
server {
listen 8080 default_server;
listen [::]:8080 default_server;
server_name _;
return 444;
}
解决方法
我能够解决我的问题,并想分享结果。我唯一不明白的是,为什么redirect.my-example 可以作为proxy_pass。它会到达完全相同的路线(可能是无限循环)。反馈/改进将不胜感激!
# custom code for hop by hop headers
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Upgrade connection
server {
listen 8080 default_server;
listen [::]:8080 default_server;
server_name _;
return 301 https://$host$request_uri;
}
# Redirect Subdomains (incl. Web-Socket)
server {
listen 8443 ssl;
ssl_certificate /certs/server.crt;
ssl_certificate_key /certs/server.key;
server_name my-example.de portal.my-example.de;
access_log /opt/bitnami/nginx/logs/yourapp_access.log;
error_log /opt/bitnami/nginx/logs/yourapp_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass https://redirect.my-example.de:30000;
proxy_redirect off;
}
}
# Catch malicious requests
server {
listen 8443 default_server;
listen [::]:8443 default_server;
ssl_certificate /certs/server.crt;
ssl_certificate_key /certs/server.key;
server_name _;
return 444;
}