配置服务器块后收到 Nginx '404 Not Found' 错误

时间:2021-05-22 01:34:21

标签: ubuntu nginx

我在运行 Ubuntu 18.04 的 VPS 上安装了 nginx。在为域设置 DNS 记录以指向我的 VPS(只是一个指向 VPS 的 IP 的 A 记录)后,我仍然收到“404 Not Found”错误,即使我相信我的服务器块配置是正确的。我会把配置本身留在下面,因为有比我更有经验的好心人:)

附言我还在配置中包含了 Certbot 所做的更改,因为该站点使用 https,以及该站点的 URL。

server {

        root /root/web/hudson/main;
        index index.html index.htm index.nginx-debian.html;

        server_name huds0n.xyz;

        location / {
                try_files $uri $uri/ =404;
        }


        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }



    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/huds0n.xyz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/huds0n.xyz/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = huds0n.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot



        server_name huds0n.xyz;
    listen 80;
    return 404; # managed by Certbot


}

Image of error here

1 个答案:

答案 0 :(得分:0)

让我解释一下你用这个配置做了什么。

您定义了两个虚拟服务器。我们暂时放下第一个,让我们解释第二个:

这个服务器的前三行如下:

    if ($host = huds0n.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

第一行,我们检查nginx给定的$host变量是否为huds0n.xyz。它是从 HTTP 请求的 Host 请求标头中提取的。

如果这是该主机,我们将返回一个 301 HTTP 状态代码(永久移动),新位置为 https:// + $host(FQDN)+ $request_uri(在在我们的例子中是 .xyz)。

接下来我们定义服务器名称,以区分该服务器与其他服务器。 Port + Server_name 的组合使 nginx 在处理请求时能够知道使用哪个服务器配置。

在本例中,我们使用的是未加密的 HTTP 端口,如主机 huds0n.xyz 的下一行所示。

即使将此服务器名称提供给 nginx,如果 default_server 指令的参数中没有 listen 指示,nginx 可能会使用此服务器来处理请求。

我们接下来返回 404 Not Found 错误。最后,对于这个虚拟服务器,如果我们不使用 huds0n.xyz 主机,我们只会得到 404。 (例如,如果您没有其他任何东西阻止它使用浏览器中的服务器 IP 来查看您是否被重定向)。

现在,我们有了第一个服务器块,它定义了服务器的 SSL/TLS 部分。

我发现此配置存在两个问题,但我将首先解释目前您的配置的作用。

您在 /root/web/hudson/main 文件夹 中定义根位置。它必须是一个文件夹。

因此,如果您在浏览器中写入 https://huds0n.xyz/i-like-bananas.html,它将在主文件夹中检索 i-like-bananas.html

下面一行是索引指令。 假设在您的主文件夹中,您有一个名为 strawberry 的文件夹和另一个名为 raspberry 的文件夹。在 strawberry 中,您有一个名为 index.html 的文件,其中包含美丽的草莓图片。在raspberry中,可惜站长忘记放这样的文件了。

使用 index 指令,您告诉 nginx 寻找指令中给出的文件(从左到右的顺序)。 Nginx 会,当你写一个文件夹的 URL 时,寻找 index.html,如果没有找到 index.htm 等等。

下一个块是网站根目录 (/) 上的一个位置块。 在此服务器上发出的每个请求都与此块有关。

try_files 指令类似于 index 指令,但它由每个 URL 触发,而不仅仅是与文件夹关联的 URL。

它将尝试 URI(主机后面 URL 的右侧部分),然后将 URI 作为文件夹,否则将返回 404 错误(未找到)。

下一个位置块涉及匹配正则表达式的每个文件(这是波浪号的含义),这个正则表达式的含义是每个以.php结尾的文件名。

对于这些文件,我们包含了一些 fastcgi php 配置,它将为 PHP 提供处理请求所需的变量,并将请求和变量传递给位于 /run/php/php7.2-fpm.sock 的 unix 套接字。

之后,我们有了让 nginx 监听 HTTPS 端口的指令,以及 SSL/TLS 配置。我将跳过这一部分。

我之前提到的两个问题如下:

  • 您想使用 PHP,但您的 index 指令指向 HTML 文件。如果您希望 index.php 用于您的根网页,请将其更改为 index index.php

  • 在您的位置 / 块中,您尝试使用 $uri、$uri 加上斜杠,然后返回 404。许多 CMS/框架(例如我正在考虑使用 laravel)使可能是 URL 的一种重写。您有一个处理每个请求的 PHP 文件(例如 index.php)。它是如何工作的 ?我们只是在 FastCGI 变量中将路径信息作为 filename + path 提供给 PHP。 你可以改变你的方块来完成这个任务,用它代替你的 try_files 指令:try_files $uri $uri/ /index.php?$query_string;

此 404 的根本原因也可能是您的 nginx 服务器无法访问该文件夹,或者您的文件夹丢失/为空。

按照最初的设计,您的网络内容应该位于 /var/www/<subfolder> 文件夹中,并且归 www-data 所有。

您不应将文件放在 /root 文件夹中。

我希望这能回答您的问题,并帮助您找到问题的原因。