【问题标题】:Setting up Unix Socket with Nginx and Django使用 Nginx 和 Django 设置 Unix 套接字
【发布时间】:2015-05-05 14:01:26
【问题描述】:

我正在尝试按照http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html 的教程进行操作。我已经把所有工作都归结为http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#using-unix-sockets-instead-of-ports。我正在亚马逊 EC2 上使用 ubuntu 14.4 实例:

Nginx 配置文件以:

开头
# the upstream component nginx needs to connect to
upstream django {
    server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
} 

我对设置 unix 套接字的语法感到困惑。我查看了几个来源,包括 http://pymotw.com/2/socket/uds.htmlPermission denied - nginx and uwsgi sockethttps://serverfault.com/questions/124517/whats-the-difference-between-unix-socket-and-tcp-ip-socket

看起来它们都以“///”开头如果我理解正确,路径只是指向(在我的情况下)django 项目的根目录,并且路径必须以“.sock”结尾。这看起来对吗?

编辑:我已经制作了 uwsgi 配置文件,但我正在尝试使用 --socket 开关来运行它:

Nginx 配置文件现在开始于:

# the upstream component nginx needs to connect to
upstream django {
 server unix:///tmp/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
} 

按照我的想法,我正在套接字 /tmp/mysite.sock 上运行 uwsgi。

(env1)ubuntu@ip-172-31-28-196:~$ uwsgi --socket /tmp/mysite.sock --wsgi-file test.py --chmod-socket=664

当我打开时:

http://52.10.----:8000/

在 Firefox 中我看到了:

502 Bad Gateway

nginx的错误日志显示:

2015/03/04 15:08:44 [crit] 18398#0: *3 connect() to unix:///home/ubuntu/mysite.sock failed (13: Permission denied) while connecting to upstream, client: 64.56.60.130, server: 52.10.200.38, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///home/ubuntu/mysite.sock:", host: "52.10.200.38:8000"

编辑 2:我注释掉了 django 相关的东西 -

 # mysite_uwsgi.ini file
 [uwsgi]    

 # Django-related settings
 # the base directory (full path)
 #chdir           = /path/to/your/project
 # Django's wsgi file
 #module          = project.wsgi
 # the virtualenv (full path)
 #home            = /path/to/virtualenv     

 # process-related settings
 # master
 master          = true
 # maximum number of worker processes
 processes       = 1
 # the socket (use the full path to be safe
 socket          = /tmp/mysite.sock
 # ... with appropriate permissions - may be needed
  chmod-socket    = 664
 # clear environment on exit
 vacuum          = true

我试过了:

(env1)ubuntu@ip-172-31-28-196:~$ uwsgi --ini /home/ubuntu/tproxy/tp/mysite_uwsgi.ini --wsgi-file test.py

但又出现 502 错误。

2015/03/04 17:50:00 [crit] 18842#0: *1 connect() to unix:///tmp/mysite.sock failed (13: Permission denied) while connecting to upstream, client: 64.56.60.130, server: 52.10.200.38, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///tmp/mysite.sock:", host: "52.10.200.38:8000"

编辑 3:

(env1)ubuntu@ip-172-31-28-196:~$ uwsgi --ini /home/ubuntu/tproxy/tp/mysite_uwsgi.ini --wsgi-file te
st.py
[uWSGI] getting INI configuration from /home/ubuntu/tproxy/tp/mysite_uwsgi.ini
*** Starting uWSGI 2.0.9 (64bit) on [Wed Mar  4 18:41:43 2015] ***
compiled with version: 4.8.2 on 03 March 2015 02:58:28
os: Linux-3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 2014
nodename: ip-172-31-28-196
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/ubuntu
detected binary path: /home/ubuntu/.virtualenvs/env1/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
your processes number limit is 7862
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/mysite.sock fd 3
Python version: 3.4.0 (default, Apr 11 2014, 13:08:40)  [GCC 4.8.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x205e710
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145520 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x205e710 pid: 18868 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 18868)
spawned uWSGI worker 1 (pid: 18869, cores: 1)

编辑 4:- 刚刚注意到

♥SIGINT/SIGQUIT received...killing workers...
worker 1 buried after 1 seconds
goodbye to uWSGI.
VACUUM: unix socket /tmp/mysite.sock removed.

所以每次我退出 uWSGI 时,套接字都会被删除。也许我应该关闭 vaccum 选项以便保留 chmod 设置?

我变了:

vacuum          = false

