我正在尝试用nginx实现下面的功能-
我有2个Docker容器在服务器上运行,一旦容器在端口80上运行nginx并从AWS应用程序负载均衡器接收请求。然后根据URL中的路径,它应该重定向到另一个docker容器上的3个端口之一。在第二个docker容器中运行的应用程序在它们自己的路径上提供内容。
示例-当我输入https://example.com/story/fairy
时,Nginx应该解析/story/fairy
并将其传递给端口9091上的其他Docker容器。从应用返回的数据可以在路径/_myownpath/page1/
上。浏览器的URL应该是-https://example.com/story/fairy/_myownpath/page1
。
然后,如果在这个返回的页面上有其他链接,用户点击了它们,nginx应该只将新路径传递给监听端口9091的应用程序,并说返回的新内容将在路径/_newpath/story_page_11
上。浏览器URL现在应该看起来像https://example.com/story/fairy/_newpath/story_page_11
等等。
我已经把我的头发分开玩nginx配置&还没有能够得到我的头周围,并得到这个权利。
我尝试过的一些配置包括
已尝试代理传递
server {
listen 80;
server_name example.com;
location /story/fairy/ {
# Reject requests with unsupported HTTP method
if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
return 405;
}
# Only requests matching the whitelist expectations will
# get sent to the application server
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:9091/;
proxy_redirect http://localhost:9091/ https://$server_name/;
}
}
字符串
尝试重定向
server {
listen 80;
location /awsmap/dev/ {
if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
return 405;
}
return 301 http://localhost:9091/;
}
型
试着重写
server {
listen 80;
location /story/fairy {
rewrite ^/story(.*)$ / break;
proxy_pass http://localhost:9091;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
absolute_redirect off;
}
location ^~ /story\/fairy/ {
rewrite ^/story(.*)$ / break;
proxy_pass http://localhost:9091;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
absolute_redirect off;
}
}
型
我对nginx的使用经验不多。在这一点上卡住了让这个工作。
我真的很感激ay帮助让这个工作,请。
1条答案
按热度按时间qltillow1#
不同的Docker容器不能通过
localhost
(默认情况下)相互访问。在两个容器之间建立连接的推荐方法是,它们使用相同的docker-network,它们可以使用容器名称作为主机名进行通信。因此,将proxy_pass
行更改为您的应用程序主机,应该可以修复它。例如:
字符串
**注意:**使用docker compose,所有容器共享相同的docker-network,您可以/应该使用它。参见explanation。