django + nginx 的配置问题

2014-08-14 14:49:37 +08:00
 maikcn

背景:本人 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 模式的配置具体有什么差异?

5995 次点击
所在节点    Django
13 条回复
maikcn
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
2014-08-14 15:55:46 +08:00
直接用uwsgi啊,django的wsgi目录下有个文件 直接调用那个文件开uwsgi nginx连上uwsgi就可以工作了
Livid
2014-08-14 15:57:00 +08:00
@maikcn 是能支持的。只是不在目前的默认编辑器的功能里。

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

nginx里设置一个uwsgi_pass
就可以了
qdvictory
2014-08-14 16:56:32 +08:00
gunicorn也是一个不错的选择
magine
2014-08-14 18:03:52 +08:00
悄悄告诉楼主,django中国 这个网站有一份教程哦~
maikcn
2014-08-14 18:28:10 +08:00
@20150517 搞清楚了一件事,就是这个项目的代码估计是一路调整过来的,所以目录结构和标准的不大一样,连 wsgi.py 都没有了,project 下的所有文件也是平铺的... 不过好歹搞出了点错误提示了...
mengzhuo
2014-08-15 09:43:39 +08:00
我怎么记得是unix:///<socket> 这样的格式
maikcn
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
2014-08-15 19:37:24 +08:00
gunicorn 是个不错的选择

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/127858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX