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