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



我有一个关于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是我的域名。

我看到整个请求域可以传递到我的docker容器中的服务器,我设置了proxy_set_header Host $host;的头,但我不知道如何在我的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;我需要用proxy_pass<subdomain>部分替换main部分

网站所在的root文件夹将是子域名

例如,如果我有这样一个URL:review-x34kk4ids.website.com,然后我的docker容器nginx应该服务于文件夹x34kk4ids,这是在docker文件夹/home/site_reviews/

既然我没有得到任何答案,我自己找到了解决方案,下面是我解决问题的方法:

这将是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的上游。这是docker容器nginx服务器正在监听的端口。

然后我创建了一个新的自定义头,它被发送到docker容器中的nginx服务器,名称为Review和动态子域的值:proxy_set_header Review $subdomain;

然后容器使用传递的标题子域到正确的文档根,如下所示:

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的变量,然后可以根据需要使用该动态子域。

最新更新