Nginx 反向代理到 apache 服务器,重定向给出 404

Nginx 反向代理到 apache 服务器,重定向给出 404

我已设置了 angular 和 spring boot 项目,其中 nginx 反向代理到 apache 以服务 angular 应用程序,而嵌入式服务器则通过 nginx 反向代理 spring boot。现在我可以正常加载 angular,但当向 spring boot 服务器发出请求时,它给出 404。我尝试 curl localhost:8085/api/hello,它有效,或者通过隧道将 localhost 公开给公众,它工作正常。我只是在配置中缺少了一些东西。

Nginx 配置

server {
    listen       154.62.107.99:80 default;
    server_name  _;
    access_log  /var/log/nginx/154.62.107.99.log main;
    error_log  /var/log/nginx/error.log debug;
    location / {
        proxy_pass  http://154.62.107.99:8080;
   }
   location /api/ {

        # Simple requests
      if ($request_method ~* "(GET|POST)") {
         add_header "Access-Control-Allow-Origin"  "*";
      }


     proxy_pass http://0.0.0.0:8085/;
     proxy_buffering off;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-Host $host;
     proxy_set_header X-Forwarded-Port $server_port;
   }
}

server {
    listen      154.62.107.99:443 ssl http2;
    server_name _;
    ssl_certificate      /usr/local/hestia/ssl/certificate.crt;
    ssl_certificate_key  /usr/local/hestia/ssl/certificate.key;
    access_log  /var/log/nginx/154.62.107.99_https.log main;
    error_log  /var/log/nginx/error_https.log debug;

   # return 301 http://$host$request_uri;

    location / {
      #  root /var/www/document_errors/;

       # Handle preflight requests (OPTIONS)
        if ($request_method = OPTIONS ) {
            add_header "Access-Control-Allow-Origin"  "*";
            add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
            add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
            return 200;
        }

        # Handle other requests
        # Add any additional configuration for handling other requests

        # Redirect other requests
        return 301 http://$host$request_uri;
    }

    location /error/ {
        alias /var/www/document_errors/;
    }
}
     

在这里,我尝试将所有请求重定向/到正在运行的 apache 服务器8080。我需要将所有请求重定向/api/到我的 spring boot 服务器。

我怀疑这个反向代理是否真的有效。以下是一些观察结果:

  1. 停止 nginx 服务器会导致网站无法加载,因此请求从那里进行处理。
  2. 停止 Apache 服务器时出现内部服务器错误
  3. 对于 location,/当我注释掉该行时proxy_pass http://154.62.107.99:8080,它仍然会加载前端,这很令人惊讶,因为我以为我正在将请求从 nginx 重定向到 apache。我不明白这是怎么发生的。

更新::

这是我的 apache2 配置

Listen 154.62.107.99:8443
Listen 154.62.107.99:8080
<VirtualHost 154.62.107.99:8080>
    ServerName 154.62.107.99
    DocumentRoot /var/www/html/
    Alias /error/ /var/www/document_errors/

</VirtualHost>

<VirtualHost 154.62.107.99:8443>
    ServerName 154.62.107.99
    DocumentRoot /var/www/html/
    Alias /error/ /var/www/document_errors/

    SSLEngine on
    SSLVerifyClient none
    SSLCertificateFile         /usr/local/hestia/ssl/certificate.crt
    SSLCertificateKeyFile      /usr/local/hestia/ssl/certificate.key

</VirtualHost>

现在 dist 文件夹的内容不在 /var/www/html 中,它仅包含一个成功文件。现在,当我停止 apache2 时,我收到内部服务器错误并且页面无法加载,但 apache2 中肯定不会从此处提供 angular 项目。

它在目录中有另一个配置文件/domains,可以正确配置文档根目录。

<VirtualHost 154.62.107.99:8080>

    ServerName nirbhaysingh.dev
    ServerAlias www.nirbhaysingh.dev
    ServerAdmin [email protected]
    DocumentRoot /home/admin/web/nirbhaysingh.dev/public_html
    ScriptAlias /cgi-bin/ /home/admin/web/nirbhaysingh.dev/cgi-bin/
    Alias /vstats/ /home/admin/web/nirbhaysingh.dev/stats/
    Alias /error/ /home/admin/web/nirbhaysingh.dev/document_errors/
    #SuexecUserGroup admin admin
    CustomLog /var/log/apache2/domains/nirbhaysingh.dev.bytes bytes
    CustomLog /var/log/apache2/domains/nirbhaysingh.dev.log combined
    ErrorLog /var/log/apache2/domains/nirbhaysingh.dev.error.log

    IncludeOptional /home/admin/conf/web/nirbhaysingh.dev/apache2.forcessl.conf*

    <Directory /home/admin/web/nirbhaysingh.dev/stats>
        AllowOverride All
    </Directory>
    <Directory /home/admin/web/nirbhaysingh.dev/public_html>
        AllowOverride All
        Options +Includes -Indexes +ExecCGI
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.0-fpm-nirbhaysingh.dev.sock|fcgi://localhost"
    </FilesMatch>
    SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

    IncludeOptional /home/admin/conf/web/nirbhaysingh.dev/apache2.conf_*
    IncludeOptional /etc/apache2/conf.d/*.inc
</VirtualHost>


我的猜测是,重定向失败了,因此 Angular 应用程序的内容要么直接从 nginx 提供,如其域配置中定义的那样。我正在处理这个问题,并在此不断更新

答案1

在这种设置中,Nginx 代理最常见的用例是提供 TLS 终止并阻止客户端直接使用未加密的后端服务。

序列图

其 Nginx 配置如下:

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    location /api/ {
        proxy_pass http://127.0.0.1:8085/api/;
    }
}

然后,为了提高安全性,Apache 和 Spring Boot 都会监听本地环回而不是公共 IP 地址。

  • 阿帕奇:

    Listen 127.0.0.1:8080
    <VirtualHost 127.0.0.1:8080>
        # Directives
    </VirtualHost>
    
  • Spring Boot:

    server.address=127.0.0.1
    server.port=8085
    

此外,最好直接使用 Nginx 提供任何静态文件。

相关内容