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