首页 > 解决方案 > 我在使用 Nginx reverse_proxy 连接到我的 Rest-API 时收到 404

问题描述

我的云服务器 8084 端口上运行了一个 Rest-API。当我尝试访问 mysitename:8084/swagger-ui.html 时,可以看到 Swagger 的 Api Documentation 页面。但是,当我将其作为 mysitename.com/api/swagger-ui.html 尝试时,我收到 404 错误。

我在 StackOverflow 上阅读了很多关于这个问题的类似问题,我尝试了不同的解决方案,但我无法成功。

这是我的 nginx 配置文件

server {
        listen 80;
        listen [::]:80;

        root /var/www/mysitename.com/html/;
        index index.html index.htm index.nginx-debian.html;

        server_name mysitename.com www.mysitename.com;
}

server {

    listen 443;
    server_name mysitename.com www.mysitename.com;

    ssl_certificate           /etc/letsencrypt/live/mysitename.com/cert.pem;
    ssl_certificate_key       /etc/letsencrypt/live/mysitename.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log            /var/log/nginx/petahr.access.log;

    location / {
      root /var/www/mysitename.com/html/;
      index index.html index.htm index.nginx-debian.html;
    }
}

server {

    listen 443;
    server_name mysitename.com www.mysitename.com;

    ssl_certificate           /etc/letsencrypt/live/mysitename.com/cert.pem;
    ssl_certificate_key       /etc/letsencrypt/live/mysitename.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    location /api/ {
      proxy_set_header        Host $host;
      proxy_pass              https://127.0.0.1:8084/;
      proxy_read_timeout      90;

      try_files $uri $uri/ =404;
    }
}

编辑

这是nginx -T输出

/etc/nginx/sites-available$ sudo nginx -T
nginx: [warn] conflicting server name "mysitename.com" on 0.0.0.0:443, ignored
nginx: [warn] conflicting server name "www.mysitename.com" on 0.0.0.0:443, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果你能帮助我,我将不胜感激。

标签: restnginxnginx-locationnginx-reverse-proxy

解决方案


配置检查证实了Richard Smith的评论。只是一个警告,有两个服务器块具有相同的listenserver_name

1)尝试将您的location /api/ {}权利转移到您location / {}的第二个服务器块的下方。

2)删除整个第三个服务器块

3) 如果您希望从 http 重定向到 https,return 301 https://$host$request_uri;请在您的服务器块末尾添加监听端口 80。

4)nginx -T再次运行以检查错误。

5) 如果没有发现错误,则重新加载 Nginx。

这是建议的服务器块配置文件:

server {
        listen 80;
        listen [::]:80;

        root /var/www/mysitename.com/html/;
        index index.html index.htm index.nginx-debian.html;

        server_name mysitename.com www.mysitename.com;
        return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name mysitename.com www.mysitename.com;

    ssl_certificate           /etc/letsencrypt/live/mysitename.com/cert.pem;
    ssl_certificate_key       /etc/letsencrypt/live/mysitename.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log            /var/log/nginx/petahr.access.log;

    location / {
      root /var/www/mysitename.com/html/;
      index index.html index.htm index.nginx-debian.html;
    }

    location /api/ {
      proxy_set_header        Host $host;
      proxy_pass              https://127.0.0.1:8084/;
      proxy_read_timeout      90;

      ## try_files $uri $uri/ =404;
    }
}

希望有帮助!


推荐阅读