AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1035016
Accepted
Gerald Schneider
Gerald Schneider
Asked: 2020-09-24 02:04:41 +0800 CST2020-09-24 02:04:41 +0800 CST 2020-09-24 02:04:41 +0800 CST

如何转发来自我的网络服务器的请求?

  • 772

这是一个关于反向代理、它们如何工作以及如何配置的规范问题。

如何为来自不同端口上的服务或来自具有相同网络服务器的不同服务器的请求提供服务,并通过 URL 区分它?

nginx reverse-proxy apache2
  • 1 1 个回答
  • 2853 Views

1 个回答

  • Voted
  1. Best Answer
    Gerald Schneider
    2020-09-24T02:04:41+08:002020-09-24T02:04:41+08:00

    如果您想提供来自多个服务或来自同一域的多个服务器的内容,您可以将您的网络服务器配置为充当反向代理。服务(通常称为后端服务器或应用程序服务器)不一定需要可从客户端直接访问,通常只有实际为客户端服务的 Web 服务器可直接访问。客户端和服务器之间以及服务器和后端之间也可以有不同的方案或协议(http、https、ajp...)。

    Client ---[https]---> Server ---[http]---> backend:8080
                           |
                           |---[direct]---> files from document root
                           `---[http]---> localhost:4000
    

    例子

    • https://example.com/ -> 直接从网络服务器提供
    • https://example.com/jenkins/ -> 代理到可以从网络服务器访问的不同服务器
    • https://api.example.com/ -> 代理到同一主机上具有不同端口的服务

    反向代理可以配置为虚拟目录或子域。

    Apache 的示例配置

    您需要加载必要的 apache 模块才能将其用作反向代理。这些至少是:

    • 代理人
    • proxy_http

    对于更多协议,您将需要启用更多模块。

    您可以使用基于 Debian/Ubuntu 的发行版启用模块,如下所示:

    sudo a2enmod proxy proxy_http
    

    对于基于 RedHat/CentOS 的发行版,您需要在其中找到正确的配置文件/etc/httpd/并手动启用这些模块。

    上述示例的配置可能如下所示:

    <VirtualHost *:443>
      ServerName example.com
      DocumentRoot /var/www/html
      
      # SSL options left out for simplicity
      
      ProxyRequests         Off
      ProxyPreserveHost     On
      ProxyPass               /jenkins/ http://192.168.42.18:8080/
      ProxyPassReverse        /jenkins/ http://192.168.42.18:8080/
    </VirtualHost>
    
    <VirtualHost *:443>
      ServerName api.example.com
      DocumentRoot /var/www/html
      
      # SSL options left out for simplicity
    
      ProxyRequests         Off
      ProxyPreserveHost     On
      ProxyPass               / http://localhost:4000/
      ProxyPassReverse        / http://localhost:4000/
    </VirtualHost>
    

    nginx 的示例配置

    server {
      listen 443;
      server_name example.com;
      root /var/www/html;
      
      # SSL options left out for simplicity
    
      location /jenkins/ {
        proxy_pass http://192.168.42.18:8080/;
      }
    }
    
    server {
      listen 443;
      server_name api.example.com;
      
      # SSL options left out for simplicity
      
      location / {
        proxy_pass http://localhost:4000/;
      }
    }
    

    后端配置

    要记住的一件事是后端服务器应该进行相应的配置。例如,如果 Jenkins 被配置为使用 URL 服务请求http://192.168.42.18:8080/,它将使用此基本 URL 作为 CSS、JS 和图像文件的路径,从而导致大量 404 错误或超时以及服务器无法工作。必须将代理 URL配置https://example.com/jenkins/为基本 URL 才能使其工作。

    其他后端需要类似的配置。这是解决 URL 指向后端服务器而不是前端服务器的问题的首选方法。如果由于某种原因无法更改后端服务器的配置,您可以配置前端服务器以在将 HTML 提供给客户端之前重写 HTML。

    但是,这应该被视为最后的手段,因为它给前端服务器增加了不必要的负载。

    阿帕奇

    使用 Apache,您可以使用该模块mod_proxy_html。该模块提供了指令ProxyHTMLURLMap,您可以使用它来重写响应。

    ProxyPass               /jenkins/ http://192.168.42.18:8080/
    ProxyPassReverse        /jenkins/ http://192.168.42.18:8080/
    SetOutputFilter proxy-html # make sure the output is filtered by proxy-html
    ProxyHTMLURLMap http://192.168.42.18:8080/ https://example.com/jenkins/
    ProxyHTMLExtended On       # by default only HTML output is filtered
    

    这应该使用 publichostname URL 重写答案中所有出现的 localserver URL。

    nginx

    使用 nginx 可以使用ngx_http_sub_module实现类似的结果:

      location /jenkins/ {
        proxy_pass http://192.168.42.18:8080/;
        sub_filter '<a href="http://192.168.42.18:8080/'  '<a href="https://$host/jenkins/';
        sub_filter_once on;
      }
    
    • 11

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve