新規インストール時に Nginx が 404 を返す

新規インストール時に Nginx が 404 を返す

Linux Mint 20.3 では、Web サイトのローカル開発用に次のセットアップを実行できました。

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;
        }
}

これはディレクトリにある Laravel アプリケーションであり/home/gacek/html/cbpindex.phpエントリポイントはサブフォルダーにあります/public

Linux Mint 21.1 を新規インストールした後、同じ nginx 構成で 404 not found が発生します。

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 サイト構成が機能しないのはなぜですか? 2 つの違いはどこにありますか?

編集

設定を変更しました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/が、そのことは胸に留めておくことにしました。結局、それが関連していることがわかりました。

関連情報