php Laravel API后端的NGINX配置

zbq4xfa0  于 2023-10-15  发布在  PHP
关注(0)|答案(6)|浏览(138)

bounty还有2天到期。回答此问题可获得+100声望奖励。Frevelman正在为这个问题寻找一个更详细的答案

我将我的angular前端和laravel后端部署到一个ubuntu虚拟机上,然后部署到一个nginx web服务器上。
现在前端工作正常,可以通过我的URL访问,但是后端API不工作-我得到404错误。
下面是我的nginx配置:

server {
    listen 443 ssl;
    server_name my_ip myurl.de www.myurl.de;
    root /var/www/html/dist;
    index index.html;
    ssl_certificate /etc/nginx/cert.cer;
    ssl_certificate_key /etc/nginx/prvt.key;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /3rdpartylicenses.txt {
        alias /var/www/html/dist/3rdpartylicenses.txt;
    }

    location /assets {
        alias /var/www/html/dist/assets;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /index.nginx-debian.html {
        log_not_found off;
        access_log off;
    }

    location ^~ /api {
        root /backend/LeagueOf5v5Backend/public;
        index index.php;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Adjust the PHP-FPM socket path if needed
    }

    location ~ /\.ht {
        deny all;
    }

    error_page 404 /index.html;

    # Additional Nginx configuration settings can go here.
}

我试着通过https://nginx.viraptor.info测试它,它返回了/API前缀的测试结果。
但是使用 Postman 和URL我得到404错误。但是当我在我的本地机器上,通过localhost:8000/API/用post man测试它时.它工作正常。
任何帮助感谢!
编辑:这是一个既适用于angular又适用于laravel的配置文件,

2w3rbyxf

2w3rbyxf1#

这是我的Docker compose gninx配置:

index index.php

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

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

当然,你使用的是socket,我不是,所以忽略这个区别,但是我认为你用错了location /,你用/index.html的时候应该像我一样。
还可以看到你正在使用index index.html,它应该是index index.php,因为你正在服务于Laravel。

62o28rlo

62o28rlo2#

@Frevelman的事情,我从你的virtual host代码中了解到,你想在点击<your-domain>/api时调用后端Laravel服务。
根据你的指令,你的路由将遵循<your-domain>/api/api/,如果我没有错的话,你已经在api.php路由文件中定义了所有的路由。
请尝试一下,我认为这将为您工作。
作为我的建议,将是一个更好的解决方案是在不同的端口上运行Laravel服务,即。8001等,这样您就可以通过<domain>:8001/api访问Laravel服务。

在端口上运行Laravel:

你可以像在上面的例子中那样在一个文件中编写这两个代码。你需要用它来更新你的配置文件。

// For Angular routing

server {
    listen 443 ssl;
    server_name my_ip myurl.de www.myurl.de;
    root /var/www/html/dist;
    index index.html;
    ssl_certificate /etc/nginx/cert.cer;
    ssl_certificate_key /etc/nginx/prvt.key;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /3rdpartylicenses.txt {
        alias /var/www/html/dist/3rdpartylicenses.txt;
    }

    location /assets {
        alias /var/www/html/dist/assets;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /index.nginx-debian.html {
        log_not_found off;
        access_log off;
    }

    error_page 404 /index.html;
}

// For Laravel
server {  
    listen 8001 ssl;
    server_name my_ip myurl.de www.myurl.de;
    root /backend/LeagueOf5v5Backend/public;
    ssl_certificate /etc/nginx/cert.cer;
    ssl_certificate_key /etc/nginx/prvt.key;
  
    add_header X-Frame-Options "SAMEORIGIN";  
    add_header X-XSS-Protection "1; mode=block";  
    add_header X-Content-Type-Options "nosniff";  
  
    index index.html index.htm index.php;  
  
    location /{  
  
        try_files $uri $uri/ /index.php?$query_string;  
  
        add_header Access-Control-Max-Age 3600;  
        add_header Access-Control-Expose-Headers Content-Length;  
        add_header Access-Control-Allow-Headers Range;  
    }  
  
  
  
    location = /favicon.ico { access_log off; log_not_found off; }  
    location = /robots.txt  { access_log off; log_not_found off; }  
  
    access_log off;  
    error_log  /var/log/nginx/<your-domain-name>-error.log error;  
  
    error_page 404 /index.php;  
      
    location ~ \.php$ {  
       include snippets/fastcgi-php.conf;
       fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }  
  
    location ~ /\.(?!well-known).* {  
        deny all;  
    }  

}

通过这种配置。你将myurl.de/它将服务于Angular应用程序,当你点击myurl.de:8001/它将服务于web.php中的Laravel应用程序的路由,当你点击myurl.de:8001/api它将服务于Laravel api.php路由文件。

优点

1.两个应用程序将使用相同的SSL证书,因为两个应用程序的域/子域相同。我们只是使用端口转发将请求重定向到Angular或Laravel。
1.当请求到达Angular时,php-fpm将不会为其提供服务,内存负载将减少。

lnvxswe2

lnvxswe23#

看起来你的Nginx配置试图从同一个服务器块同时服务Angular前端和Laravel后端。这可能导致配置冲突。要解决此问题,您可以将配置拆分为单独的服务器块,一个用于前端,另一个用于后端。
您可以尝试以下更新的配置。

# Server block for the Angular frontend
server {
    listen 443 ssl;
    server_name myurl.de www.myurl.de;
    root /var/www/html/dist;
    index index.html;
    ssl_certificate /etc/nginx/cert.cer;
    ssl_certificate_key /etc/nginx/prvt.key;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /3rdpartylicenses.txt {
        alias /var/www/html/dist/3rdpartylicenses.txt;
    }

    location /assets {
        alias /var/www/html/dist/assets;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /index.nginx-debian.html {
        log_not_found off;
        access_log off;
    }

    error_page 404 /index.html;
}

# Server block for the Laravel backend
server {
    listen 443 ssl;
    server_name api.myurl.de; # Change this to your desired subdomain
    root /backend/LeagueOf5v5Backend/public;
    index index.php;
    ssl_certificate /etc/nginx/cert.cer;
    ssl_certificate_key /etc/nginx/prvt.key;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Adjust the PHP-FPM socket path if needed
    }

    location ~ /\.ht {
        deny all;
    }
}
  • 这里的前端服务来自myurl.de/www.myurl.de,后端服务来自api.myurl.de。
  • 确保配置DNS将api.myurl.de指向同一服务器IP地址。
  • SSL证书应用于两个服务器块。
  • 每个服务器块都有自己的 root 指令和为各自应用定制的配置。

确保将www.example.com替换api.myurl.de为Laravel后端所需的子域,并相应地更新DNS。完成这些更改后,重新启动Nginx以应用新配置:

sudo service nginx restart
nwlls2ji

nwlls2ji4#

try_files $uri $uri/ /index.html;

在我看来是不对的

try_files $uri $uri/ =404;

error_page 404 /index.html;

使nginx强制响应代码进入404,PHP无法覆盖它:(将其替换为

error_page 404 = /index.html;

nginx将不再强制响应代码,它可以是PHP想要的任何代码,例如HTTP 200 OKhttp_response_code(200);
顺便说一句,使用扩展名.html的php-scripts是一个奇怪的选择,php脚本通常通过扩展名.php-如果我参与了你的项目,我会将其更改为.php,我甚至会认为这是一个安全问题,因为我不希望我的.html文件执行.php脚本,如果它们碰巧包含字符串<?php

nr9pn0ug

nr9pn0ug5#

问题出在别的地方,不在你的nginx上。根据我以前的经验,有两个原因
1.可能是您的服务器阻止了同一个服务器请求。你应该为你的angular使用一个代理,如果请求是在服务器端,如果请求来自客户端,你应该纠正你的请求地址。如果请求来自客户端,请首先与Postman进行检查,并检查服务器的日志。
1.有时你应该把你的代理地址从localhost改为127.0.0.1:你的端口,在angular和Laravel中一起和单独尝试。不要忘记每次重启服务器。

ryoqjall

ryoqjall6#

您仍然可以使用单个配置文件为两个应用程序提供服务。首先,您需要使用pm2启动Angular服务,例如在3000端口上。
然后你应该把你的Laravel包文件夹作为根文件夹,并做代理设置,把你的位置指向3000端口。

server {
        root /path_to_your_laravel_package/public/;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html index.php;
        server_name your_server_url;

        location / {
                proxy_pass http://127.0.0.1:3000;
        }

        location /api {
                alias /path_to_your_laravel_package/public/;
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }

    location ~ /\.ht {
        deny all;
    }
}

相关问题