背景
最近在搭建个人博客网站,想要给网站加一个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只能访问到容器内的目录,所以,最好提前进行目录挂载。
小编说