我在运行Ubuntu 18.04的VPS上安装了nginx。在为域设置DNS记录以指向我的VPS(只是一个指向VPS IP的A记录)后,我仍然会收到"404未找到"错误,尽管我认为我的服务器块配置是正确的。我将把配置本身留在下面,因为有些善良的人比我更有经验:)
附言:我还包括了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
}
此处的错误图像
让我解释一下您对这个配置做了什么。
您定义了两个虚拟服务器。我们暂时放弃第一个,让我们来解释第二个:
该服务器的前三行如下:
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,如果在listen
指令的参数中没有default_server
指示,nginx也可能使用此服务器来处理请求。
接下来我们返回一个404未找到错误。最后,对于这个虚拟服务器,只有在不使用huds0n.xyz主机的情况下,我们才会得到404。(例如,如果你没有任何其他东西阻止它使用浏览器中的服务器IP来查看你是否被重定向,请尝试)。
现在,我们有了第一个服务器块,它定义了服务器的SSL/TLS部分。
我看到此配置有两个问题,但我将首先解释您的配置目前的作用。
您可以在/root/web/hudson/main文件夹中定义根位置。它必须是一个文件夹。
因此,如果您在浏览器中编写https://huds0n.xyz/i-like-bananas.html
,它将在主文件夹中检索i-like-bananas.html
。
下面一行是index指令。让我们想象一下,在您的主文件夹中,有一个名为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,但是您的索引指令指向HTML文件。如果您想将index.php用于根网页,请将其更改为
index index.php
在您的位置
/
块中,您尝试$uri,$uri加上斜杠,然后返回404。许多CMS/Framework(例如,我认为是laravel)使URL的重写成为可能。您有一个PHP文件(例如index.PHP),它处理每个请求。它是如何工作的?我们只是在FastCGI变量中将路径信息作为filename + path
提供给PHP。您可以更改您的区块以完成此任务,方法是放置此指令而不是try_files
指令:try_files $uri $uri/ /index.php?$query_string;
这个404的根本原因也可能是你的nginx服务器无法访问文件夹,或者你的文件夹丢失/为空。
按照最初的设计,您的web内容应该位于/var/www/<subfolder>
文件夹中,并归www-data
所有。
您不应该将文件放在/root文件夹中。
我希望这能回答你的问题,并帮助你找到问题的原因。