鍍金池/ 問答/Python  Linux/ nginx+django 502 bad gateway 初學(xué)者問題。

nginx+django 502 bad gateway 初學(xué)者問題。

沒用過nginx,如果問題太弱智請輕噴T_T
想試著把django部署到nginx上面去,于是就看了readthedocs 上面的教程。一步步操作都還順利,但是到Using Unix sockets instead of ports 這一步的時候就出錯了,翻了/var/log/nginx/error.log 發(fā)現(xiàn)是權(quán)限的問題,如下

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"

目錄結(jié)構(gòu)是這樣子的

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

test.py文件內(nèi)容如下

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

lanShare_nginx.conf 文件內(nèi)容如下

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 所在目錄運(yùn)行uwsgi 命令如下

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

然后重啟nginx,在瀏覽器中打開127.0.0.1:8000 就是502了

嘗試過的方法

  • 教程上的加上--chmod-socket=666
  • 當(dāng)前用戶已加入www-data
  • 運(yùn)行uwsgi時加上了--uid www-data --gid www-data
  • 搜了一通SO沒找到解決辦法

以上方法都沒有解決我的問題,不用unix socket是可以訪問的,也就是改變配置文件里upstream,然后

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

都糾結(jié)一下午了,希望各位幫忙

OS: ubuntu 16.04

回答
編輯回答
陪她鬧

uwsgi文檔很坑, 把你的項(xiàng)目目錄的權(quán)限改成www-data就行了, 另外, 可以考慮用gunicorn, 性能不比uwsgi差多少, 但是文檔寫的很清晰

2017年12月18日 20:56
編輯回答
陪她鬧

參考下我的這篇文章,看是否能幫助你哈,https://ypdai.github.io/2016/...

2018年5月7日 05:50
編輯回答
話寡

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

問題原因

nginx沒有進(jìn)入該目錄的權(quán)限,故無法訪問socket文件,permission denied

解決方法

1.改變socket文件位置

把socket文件放在ngnix可以訪問到的地方,比如/tmp/mysite.sock
修改nginx相應(yīng)配置文件,然后運(yùn)行uwsgi

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

2.改變運(yùn)行nginx的用戶身份

沒有權(quán)限,我就給你權(quán)限
/etc/nginx/nginx.conf 第一行的user www-data; 中的www-data 改成權(quán)限足夠高的用戶,重啟nginx

2017年3月25日 21:57