我正在使用 Java Web 应用程序,并且我想要一个反向代理来屏蔽我的一些内部端点。
要求
1. 反向代理映射需要在运行时可修改,例如,如果我们将某些组件移动到另一台服务器,我们应该能够修改映射,以便将新请求路由到此端点。
2. 这必须可以嵌入到像 Jetty 这样的标准 servlet 容器中。
大多数 Java 反向代理(例如 J2EP)都需要在启动应用程序之前提供映射信息。
我正在尝试构建一个反向代理来与某些 API(如 Twitter、Github、Instagram)交谈,然后我可以用我的反向代理调用我想要的任何(客户端)应用程序(把它想象成一个 API 管理器) .
另外,我正在使用 LXC 容器来执行此操作。
例如,这是我从 Twisted Docs 上的示例中破解的最简单的代码:
from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.python.log import startLogging
from sys import stdout
startLogging(stdout)
site = server.Site(proxy.ReverseProxyResource('https://api.github.com/users/defunkt', 443, b''))
reactor.listenTCP(8080, site)
reactor.run()
Run Code Online (Sandbox Code Playgroud)
当我在容器内执行 CURL 时,我得到一个有效的请求(意味着我得到了适当的 JSON 响应)。
这是我如何使用 CURL 命令:
curl https://api.github.com/users/defunkt
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
{
"login": "defunkt",
"id": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/2?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/defunkt",
"html_url": "https://github.com/defunkt",
"followers_url": "https://api.github.com/users/defunkt/followers",
"following_url": "https://api.github.com/users/defunkt/following{/other_user}",
"gists_url": "https://api.github.com/users/defunkt/gists{/gist_id}",
"starred_url": "https://api.github.com/users/defunkt/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/defunkt/subscriptions",
"organizations_url": "https://api.github.com/users/defunkt/orgs",
"repos_url": "https://api.github.com/users/defunkt/repos",
"events_url": "https://api.github.com/users/defunkt/events{/privacy}",
"received_events_url": …Run Code Online (Sandbox Code Playgroud) 我尝试设置 nginx 来验证传入的 https 请求并将它们传递到同一 Intranet (LAN) 中不同主机上的服务器。我从不同的来源得到了以下 conf 文件:
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For proxy_add_x_forwarded_for;
upstream syncthing_gui
{
server 10.0.0.129:8329;
}
server {
listen 443 ssl;
server_name geras.duckdns.org;
ssl on;
ssl_certificate /etc/letsencrypt/live/geras.duckdns.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/geras.duckdns.org/privkey.pem;
auth_basic "Username and Password required (syncthing)";
auth_basic_user_file /etc/nginx/.htpasswd;
location /sync {
error_log /var/log/nginx/error.log info;
access_log /var/log/access.log;
proxy_pass http://syncthing_gui;
}
Run Code Online (Sandbox Code Playgroud)
}
但我得到了错误400 Bad Request: too many Host headers。我需要改变什么?
我的 Nginx 服务器充当 Gitlab 服务器的代理,问题是当我尝试“ **git clone git@gitlab.example.com:username/project.git**”时,我无法克隆项目 [它不是从 Nginx 服务器到 Gitlab 服务器的隧道]
当我使用 Gitlab 服务器的 IP 地址更新本地系统的 /etc/hosts 文件时,它可以在没有密码的情况下正常克隆 [我已经在 Gitlab 上使用 SSH 公钥更新了我的配置文件]。
所以我得出的结论是,我必须用规则更新我的 Nginx 配置,这些规则可以通过 Nginx 服务器将 SSH 通信从任何客户端系统隧道传输到 Gitlab 服务器。
通过进行如下更改来尝试此链接上的代码:
upstream gitlab {
server 192.168.61.102:22;
}
server {
listen 22;
server_name gitlab.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://gitlab;
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用。如果有人帮助我调整规则以使其发挥作用,那就太好了。
注意:上面代码中192.168.61.102是我的gitlab服务器的IP地址,我的Nginx服务器在192.168.61.101
我有一个带有 http 和 https 服务的 apache 反向代理服务器。我想将 http 重定向到 https 强制。我应该配置什么配置文件?
在我的应用程序中,我集成Identity server 3了openid-connect. 在我们的生产服务器上,我们的网站位于导致问题的反向代理后面;
当用户登录并被身份服务器重定向回时,我们的应用程序希望将用户重定向到他的原始位置(带有 的页面AuthorizeAttribute)。这里的问题是用户被重定向到隐藏的 url 而不是reverse proxy.
如何将用户重定向到公共网址?
奇怪的情况:有一个android应用程序。在它直接工作到 apache2 之前。最近我尝试使用 nginx 作为反向代理。应用程序停止工作。nginx 日志上的调试显示“ SSL_do_handshake() failed (SSL: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown:SSL alert number 46) while SSL handshaking”。然后切换回 apache2,打开调试,但在 apache2 应用程序连接使用 TLS 而不是 SSLv3。有没有人遇到过这种情况?为什么android应用程序尝试使用SSLv2(已弃用)但使用带有TLS的apache2连接nginx?感谢您提前的想法。
我想构建一个 http 反向代理,它检查 HTTP 正文并在此之后将 HTTP 请求发送到它的上游服务器。你怎么能在 go 中做到这一点?
初始尝试(跟随)失败,因为 ReverseProxy 复制传入的请求,修改它并发送,但正文已被读取。
func main() {
backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, fmt.Sprintf("ioutil.ReadAll: %s", err), 500)
return
}
// expecting to see hoge=fuga
fmt.Fprintf(w, "this call was relayed by the reverse proxy, body: %s", string(b))
}))
defer backendServer.Close()
rpURL, err := url.Parse(backendServer.URL)
if err != nil {
log.Fatal(err)
}
proxy := func(u *url.URL) http.Handler {
p := httputil.NewSingleHostReverseProxy(u)
return http.HandlerFunc(func(w …Run Code Online (Sandbox Code Playgroud) 问题:
req.Host = req.URL.Host会导致它失败。而不是返回{"Code":"OBRI.FR.Request.Invalid","Id":"c37baec213dd1227","Message":"An error happened when parsing the request arguments","Errors":[{"ErrorCode":"UK.OBIE.Header.Missing","Message":"Missing request header 'x-fapi-financial-id' for method parameter of type String","Url":"https://docs.ob.forgerock.financial/errors#UK.OBIE.Header.Missing"}]}
它返回一个404.httputil. NewSingleHostReverseProxy当我取消注释该行时,我想跟踪代理返回的调用
req.Host = req.URL.Host。鉴于这样的请求:
$ curl http://localhost:8989/open-banking/v2.0/accounts
Run Code Online (Sandbox Code Playgroud)
以及下面的代码 ( main.go):
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
target, err := url.Parse("https://rs.aspsp.ob.forgerock.financial:443")
log.Printf("forwarding to -> %s%s\n", target.Scheme, target.Host)
if err != nil {
log.Fatal(err)
}
proxy := httputil.NewSingleHostReverseProxy(target)
http.HandleFunc("/", func(w http.ResponseWriter, req …Run Code Online (Sandbox Code Playgroud) 我希望你能帮助我解决我的问题!这是信息。
情况
我目前有两个工作容器,我需要在同一个端口 80 上运行。有一个网站,目前只需转到服务器的主机 url 和 restful api 即可访问。但是,它必须通过所有端口 80 来工作,并且登录向 restful api 发出请求,该 api 也必须侦听端口 80 以处理请求。因此,从我所见,我需要一个反向代理,例如 nginx 来适当地映射内部/外部端口。
问题
在将 nginx 反向代理和其他两个容器进行 dockerizing 时,我真的不明白那里的教程......目前,restful api 使用一个简单的 Dockerfile,应用程序使用 docker-compose 和一个 mysql 数据库。我非常不确定我应该如何做这件事。我是否应该将所有这些都放在一个带有 nginx 反向代理的文件夹中,然后 docker-compose 处理每个都有 dockerfiles/docker-compose 的所有子文件?我看到的大多数教程都在谈论拥有两个不同的网站等等,但似乎没有多少人谈论一个宁静的 api 以及一个网站。据我所知,我肯定会使用这个 docker hub image。
Docker 镜像当前结构
- RestApi
- Dockerfile
- main.go
- Website
- Dockerfile
- Docker-compose
- Ruby app
Run Code Online (Sandbox Code Playgroud)
我应该沿着反向代理文件夹创建一个父文件夹并将所有这 3 个放在父文件夹中吗?就像是 :
- Parentfolder
- Reverse-proxy
- RestApi
- Website
Run Code Online (Sandbox Code Playgroud)
然后有一些网站谈论修改启用了站点的文件夹,有些没有,有些谈论虚拟主机,其他关于使用网络标签启动 docker ......我应该把我的 nginx.conf …
reverse-proxy ×10
nginx ×4
go ×2
http ×2
https ×2
proxy ×2
apache ×1
asp.net-mvc ×1
c# ×1
docker ×1
dockerfile ×1
gitlab ×1
java ×1
lxc ×1
python ×1
redirect ×1
ssh-tunnel ×1
sslv3 ×1
twisted ×1
twisted.web ×1