Nginx 配置,如 Synology 反向代理

问题描述

我正在尝试将 Nginx(基于 bitname/Nginx:latest)配置为等效于 Synology 反向代理。这是因为在 Synology 中缺少通配重定向。这样做时,我面临许多问题;因此,我请求帮助以正确配置 Nginx

要求

示例

当前代码(目前无法使用)

# 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;
}