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

背景

最近在搭建个人博客网站,想要给网站加一个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的区别

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

问题

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

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

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

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

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

failed (13: Permission denied)

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

解决思路有两个

  1. 访问的路径无权限。使用chmod 777 文件路径,意思是,所属用户、所在组、其他用户对该资源都有读写可执行的权利。
  2. 如果访问的root目录下的资源的,把nginx.conf 全局块的user值改成root
    docker启动的nginx配置访问静态资源,访问失败的解决方法

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

}

注意事项

  1. 如果是访问/root目录下的资源,nginx需要配置nginx.conf 全局块的user值改成root
  2. 如果是docker启动的nginx,一定要注意映射目录,nginx只能访问到容器内的目录,所以,最好提前进行目录挂载。
上一篇:网页图片转动动画模板,可以用于上传动画效果,LOGO动态效果


下一篇:jsp实现简单的分页