标签: nginx-reverse-proxy

如何通过nginx反向代理调试远程Java应用程序

我需要调试在 nginx 反向代理后面运行的远程 java 应用程序。我收到以下错误:

无法连接到远程调试对象虚拟机。原因:java.io.IOException:收到无效握手

为了实现这一点,正确的 nginx 配置应该是什么?

我已通过直接定位应用程序的主机,成功将 vscode java 调试器附加到远程 java 应用程序。

解析器是 127.0.0.11 因为我使用的是 nginx docker 镜像。

我的 nginx 配置文件app.xyz.com.conf在 conf.d 中:

server {
    listen 1043;
    resolver 127.0.0.11 valid=30s;
    server_name app.xyz.com;
    include /etc/nginx/mime.types;
    location / {
        proxy_buffer_size 8k;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Real-IP $remote_addr;
        set $upstream "http://java-app:1043";
        proxy_pass $upstream;
        client_max_body_size 10M;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

java remote-debugging nginx jdwp nginx-reverse-proxy

5
推荐指数
1
解决办法
1190
查看次数

Nginx 接受 proxy_pass 中的尾部斜杠或不接受尾部斜杠

我遇到了以下问题,我希望能够从带有尾部斜杠不带尾部斜杠的主网站访问代理传递的位置(托管 docker 容器中的 React/NextJs webApp)。

目前,当我点击:

http://my-website.com/test # 这有效

但当我击中时:

http://my-website.com/test/ # 失败并返回 404

我希望能够同时访问这两个网址。我缺少什么?

   ### Default Server ###
    server {
        listen 80;
        root /usr/site;
        if ($http_x_forwarded_proto = "http") {
            return 301 https://$host$request_uri;
        }
        location ~/test(.*)$ {
                set $upstream_endpoint http://$docker_container_url;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_pass $upstream_endpoint$1/;
                proxy_set_header    Host    $host;
                proxy_cache_bypass  $http_upgrade;
        }
    }
Run Code Online (Sandbox Code Playgroud)

nginx nginx-reverse-proxy nginx-config

5
推荐指数
1
解决办法
3040
查看次数

使用 Traefik 或 NGINX 在 Docker Swarm 上正确处理 Socket.io

我正在使用 Socket.IO 在 Node.js 中开发一个应用程序,该应用程序使用 Docker Swarm 进行部署,并且我想要选择应用程序服务的多个实例。但是,当存在多个实例时,应用程序就会失败。该故障涉及浏览器中每个 Socket.IO 消息的错误、​​消息中应发送的数据从未到达等。

Docker Stack文件有四个服务

  • Node.js 应用程序
  • 在多节点 Socket.IO 服务中处理 Socket.IO 和会话所需的 REDIS 实例 - 是的,我已经阅读了有关此内容的 Socket.IO 文档,实现了 SessionStore connect-redis,并用于socket.io-redis执行多节点 Socket.IO
  • 数据库(MySQL)
  • 反向代理 - 我使用过 NGINX 和 Traefik

在 Socket.IO 中,有一个例行的 keepalive 请求,例如 GET 上的请求/socket.io/?EIO=3&transport=polling&t=NLjcKJj&sid=X5UnuTjlYNJ4N8OsAAAH。该请求可在反向代理的日志文件中看到,并由应用程序处理。Engine.IO 的调试输出表明它收到了这些请求。

具体来说:

2020-10-28T05:06:02.557Z Net read redis:6379 id 0
2020-10-28T05:06:02.557Z socket.io:socket socket connected - writing packet
2020-10-28T05:06:02.557Z socket.io:socket joining room X5UnuTjlYNJ4N8OsAAAH
2020-10-28T05:06:02.557Z socket.io:client writing packet {"type":0,"nsp":"/"}
2020-10-28T05:06:02.557Z socket.io:socket joined room [ 'X5UnuTjlYNJ4N8OsAAAH' ]
2020-10-28T05:06:02.656Z …
Run Code Online (Sandbox Code Playgroud)

socket.io docker-swarm traefik nginx-reverse-proxy

5
推荐指数
1
解决办法
4198
查看次数

selenium.common.exceptions.WebDriverException:消息:未知错误:net::ERR_CONNECTION_RESET

我对这些技术很陌生。
我的操作系统是 ubuntu-18.04,并使用 anaconda 创建一个虚拟环境,并通过 pip 安装和所有必要的软件包。我还安装了相同版本的 Chrome 和 chromedriver 来运行 selenium。我还在/etc/systemd/system下创建了一个test.service

我无法在 stackoverflow 中发布图片。该问题可以在屏幕截图中使用命令 ( )
看到sudo systemctl status test

Gunicorn[25770]:文件“/home/anaconda/port8788/hct/hct_information.py”,第21行,在testDriver中
gunicorn[25770]:driver.get(url)
gunicorn[25770]:文件“/home/chaoyang/anaconda3 /envs/selenium/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py”,第 333 行,在 get
Gunicorn[25770] 中:self.execute(Command.GET, {'url': url })
gunicorn[25770]:文件“/home/chaoyang/anaconda3/envs/selenium/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py”,第321行,执行
gunicorn[25770] :self.error_handler.check_response(响应)
gunicorn[25770]:文件“/home/chaoyang/anaconda3/envs/selenium/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py”,第242行,在 check_response
Gunicorn[25770] 中:引发异常类(消息、屏幕、堆栈跟踪)gunicorn[25770]:selenium.common.exceptions.WebDriverException:消息:未知错误:net::ERR_CONNECTION_RESET Gunicorn[25770]:(会话信息:无头镀铬=86.0.4240.183)

我的烧瓶代码如下:

import flask
from flask import request
import argparse
from hct import hct_information as hct

app = flask.Flask(__name__)

@app.route("/test")
def test():
    return hct.testDriver('https://www.google.com/')

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)

我的硒代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options …
Run Code Online (Sandbox Code Playgroud)

python gunicorn selenium-webdriver nginx-reverse-proxy ubuntu-18.04

5
推荐指数
1
解决办法
9440
查看次数

按需 SSL 证书密钥加载

我们有一个要求,证书密钥只需要加载到 Nginx 内存中。也就是说,将其保存在本地 FS 中不是一个选项。此外,只有在主动查找证书密钥(使用证书向虚拟服务器发出请求)时,我们才需要证书密钥出现在 Nginx 内存中。当没有请求时,证书密钥应从内存中刷新,并通过客户端身份验证(Nginx 作为客户端向 KMS 进行身份验证)按需从 KMS(密钥管理服务器)重新加载。如果您对此类或类似的要求有深入了解,请提供指示。

我在这个 Nginx博客中提到了最佳实践。然而,并非我们的所有要求都得到满足。有几个问题:

  1. ngx_http_ssl_module 是否按需加载证书或在配置解析期间加载证书?一旦加载,无论使用与否,它是否总是保留在内存中?
  2. 是否可以通过子请求按需(即发起SSL握手时)加载证书密钥?

nginx nginx-reverse-proxy

5
推荐指数
0
解决办法
209
查看次数

NGINX 添加两个变量/参数编号

我正在尝试设置一个 Nginx,我想在其中将两个数字相加。

server {
        server_name "~^pr-(\d*).review-apps.example.com$";
        
        location / {
            set $port 50000+$1;
            proxy_pass "http://localhost:$port/test";
        }
    } 
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。(结果为字符串形式。例如“50000+125”)

如何在 nginx.conf 中添加两个数字?有可能吗?

nginx nginx-reverse-proxy

5
推荐指数
1
解决办法
1304
查看次数

Nginx 代理管理器无法从另一个 docker 容器提供页面

我正在尝试让 nginx 代理管理器(在 docker 容器中运行)连接到另一个打开了端口 8080 的 docker 容器。当我设置代理连接到192.168.0.29:8080主机的IP地址,但它不起作用时,浏览器只是说该站点没有发送任何数据。

我尝试使用其他服务(不在 docker 容器内运行)设置反向代理,它们工作完美。所以,我得出的结论是,问题出在 docker 容器上。

首先,我尝试用容器的地址(显示在 portainer 中)替换 ip 地址,该地址显示为172.17.0.2. 但是,那没有用。我可以确认两个容器都在同一个网络中bridge

我在这里、Stack Overflow 或其他地方都找不到这个问题的任何解决方案。希望有足够的数据来解决这个问题。提前致谢!

编辑:arp -na从容器内 运行会给出以下输出:

[root@docker-00244f7ab2cc:/app]# arp -na
? (172.17.0.1) at 02:42:d1:fc:fc:6b [ether] on eth0
Run Code Online (Sandbox Code Playgroud)

docker docker-container docker-network nginx-reverse-proxy

5
推荐指数
1
解决办法
1万
查看次数

如何在 nginx 中以有条件的方式将 proxy_protocol 设置为“on”?

有人熟悉 nginx 吗?我试图在流块中以有条件的方式启用 proxy_protocol,即对于某些端点,我希望添加代理协议标头。对于其他人我不想添加它。查看文档,proxy_protocol 无法获取变量(尝试了 map 指令) 关于如何实现此目的有什么建议吗?在这里添加了我的 nginx 配置。 http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol

这是有问题的部分proxy_protocol $proxy_state;

   map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;

    }
