在 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
。
- 设置
ProtectHome=false
/etc/systemd/system/multi-user.target.wants/php-fpm.service
systemctl daemon-reload
systemctl restart nginx.service
systemctl restart php-fpm.service
具有讽刺意味的是,我确实亲自注意到,最初将代码放在主文件夹中而不是例如,这很奇怪,/var/www/html/
但决定把它留给自己 - 事实证明它是相关的!