但是……

 (env1)ubuntu@ip-172-31-28-196:/tmp$ sudo chmod 777 mysite.sock
 (env1)ubuntu@ip-172-31-28-196:/tmp$ ls -la
 total 8
 drwxrwxrwt  2 root   root   4096 Mar  4 19:32 .
 drwxr-xr-x 22 root   root   4096 Mar  4 19:06 ..
 srwxrwxrwx  1 ubuntu ubuntu    0 Mar  4 19:32 mysite.sock
 (env1)ubuntu@ip-172-31-28-196:/tmp$ cd /home/ubuntu/
 (env1)ubuntu@ip-172-31-28-196:~$ ls
 host_type.py  requirements.txt  test.py  tproxy
 (env1)ubuntu@ip-172-31-28-196:~$ sudo /etc/init.d/nginx restart
  * Restarting nginx nginx
    ...done.
 (env1)ubuntu@ip-172-31-28-196:~$ uwsgi --ini /home/ubuntu/tproxy/tp/mysite_uwsgi.ini --wsgi-fi
 st.py
 [uWSGI] getting INI configuration from /home/ubuntu/tproxy/tp/mysite_uwsgi.ini
 *** Starting uWSGI 2.0.9 (64bit) on [Wed Mar  4 19:36:42 2015] ***
 .....
 spawned uWSGI worker 1 (pid: 1568, cores: 1)
 ♥SIGINT/SIGQUIT received...killing workers...
 worker 1 buried after 1 seconds
 goodbye to uWSGI.
 (env1)ubuntu@ip-172-31-28-196:~$ cd /tmp
 (env1)ubuntu@ip-172-31-28-196:/tmp$ ls -la
 total 8
 drwxrwxrwt  2 root   root   4096 Mar  4 19:36 .
 drwxr-xr-x 22 root   root   4096 Mar  4 19:06 ..
 srw-rw-r--  1 ubuntu ubuntu    0 Mar  4 19:36 mysite.sock

所以 chmod 没有被保留..

编辑 5:

(env1)ubuntu@ip-172-31-28-196:/tmp$ uwsgi --ini /home/ubuntu/tproxy/tp/mysite_uwsgi.ini --wsgi-file
 test.py --chmod-socket=777
[uWSGI] getting INI configuration from /home/ubuntu/tproxy/tp/mysite_uwsgi.ini
*** Starting uWSGI 2.0.9 (64bit) on [Wed Mar  4 20:54:21 2015] ***
compiled with version: 4.8.2 on 03 March 2015 02:58:28
os: Linux-3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 2014
nodename: ip-172-31-28-196
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /tmp
detected binary path: /home/ubuntu/.virtualenvs/env1/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
your processes number limit is 7862
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/mysite.sock fd 3
Python version: 3.4.0 (default, Apr 11 2014, 13:08:40)  [GCC 4.8.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x18b4790
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145520 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
failed to open python file test.py
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 1858)
spawned uWSGI worker 1 (pid: 1859, cores: 1)
--- no python application found, check your startup logs for errors ---
[pid: 1859|app: -1|req: -1/1] 64.56.60.130 () {36 vars in 555 bytes} [Wed Mar  4 20:54:34 2015] GET
/ => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)

现在出现内部服务器错误:

2015/03/04 19:33:26 [crit] 1531#0: *1 connect() to unix:///tmp/mysite.sock failed (13: Permission denied) while connecting to upstream, client: 64.56.60.130, server: 52.10.200.38, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///tmp/mysite.sock:", host: "52.10.200.38:8000"

【问题讨论】:

    标签: python linux django sockets nginx


    【解决方案1】:

    将其更改为服务器unix:///tmp/mysite.sock;,然后在您制作的uwsgi ini 文件中,在/tmp/ 中创建unix 套接字

    【讨论】:

    • 感谢您查看此人,我已按照您的建议更改了 nginx 配置。至于 uwsgi 配置,我假设您在谈论 uwsgi-docs.readthedocs.org/en/latest/tutorials/… ?如果是这样,您将这个文件放在哪里,我认为它没有说明 tut 的位置。
    • 我通常只是将它与 settings.py 和 wsgi.py 文件放在同一个文件夹中。稍后当你设置帝王时你会明白为什么。没问题,昨晚我在 amazon ec2 上再次设置了相同的设置进行尝试,效果很好。 :)
    • 仔细检查您的配置并确保将 .sock 放在 nginx 正在寻找它的同一位置。
    • 启动时uwsgi会说什么吗?
    • 好的,我从错误的目录运行了 uwsgi --ini /home/ubuntu/tproxy/tp/mysite_uwsgi.ini --wsgi-file test.py --chmod-socket=777并且 test.py 不存在
    猜你喜欢
    • 2016-09-06
    • 2017-01-19
    • 2016-01-29
    • 1970-01-01
    • 2012-12-27
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多