Run Code Online (Sandbox Code Playgroud)

以下是完整的配置

error_log logs/error.log;

events {
}


stream {

    map $ssl_preread_server_name $server { 
        # default 127.0.0.1:8080;
        default unix:/var/run/nginx.sock;
        include /home/user/allow_url_list;

    } 
    map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;
        
    } …
Run Code Online (Sandbox Code Playgroud)

nginx nginx-location nginx-reverse-proxy nginx-config

5
推荐指数
1
解决办法
1591
查看次数

docker 中的 Nginx、fastapi 和 Streamlit - 反向代理不适用于 Streamlit

我想使用 docker 来容器化 nginx、fastapi 和 2 个 Streamlit 应用程序。所有 3 个应用程序(fastapi、2streamlit 应用程序)不会相互交互。Nginx 应该作为这 3 个应用程序的反向代理。对于 fastapi 来说它正在工作。我可以将rest-api请求发送到http://ip:80/twxservices。“twxservices”作为端点添加到 app.py 文件中,而不是添加到 nginxconfig 中。

无法通过 http://ip:80/stream1 和 http://ip:80/stream2 访问 Streamlit 应用程序 我收到错误:404:未找到

在此先感谢您的帮助。在下面找到文件结构和配置文件。这是文件结构以及反向代理应该如何工作:

