【问题标题】:How to fix 404 nginx error on routers after letsencrypt installation安装letsencrypt后如何修复路由器上的404 nginx错误
【发布时间】:2019-02-10 22:38:25
【问题描述】:

我正在设置一个在vestaCP+NGINX+php-fpm 和 laravel 后端上运行的新服务器,安装letsencrypt 后,我​​在除主页外的所有路由器上都遇到404 错误。 laravel .env 没问题,我的 nginx 配置如下,另外,控制面板还为 ssl 创建了另一个 nginx 配置文件。该站点在 http 协议上没有任何问题。

server {
    listen      xx.xxx.xxx.xx:443;
    server_name example.com www.example.com;
    root        /home/admin/web/example.com/public_html;
    index       index.php index.html index.htm;
    access_log  /var/log/nginx/domains/example.com.log combined;
    access_log  /var/log/nginx/domains/example.com.bytes bytes;
    error_log   /var/log/nginx/domains/example.com.error.log error;


    ssl         on;
    ssl_certificate      /home/admin/conf/web/ssl.example.com.pem;
    ssl_certificate_key  /home/admin/conf/web/ssl.example.com.key;

    location / {
             try_files $uri $uri/ /index.php$is_args$args;
    location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
        expires     max;
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_param SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        if (!-f $document_root$fastcgi_script_name) {
        fastcgi_pass    127.0.0.1:9001;

        fastcgi_index   index.php;
        include         /etc/nginx/fastcgi_params;
    }
}

error_page  403 /error/404.html;
error_page  404 /error/404.html;
error_page  500 502 503 504 /error/50x.html;

location /error/ {
    alias   /home/admin/web/example.com/document_errors/;
}

location ~* "/\.(htaccess|htpasswd)$" {
    deny    all;
    return  404;
}
location /vstats/ {
    alias   /home/admin/web/example.com/stats/;
    include /home/admin/conf/web/example.com.auth*;
}

include     /etc/nginx/conf.d/phpmyadmin.inc*;
include     /etc/nginx/conf.d/phppgadmin.inc*;
include     /etc/nginx/conf.d/webmail.inc*;

include     /home/admin/conf/web/nginx.example.com.conf*;
}

【问题讨论】:

    标签: laravel ssl nginx lets-encrypt vesta


    【解决方案1】:

    问题

    我不是 Nginx 专家,但在我看来,所有 location 指令都应该在 server 指令内,而目前它们不是。此外,您还嵌套了 location 指令,我认为它们不是必需的......

    首先尝试用这个来解决这个问题:

    server {
        listen      xx.xxx.xxx.xx:443;
        server_name example.com www.example.com;
        root        /home/admin/web/example.com/public_html;
        index       index.php index.html index.htm;
        access_log  /var/log/nginx/domains/example.com.log combined;
        access_log  /var/log/nginx/domains/example.com.bytes bytes;
        error_log   /var/log/nginx/domains/example.com.error.log error;
    
    
        ssl         on;
        ssl_certificate      /home/admin/conf/web/ssl.example.com.pem;
        ssl_certificate_key  /home/admin/conf/web/ssl.example.com.key;
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
            expires     max;
        }
    
        location ~ \.php$ {
            # https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/
            #try_files $uri =404;
            #try index.php =404;
    
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #fastcgi_pass php:9000;
            fastcgi_pass  127.0.0.1:9001;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors off;
            fastcgi_buffer_size 16k;
            fastcgi_buffers 4 16k;
        }
    
        error_page  403 /error/404.html;
        error_page  404 /error/404.html;
        error_page  500 502 503 504 /error/50x.html;
    
        location /error/ {
            alias   /home/admin/web/example.com/document_errors/;
        }
    
        location ~* "/\.(htaccess|htpasswd)$" {
            deny    all;
            return  404;
        }
    
        location /vstats/ {
            alias   /home/admin/web/example.com/stats/;
            include /home/admin/conf/web/example.com.auth*;
        }
    
        include     /etc/nginx/conf.d/phpmyadmin.inc*;
        include     /etc/nginx/conf.d/phppgadmin.inc*;
        include     /etc/nginx/conf.d/webmail.inc*;
    
        include     /home/admin/conf/web/nginx.example.com.conf*;
    }
    

    注意:这未经测试,因此请在开发中尝试,如果您修复了文件中的任何语法或错误,请告诉我,以便我更新答案。如果您无法修复,请告诉我们出了什么问题,以便我们尝试进一步的帮助。

    可能的改进

    使用 Laravel 后,您可以尝试遵循 Nginx 配置 Php Docker Stack,该配置可直接与 Laravel 一起使用。

    您需要复制的位以替换 Nginx conf server{} 指令中的当前位是这一位:

    
        # In Laravel we only need serve index.php
        location @proxyphp {
            rewrite (.*) /index.php;
        }
    
        # serving only index.php increases the security in your application. 
        location ~ /index\.php$ {
            # https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/
            #try_files $uri =404;
            #try index.php =404;
    
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors off;
            fastcgi_buffer_size 16k;
            fastcgi_buffers 4 16k;
        }
    
        # Deny access to all php files that are not index.php
        location ~ \.php$ {
            deny all;
        }
    

    安全改进

    在 Laravel 中,我们只需要提供 index.php,这样做可以提高应用程序的安全性,一旦它只有 1 个公共入口点,而不是 Laravel 的 public 文件夹中的任何 *.php 可以访问应用程序。

    【讨论】:

    • 对不起,解决方案对我不起作用,我收到“nginx: [emerg] host not found in upstream”错误
    • 您是否将xxx.xxx:443 替换为您的IP 并将example.com 更新为您自己的域?我现在看到我忘记更新答案中的fastcgi_pass 以反映您使用的那个...我会更新ti。
    • 当然,我做了所有的事情,但没有任何改变
    • 很抱歉听到这个消息...您是否应用了我在上次发表评论后所做的最后更改。我从fastcgi_pass php:9000; 更改为fastcgi_pass 127.0.0.1:9001;
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多