V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maikcn
V2EX  ›  Django

django + nginx 的配置问题

  •  
  •   maikcn · 2014-08-14 14:49:37 +08:00 · 6015 次点击
    这是一个创建于 3784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:本人 python 和 nginx 都是小白,由于需要接手一个 django 开发的网站,用 runserver 能将 development 环境跑起来,但用 fastcgi 的模式怎么也没搞明白

    目前遇到的问题如下是,在 nginx 下死活都是 502 Bad Gateway,error.log 中报错

    [error] 1878#0: *24 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.88.1, server: 192.168.88.10, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/xxx.sock:", host: "192.168.88.10:8080"
    

    没搞清楚到底要怎么排查这个 Connection reset by peer 的问题

    配置是这样的,用这个 xxx.fcgi 文件启动 cgi 模式的 django 程序(tmp下对应pid和sock文件都有创建了)

    #!/bin/bash
    
    # config
    PROJECT="xxx"
    PROJECT_ROOT="/home/vagrant/projects/$PROJECT"
    CODE_ROOT="$PROJECT_ROOT/code/xxx"
    VIRTUAL_ENV_PATH="/home/vagrant/python-envs/xxx-env"
    
    PID_SCKT_PATH="/tmp"
    PID_FILE="$PID_SCKT_PATH/$PROJECT.pid"
    SCKT_FILE="$PID_SCKT_PATH/$PROJECT.sock"
    
    # enter virtual env
    source $VIRTUAL_ENV_PATH/bin/activate
    
    # kill old pid
    cd $PID_SCKT_PATH
    if [ -f $PID_FILE ]; then
        kill `cat -- $PID_FILE`
        rm -f -- $PID_FILE
    fi
    
    # daemonize=false
    cd $CODE_ROOT
    export PYTHON_EGG_CACHE=/tmp/.python-eggs
    exec python $CODE_ROOT/manage.py runfcgi \
        protocol=scgi method=prefork socket=$SCKT_FILE pidfile=$PID_FILE umask=020 maxrequests=100
    

    而 nginx 的配置如下,期望是能通过 192.168.88.10:8080 能访问

    server {
        listen   8080;
        server_name 192.168.88.10;
        access_log /var/log/nginx/xxx-access.log;
        error_log /var/log/nginx/xxx-error.log;
    
        location / {
          fastcgi_pass  unix:/tmp/xxx.sock;
          include /etc/nginx/fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
    

    所以来请教下各大神我是否哪里配置出错了,或者问题点在哪里?

    另外,网上搜索的 fastcgi 的配置,有些是将 djagon 在 method=threaded 模式下的端口 pass 出来的,和上面这种 sock 模式的配置具体有什么差异?

    13 条回复    2014-08-15 19:37:24 +08:00
    maikcn
        1
    maikcn  
    OP
       2014-08-14 14:58:52 +08:00
    以为能支持Markdown了,结果... 用 gist 更新了一下代码的内容

    nginx 配置内容
    https://gist.github.com/vc2tea/25c63523ec2a6fd35df6

    fcgi 启动文件
    https://gist.github.com/vc2tea/de10044f94cf14da7216
    20150517
        2
    20150517  
       2014-08-14 15:55:46 +08:00 via Android   ❤️ 1
    直接用uwsgi啊,django的wsgi目录下有个文件 直接调用那个文件开uwsgi nginx连上uwsgi就可以工作了
    Livid
        3
    Livid  
    MOD
       2014-08-14 15:57:00 +08:00   ❤️ 2
    @maikcn 是能支持的。只是不在目前的默认编辑器的功能里。

    帮你把这个帖子的 Markdown 打开了。
    maikcn
        4
    maikcn  
    OP
       2014-08-14 16:09:54 +08:00
    @20150517 没找到 wsgi 目录,不过 uwsgi 这个方向我尝试下怎么弄,谢谢了!
    maikcn
        5
    maikcn  
    OP
       2014-08-14 16:15:30 +08:00
    @Livid thx,顺眼多了,打开 gist 真慢...
    Livid
        6
    Livid  
    MOD
       2014-08-14 16:16:04 +08:00
    @maikcn 嗯,而且我们是可以支持 ```bash 和 ```nginx 这样的语法的。
    20150517
        7
    20150517  
       2014-08-14 16:50:16 +08:00   ❤️ 1
    @maikcn 在你的项目目录下,有一个叫wsgi.py的文件,你要装uwsgi然后运行uwsgi --socket yoursite.sock --wsgi-file yoursite/wsgi.py --chmod-socket=666

    nginx里设置一个uwsgi_pass
    就可以了
    qdvictory
        8
    qdvictory  
       2014-08-14 16:56:32 +08:00   ❤️ 1
    gunicorn也是一个不错的选择
    magine
        9
    magine  
       2014-08-14 18:03:52 +08:00   ❤️ 1
    悄悄告诉楼主,django中国 这个网站有一份教程哦~
    maikcn
        10
    maikcn  
    OP
       2014-08-14 18:28:10 +08:00
    @20150517 搞清楚了一件事,就是这个项目的代码估计是一路调整过来的,所以目录结构和标准的不大一样,连 wsgi.py 都没有了,project 下的所有文件也是平铺的... 不过好歹搞出了点错误提示了...
    mengzhuo
        11
    mengzhuo  
       2014-08-15 09:43:39 +08:00   ❤️ 1
    我怎么记得是unix:///<socket> 这样的格式
    maikcn
        12
    maikcn  
    OP
       2014-08-15 10:27:02 +08:00
    已经ok了,结贴,谢谢各位,最后还是切换到 uwsgi 的模式了,分享一下解决办法,由于项目结构貌似比较奇葩,不知道有没有参考价值

    uwsgi.ini 文档内容
    ```
    [uwsgi]
    chdir=/home/vagrant/projects/xxx/code
    env=DJANGO_SETTINGS_MODULE=xxx.settings
    virtualenv=/home/vagrant/python-envs/xxx-env
    module=django.core.handlers.wsgi:WSGIHandler()
    master=True
    pidfile=/tmp/xxx.pid
    socket=/tmp/xxx.sock
    vacuum=True
    max-requests=100
    daemonize=/tmp/xxx.log
    pythonpath=/home/vagrant/projects/xxx/code/xxx
    ```

    [3 points]
    由于没有 wsgi.py 文件,所以 module 中的设置指向了 django 的 wsgi
    跑起来后发现原来 runserver 中正常的内容出错了,出错为 no module,然后发现还需要配置 pythonpath
    nginx 中的 uwsgi_pass 格式为 unix:///tmp/xxx.sock;
    crazycookie
        13
    crazycookie  
       2014-08-15 19:37:24 +08:00
    gunicorn 是个不错的选择
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1612 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.