在此输入图像描述 在此输入图像描述

docker-compose 文件:


services:
  web:
    build:
      context: ./nginxfolder
      dockerfile: Dockerfile
    container_name: web
   
    ports:
      - 80:80
    networks:
      - my-network
    depends_on:
      - app

  app:
    build:
      context: ./twxservicesfolder
      dockerfile: Dockerfile
    container_name: app
 
    networks:
      - my-network
      
  spectrum:
    build:
      context: ./spectrumfolder
      dockerfile: Dockerfile
    container_name: spectrum

    networks:
      - my-network
      
  dgraph:
    build:
      context: ./dgraphfolder
      dockerfile: Dockerfile
    container_name: dgraph …
Run Code Online (Sandbox Code Playgroud)

python docker nginx-reverse-proxy fastapi streamlit

5
推荐指数
1
解决办法
1828
查看次数

如何在 Nginx 中重定向 ssh 请求?

我在 docker 环境中使用 gitea 版本控制系统。使用的gitea是无根类型的镜像。

\n

http 端口映射为 \xe2\x80\x9c8084:3000\xe2\x80\x9d,ssh 端口映射为 \xe2\x80\x9c2224:2222\xe2\x80\x9d。

\n

我在 Linux 主机上生成了密钥,并将生成的公钥添加到了我的 Gitea 帐户中。

\n

1.测试环境

\n

后来我创建了 ssh 配置文件nano /home/campos/.ssh/config

\n
Host localhost\n  HostName localhost\n  User git\n  Port 2224\n  IdentityFile ~/.ssh/id_rsa\n
Run Code Online (Sandbox Code Playgroud)\n

完成设置后,我创建了 myRepo 存储库并克隆了它。

\n

为了执行克隆,我将 url 从 更改ssh://git@localhost:2224/campos/myRepo.gitgit@localhost:/campos/myRepo.git

\n

要克隆存储库,我输入:git clone git@localhost:/campos/myRepo.git

\n

这很完美!

\n

2.生产环境

\n

但是,在定义反向代理和域名时,无法克隆存储库。

\n

在执行克隆之前,我更改了ssh配置文件:

\n
Host gitea.domain.com\n  HostName gitea.domain.com\n  User git\n  Port 2224\n  IdentityFile ~/.ssh/id_rsa\n
Run Code Online (Sandbox Code Playgroud)\n

然后我再次尝试克隆存储库:

\n

git clone git@gitea.domain.com:/campos/myRepo.git

\n …

nginx nginx-reverse-proxy gitea

5
推荐指数
1
解决办法
1万
查看次数