nginx+django 502 bad gateway 初学者问题。

没用过nginx,如果问题太弱智请轻喷T_T
想试着把django部署到nginx上面去,于是就看了readthedocs 上面的教程。一步步操作都还顺利,但是到Using Unix sockets instead of ports 这一步的时候就出错了,翻了/var/log/nginx/error.log 发现是权限的问题,如下

2017/12/22 21:55:13 [crit] 12682#12682: *3 connect() to unix:///media/eureka/Myzone/lanShare/mysite.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///media/eureka/Myzone/lanShare/mysite.sock:", host: "localhost:8000"

目录结构是这样子的

/media/eureka/Myzone/lanShare
                        test.py
                        /lanShare/
                              lanShare_nginx.conf\
                              -> /etc/nginx/sites-enabled/lanShare_nginx.conf
                            

test.py文件内容如下

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3

lanShare_nginx.conf 文件内容如下

upstream django {
    server unix:///media/eureka/Myzone/lanShare/mysite.sock ; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /media/eureka/Myzone/lanShare/lanShare/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /media/eureka/Myzone/lanShare/lanShare/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /media/eureka/Myzone/lanShare/lanShare/uwsgi_params; # the uwsgi_params file you installed
    }
}

test.py 所在目录运行uwsgi 命令如下

$ uwsgi --socket mysite.sock --wsgi-file test.py

然后重启nginx,在浏览器中打开127.0.0.1:8000 就是502了

尝试过的方法

  • 教程上的加上--chmod-socket=666
  • 当前用户已加入www-data
  • 运行uwsgi时加上了--uid www-data --gid www-data
  • 搜了一通SO没找到解决办法

以上方法都没有解决我的问题,不用unix socket是可以访问的,也就是改变配置文件里upstream,然后

uwsgi --socket :8001 --wsgi-file test.py

都纠结一下午了,希望各位帮忙

OS: ubuntu 16.04

阅读 9.3k
3 个回答

又找了一堆资料,自答了。

问题原因

nginx没有进入该目录的权限,故无法访问socket文件,permission denied

解决方法

1.改变socket文件位置

把socket文件放在ngnix可以访问到的地方,比如/tmp/mysite.sock
修改nginx相应配置文件,然后运行uwsgi

$ uwsgi --socket /tmp.mysite.sock --wsgi-file test.py

2.改变运行nginx的用户身份

没有权限,我就给你权限
/etc/nginx/nginx.conf 第一行的user www-data; 中的www-data 改成权限足够高的用户,重启nginx

uwsgi文档很坑, 把你的项目目录的权限改成www-data就行了, 另外, 可以考虑用gunicorn, 性能不比uwsgi差多少, 但是文档写的很清晰

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