背景:本人 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 模式的配置具体有什么差异?
1
maikcn OP 以为能支持Markdown了,结果... 用 gist 更新了一下代码的内容
nginx 配置内容 https://gist.github.com/vc2tea/25c63523ec2a6fd35df6 fcgi 启动文件 https://gist.github.com/vc2tea/de10044f94cf14da7216 |
2
20150517 2014-08-14 15:55:46 +08:00 via Android 1
直接用uwsgi啊,django的wsgi目录下有个文件 直接调用那个文件开uwsgi nginx连上uwsgi就可以工作了
|
7
20150517 2014-08-14 16:50:16 +08:00 1
|
8
qdvictory 2014-08-14 16:56:32 +08:00 1
gunicorn也是一个不错的选择
|
9
magine 2014-08-14 18:03:52 +08:00 1
悄悄告诉楼主,django中国 这个网站有一份教程哦~
|
10
maikcn OP |
11
mengzhuo 2014-08-15 09:43:39 +08:00 1
我怎么记得是unix:///<socket> 这样的格式
|
12
maikcn OP 已经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; |
13
crazycookie 2014-08-15 19:37:24 +08:00
gunicorn 是个不错的选择
|