Nginx向上游服务器发送动态子域

0g0grzrc  于 2023-04-20  发布在  Nginx
关注(0)|答案(1)|浏览(129)

我有一个关于proxy_pass和动态子域的问题。
在我的服务器上,我有一个site_block,它看起来像这样:

upstream mydockersite{
        server 127.0.0.1:8081;
}
server {
        listen 80;

        server_name ~^review-+(?<subdomain>.+)\.website\.com;

         location / {
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                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_set_header X-Forwarded-Proto $scheme;
                proxy_cache_bypass $http_upgrade;

                proxy_pass http://mydockersite;
        }

}

它可以很好地将传入的请求重定向到我的服务器上,然后将其重定向到我的Docker容器上,这也是一个NGINX服务器。
例如:
http://review-xyz.website.com
或者
http://review-somedynamicsubdomain.website.com
或者
http://review-anothersubdomain.website.com
review-部分是固定的情况下,<subdomain>部分可以是任何东西,而website.com无论如何都是我的域。
我看到整个请求域可以通过我设置的proxy_set_header Host $host;头部传递到我的docker容器中的服务器,但我不知道如何在我的docker nginx服务器的配置中获取它们并重定向到请求的root文件夹。
在我的docker容器中的nginx服务器的配置看起来像这样:

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    
    ######## MY PROBLEM IS HERE ########
    root /home/site_reviews/main; 
    ####################################        

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

在线:root /home/site_reviews/main;我需要将main部分替换为proxy_pass<subdomain>部分
因此,网站所在的root文件夹将是子域
例如,如果我有一个这样的URL:review-x34kk4ids.website.com,那么我的docker容器nginx应该服务于docker文件夹/home/site_reviews/中的文件夹x34kk4ids

r7knjye2

r7knjye21#

所以,由于我没有得到任何答案,我自己找到了解决方案,下面是我如何解决这个问题:
这将是动态子域的nginx站点块:

upstream reiviewcontainer{
 server 127.0.0.1:8081;
}

server {
    listen 80;

    server_name ~^review-+(?<subdomain>.+)\.website\.com;

     location / {
            
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;

            ###This line is my solution###
            proxy_set_header Review $subdomain;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_cache_bypass $http_upgrade;

            proxy_pass http://reiviewcontainer;
    }
 }

我在8081端口上创建了一个指向127.0.0.1的upstream。这是docker容器nginx服务器监听的端口。
然后,我创建一个新的自定义头,它被发送到docker容器中的nginx服务器,名称为Review,值为动态子域:proxy_set_header Review $subdomain;
然后容器使用header中传递的子域到正确的文档根,如下所示:

server {
 listen 80;
 index index.php index.html;

 ### grab the subdomain from the header and set to a variable
 set $folder $http_review;

 ### set root folder of website according to the passed subdomain
 root /home/reviews/$folder/public;

 location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
 }

 location / {
  try_files $uri $uri/ /index.php?$query_string;
  gzip_static on;
 }
}

请注意,在docker容器中发送到nginx服务器的自定义头称为Review,但在docker容器中的nginx服务器中,我用http_review抓取它并将其设置为名为$folder的变量,然后可以根据需要使用该动态子域。

相关问题