我在运行 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
}
答案 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 文件夹中。
我希望这能回答您的问题,并帮助您找到问题的原因。