是否可以在同一个 nginx 服务器中“插入”不同的 web 服务(从不同的 docker 容器公开)?
这是一个简单的例子,可以帮助您了解总体思路:
server {
listen 80;
listen [::]:80;
client_max_body_size 10M;
charset utf-8;
server_name my.server.org;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8081/;
}
location /static/ {
include proxy_params;
include /etc/nginx/mime.types;
alias /var/www/app/static/;
}
location ^~ /app2/ {
include proxy_params;
proxy_pass http://127.0.0.1:8082;
}
location ^~ /app3/ {
include proxy_params;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8083;
}
}
其中location /
是第一个应用程序的根目录,以及下一个位置块中的静态文件。
第一个应用程序正在运行http://my.server.org/。
我想访问另外两个应用程序http://my.server.org/app2/和http://my.server.org/app3/同时保持相同的服务器名称my.server.org
。
这些应用程序与主应用程序相关,但它们完全独立,即它们由其他docker组合提供服务,它们的端口分别暴露在8082和8083。
是否有可能在一个独特的块内实现如此简单的任务server
?
目前,当我访问另外两个 URL 时,出现 404 错误。
我基本上想将这些工作 URL + 端口及其所有子元素映射到命名位置:
http://my.server.org:8081/..。 ->http://my.server.org/..。
http://my.server.org:8082/..。 ->http://my.server.org/app2/..。
http://my.server.org:8083/..。 ->http://my.server.org/app3/..。
编辑:
或者这样:
location /app3/ {
if ($http_referer ~ "^$scheme://$http_host/app3/") {
rewrite ^/app3/(.*) $scheme://$http_host/app3/$1 redirect;
}
include proxy_params;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8083;
}
或这个:
location ~*/app3/(.*)$ {
include proxy_params;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8083/$1;
}
运行情况相同,但并不完美,因为还存在两个问题:
- 仅提供原始 HTML(例如,css 文件上没有样式:“502 bad gateway”)
- 页面内的链接指向例如
http://my.server.org/subfeature/subitem
而不是http://my.server.org/app3/subfeature/subitem
。因此,它们“缺少”前缀,/app3
如果它不在实际应该出现的位置,我不知道如何实际添加它。
答案1
这是一项典型的任务,但您忘记了两件事:
- 谷歌搜索你的问题。
rewrite
在每个块中添加子句location {}
。