V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CamelName
V2EX  ›  Apache

请教下 Apache2 代理二级域名的问题

  •  
  •   CamelName · 15 天前 · 527 次点击

    主机上有两个 web 服务,分别占用 4000 端口和 3000 端口,基于域名+端口可成功访问

    希望实现子域名访问对应端口,如下:

    sub1.domain.com -- ip:3000

    sub2.domain.com -- ip:4000

    添加域名解析

    在域名解析供应商处完成如下配置

    20241006-1910-Fig-1

    Apache2 反向代理配置

    参考以下步骤,在服务器上完成 apache2 反向代理配置子

    在 Apache 中,你可以使用mod_proxy模块来设置反向代理,从而隐藏后端服务的真实端口号。通过这种方式,用户访问子域名时就像访问普通的 HTTP 或 HTTPS 网站一样,而不会看到后端服务运行的具体端口。

    以下是基于 Apache 完成反代配置的步骤:

    1. 确保安装了 Apache 和必要的模块: 确保你的 Apache 服务器已经安装了mod_proxymod_proxy_http等模块。如果没有安装,可以通过以下命令安装(以 Debian/Ubuntu 系统为例):

      sudo a2enmod proxy
      sudo a2enmod proxy_http
      

      安装完成后需要重启 Apache 服务:

      sudo systemctl restart apache2
      
    2. 配置虚拟主机: 在 Apache 的配置文件目录下(通常是/etc/apache2/sites-available/),创建一个新的虚拟主机配置文件,或者编辑现有的配置文件。假设你想要为子域名service.example.com配置反向代理,并且该子域名将指向本地机器上运行的一个服务,例如运行在 3000 端口上的 Web 应用。

    3. 添加反向代理配置: 编辑配置文件并添加如下内容:

      <VirtualHost *:80>
          ServerName service.example.com
      
          # 可选:重定向所有请求到 HTTPS
          Redirect permanent / https://service.example.com/
      
      </VirtualHost>
      
      <IfModule mod_ssl.c>
          <VirtualHost *:443>
              ServerName service.example.com
      
              # SSL 证书配置
              SSLEngine on
              SSLCertificateFile /path/to/certificate.crt
              SSLCertificateKeyFile /path/to/private.key
              # 如果有中间证书
              SSLCertificateChainFile /path/to/chain.pem
      
              # 开启日志记录
              ErrorLog ${APACHE_LOG_DIR}/error.log
              CustomLog ${APACHE_LOG_DIR}/access.log combined
      
              # 反向代理配置
              ProxyRequests Off
              <Proxy *>
                  Order deny,allow
                  Allow from all
              </Proxy>
              ProxyPass / http://localhost:3000/
              ProxyPassReverse / http://localhost:3000/
          </VirtualHost>
      </IfModule>
      

      这个配置做了几件事:

      • 设置了一个监听 80 端口的虚拟主机,它会把所有请求永久重定向到 HTTPS 。
      • 设置了一个监听 443 端口的安全虚拟主机,用于处理加密连接。
      • 配置了 SSL 证书。
      • 启用了反向代理,并指定了后端服务的地址(这里假设是同一台机器上的 8080 端口)。
    4. 启用站点并重启 Apache: 保存更改后的配置文件,然后启用这个站点配置:

      sudo a2ensite your-config-file.conf
      sudo systemctl reload apache2
      
    5. 测试配置: 使用浏览器或其他工具(如 curl )访问http://service.example.com,应该会被自动重定向到https://service.example.com,并且最终可以看到运行在 8080 端口上的服务内容。

    问题

    完成配置后,访问http://sub1.example.com ,无法访问,提示 502

    请教

    1. 上述配置方法可能是哪里出错了?请有实操经验的大佬指导下

    2. 除了上面这个方法,有没有其他方法?(已尝试宝塔面板)

    第 1 条附言  ·  15 天前

    可能是背景交代不全,补充说明下,服务器端的web服务是docker起的,架构如下


    说明

    • 主域名访问80端口,正常访问
    • 访问子域名返回502,服务端curl localhost:3000 可正常访问,但curl sub1.example.com 返回无法解析
    • 查看log,子域名.log 为空,全局日志没有子域名信息

    猜想

    • 会不会是DNS域名解析配置的问题?
    9 条回复    2024-10-07 09:42:48 +08:00
    pgup
        1
    pgup  
       15 天前
    想知道配置文件中『 ProxyPass 』和『 ProxyPassReverse 』后面配置的内容是什么。这个地方比较容易出错,可能误以为 /sub1/ http://localhost:8080/ 对应 https://sub1.example.com ,但实际上对应 https://example/sub1.com
    CamelName
        2
    CamelName  
    OP
       15 天前
    @pgup

    感谢答复,以 sub1 为例(对应端口 3000 ),配置文件中的两个参数是如下配置:

    ProxyPass / http://localhost:3000/

    ProxyPassReverse / http://localhost:3000/
    z7356995
        3
    z7356995  
       15 天前 via Android
    你要查看 log
    CamelName
        4
    CamelName  
    OP
       15 天前
    @pgup

    完整参数如下:


    ```

    <VirtualHost *:80>
    ServerName sub1.example.com

    # 反向代理配置
    ProxyRequests Off
    <Proxy *>
    Order deny,allow
    Allow from all
    </Proxy>

    # 设置后端服务地址
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

    # 日志记录
    ErrorLog ${APACHE_LOG_DIR}/sub1.example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/sub1.example.com_access.log combined
    </VirtualHost>

    ```
    jucelin
        5
    jucelin  
       15 天前
    可以测试下 http://localhost:3000/ 能不能访问。
    再分别尝试
    http://127.0.0.1:3000/
    http://内网 IP:3000/
    SenLief
        6
    SenLief  
       15 天前
    看一下日志吧,502 有些是后端应用的问题,我之前就是后端挂了不知道出现了 502
    CamelName
        7
    CamelName  
    OP
       15 天前
    CamelName
        8
    CamelName  
    OP
       15 天前
    @jucelin @SenLief

    感谢答复,补充说明了下背景,请再看看
    CamelName
        9
    CamelName  
    OP
       15 天前
    结帖,问题还是,DNS 子域名配置的问题,参考下图配置,就能成功访问了。

    ![success]( https://tuchuang-wangpeng.oss-cn-hangzhou.aliyuncs.com/tuchuang-wangpeng/20241007094217.png)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5298 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:21 · PVG 17:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.