nginx配置访问静态资源,访问失败的解决方法

    2023-05-08     分类   技术     标签   其他   阅读 274        

背景

最近在搭建个人博客网站,想要给网站加一个logo,即配置一下Nginx访问静态资源。这应该算是比较基础的一个配置,但是在配置过程当中也遇到了一些问题,尤其是找不到静态资源404的问题。

Nginx是使用docker启动。

我的需求是,在root目录下的一个文件夹里建立一个file文件夹,配置Nginx之后可以访问这个文件夹下的所有资源。目录结构为:/root/file/images/logo/logo.jpg Nginx配置访问静态资源 方法一:root

server{
    listen 7001;
    server_name localhost;
    location /file/ {
        root /root/;
    }
}

此时,通过浏览器访问http://127.0.0.1:7001/file/images/logo/logo.jpg,则访问服务器的文件是/root/file/images/logo/logo.jpg。 方法二:alias

server{
    listen 7001;
    server_name localhost;
    location /file/ {
        alias /root/file/;
    }
}

此时,通过浏览器访问http://127.0.0.1:7001/file/images/logo/logo.jpg,则访问服务器的文件是/root/file/images/logo/logo.jpg。

root和alias的区别

root与alias主要区别在于Nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径。alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。而root则可有可无。
alias只能位于location块中。(root可以不放在location中)

问题 1.Nginx访问静态资源时网页出现 403 forbidden

在用Nginx做静态资源服务器,访问Linux下的一个图片时网页中出现403 forbidden。

先来看下http状态码403啥意思?

表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误

简单说就是无权访问该资源,为了确定原因我又查看了Nginx的错误日志:

Failed (13: Permission denied)

发现 Permission denied这个短语很常见啊,就是权限被拒绝。

解决思路有两个

访问的路径无权限。使用chmod 777 文件路径,意思是,所属用户、所在组、其他用户对该资源都有读写可执行的权利。
如果访问的root目录下的资源的,把Nginx.conf 全局块的user值改成root。

在这里插入图片描述

2.docker启动的Nginx配置访问静态资源,访问失败404

按照上述的Nginx配置访问静态资源应该是没问题的,但就是访问不到。显示是404,但感觉路径设置的应该没错呀。

经过重重的问题排查,才想到,原来Nginx是docker启动的,访问的静态资源必须是在docker容器里边的才可以,否则肯定找不到。之前的目录/root/file/并没有挂载到docker容器里面,所以肯定找不到。而且Nginx的conf文件进行路径映射的时候,也应该映射容器里的文件路径。

这里要么是把/root/file映射到容器了,要么就是更换映射路径。

我在启动Nginx容器的时候,将宿主机的/root/project目录映射到容器的/project了。所以我在宿主机的/root/project目录下建立file文件,Nginx的conf文件配置路径为/project/file即可。

更换需求: 在/root/project目录下的一个文件夹里建立一个file文件夹,配置Nginx之后可以访问这个文件夹下的所有资源。目录结构为:/root/project/file/images/logo/logo.jpg。Nginx代理容器内的目录为/project/file。

总之,修改后的配置文件为:

root方式

server {
    listen       8001;
    server_name  localhost;
    location /file/ {
        root /project/;
    }
}

alias方式

server {
    listen       8001;
    server_name  localhost;
    location /file/ {
        alias /project/file/;
    }
}

注意事项

如果是访问/root目录下的资源,Nginx需要配置Nginx.conf 全局块的user值改成root。
如果是docker启动的Nginx,一定要注意映射目录,Nginx只能访问到容器内的目录,所以,最好提前进行目录挂载。

小编说