一个例子:
server {
listen 80;
server_name priv.gethnode.com;
location / {
proxy_pass http://127.0.0.1:18548;
}
}
location的匹配规则
基于最完整匹配原则
比如有几个location
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }
http://example.com
将被/
匹配,http://example.com/planet/blog/
将被/planet/blog/
匹配
参考文档:https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx/#location-blocks
proxy_pass的理解
server的配置:
#server config
server {
listen 80;
server_name test.com;
}
如果proxy_pass只是一个host,不是一个uri,
location /app/ {
proxy_pass http://192.168.154.102;
}
test.com/app/xxxxx => http://192.168.154.102/xxxxx
如果proxy_pass是一个uri
location /app/ {
proxy_pass http://192.168.154.102/maped_dir/;
}
test.com/app/xxxxx => http://192.168.154.102/maped_dir/xxxxx
参考文章:
https://www.liaohuqiu.net/posts/nginx-proxy-pass/
对于静态文件
nginx一般是用www-data用户来运行的(不是root用户,跟nginx版本有关系,有可能是nobody),这个配置可以从nginx.conf里查看user
所以对于的文件组应该也是属于www-data这个用户组下面的
可以在根目录下创建一个文件夹,授权给www-data这个目录,不要放在/root/目录下,不然会访问不到报403
给文件设置用户组以及对应的权限:
//给文件夹以及子文件夹设置用户和用户组
chown -R www-data:www-data static_folder
//给文件夹和子文件夹设置权限
chmod -R 755 static_folder
//给文件设置权限
chmod g+r xxx/*
在nginx下配置对应的staic文件夹
server {
listen 80;
server_name mapi.cxtchain.org;
access_log /var/log/nginx/mapi-access.log;
location / {
proxy_pass http://127.0.0.1:9090;
}
location /app/ {
root /;
}
}
这里第二个location就是配置的static文件的路径,如果用root
,那么路径就会追加到路径后面,比如:
location /app/ {
root /123/ironman/;
}
访问sample.com/app/xxx
=> /123/ironman/app/xxx
root可以替换为alias
这样就直接就是alias后面的路径
location /app/ {
alias /123/ironman/;
}
`sample.com/app/xxx` => `/123/ironman/xxx`
解决问题的小技巧
可以通过查看nginx的error.log查看到底是文件找不到还是权限不够
比如
2019/05/18 10:49:56 [error] 8836#0: *222 open() "/static/static/mycss.css" failed (13: Permission denied), client: 58.62.201.38, server: xxx, request: "GET /static/static/mycss.css HTTP/1.1", host: "xxx"
2019/05/18 10:49:57 [error] 8836#0: *222 open() "/static/static/mycss.css" failed (13: Permission denied), client: 58.62.201.38, server: xxx, request: "GET /static/static/mycss.css HTTP/1.1", host: "xxx"
2019/05/18 10:49:57 [error] 8836#0: *222 open() "/static/static/mycss.css" failed (13: Permission denied), client: 58.62.201.38, server: xxx, request: "GET /static/static/mycss.css HTTP/1.1", host: "xxx"
通过命令查看文件及各级父目录的权限
[root@mock-01 nginx]# namei -l static/css/mycss.css
f: static/css/mycss.css
drw-r--r-- nginx nginx static
drwxr-xr-x nginx nginx css
-rw-r--r-- nginx nginx mycss.css
如果一直出现 "13 permission denied"
可以尝试这么解决
gpasswd -a www-data root
chmod g+x /root/
chmod g+x /root/.../static/
nginx -s reload
这里的www-data
指nginx的用户名称
第二个命令最好逐级目录运行下去,直到你的static文件夹
最后别忘了重新启动nginx
参考Stack Overflow解答
常用命令
nginx -s stop //停止
nginx -s reload //重新加载配置文件
nginx //启动nginx
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
网友评论