Nginx 在新安装时返回 404

Nginx 在新安装时返回 404

在 Linux Mint 20.3 上,我为本地网站开发进行了工作设置:

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

    server_name cbp.local;

    root /home/gacek/html/cbp/public;

    index           index.php;

    location / {
        try_files   $uri $uri/ /index.php?$query_string;
    }

    if (!-d $request_filename) {
            rewrite     ^/(.+)/$ /$1 permanent;
    }

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

这是一个位于/home/gacek/html/cbp目录中的 Laravel 应用程序,index.php入口点位于/public子文件夹中。

全新安装 Linux Mint 21.1 后,相同的 nginx 配置出现 404 未找到:

404 未找到 nginx/1.18.0 (Ubuntu)

我试过:

  • 调整目录的所有权: sudo chown -R gacek:www-data /home/gacek/html/cbp

  • 扩大权限:sudo chmod -R 776 /home/gacek/html/cbp

  • 创建符号链接并调整 nginx 配置文件sudo ln -s /home/gacek/html/cbp /var/www/

我尝试了最后一个,因为以下配置工作正常:

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

    server_name example.local;

    root /var/www/test;
    index index.php;

    location / {
        try_files   $uri $uri/ /index.php?$query_string;
    }

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

为什么这个 nginx 站点配置不起作用?两者的区别在哪里?

编辑

我已经使用更改了配置Laravel 文档中的指南

server {
    listen 80;
    listen [::]:80;
    server_name cbp.local;
    root /home/gacek/html/cbp/public;
 
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
 
    index index.php;
 
    charset utf-8;
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
 
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
 
    error_page 404 /index.php;
 
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /home/gacek/html/cbp/public$fastcgi_script_name;
    }
 
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

修改后页面上显示的错误变为:

File not found.

现在我在 nginx 的错误日志中收到以下错误:

在此处输入图片描述

答案1

在我看来,您已经完成了大部分工作 - 您已经设置了一个特定的目录来托管内容并对该目录应用了适当的权限,尽管您还没有确认 nginx 以哪个用户身份运行,以及该用户是否是主机上www-data组的成员。

我建议将运行 nginx 的用户添加到www-data组中,并确保该组具有适当的权限

我实际上建议您不要像您所做的那样默认将内容目录设置为可写,除非您有特定的理由这样做 - 如果您确实有特定的理由这样做,我可能会创建一个专用的子目录,该子目录是可写的,而根目录则不可写。

总结一下,可能如下:

usermod -aG nginx www-data
chmod -R 755 /home/gacek/html/cbp

实际上,您可以更进一步强化目录权限,仅将上述内容应用于目录/子目录,并应用于chmod 644所有文件。

编辑:已为您在线搜索别处,这似乎是潜在问题的一个很好的候选者:您可能ProtectHome=true在 systemd init 文件中遇到了php-fpm.service

  1. 设置ProtectHome=false/etc/systemd/system/multi-user.target.wants/php-fpm.service
  2. systemctl daemon-reload
  3. systemctl restart nginx.service
  4. systemctl restart php-fpm.service

具有讽刺意味的是,我确实亲自注意到,最初将代码放在主文件夹中而不是例如,这很奇怪,/var/www/html/但决定把它留给自己 - 事实证明它是相关的!

相关内容