配置nginx和uwsgi时出现“没有这样的文件或目录”错误

时间:2015-10-06 15:45:30

标签: python nginx uwsgi

更新:如果我不使用套接字并使用127.0.0.1:3031代替,那么一切正常。

Nginx版本是1.6.3,uwsgi是2.0.11.1

/etc/uwsgi.ini:

[uwsgi]
uid = uwsgi
gid = uwsgi
pidfile = /run/uwsgi/uwsgi.pid
emperor = /etc/uwsgi.d
stats = /run/uwsgi/stats.sock
emperor-tyrant = true
cap = setgid,setuid
logto = /var/log/uwsgi.log

/etc/uwsgi.d/daimaduan_preview.ini

[uwsgi]
plugin = python,http
protocol = uwsgi
chdir = /var/www/daimaduan/preview/current
master = true
processes = 4
threads = 20
socket = /tmp/daimaduan-preview.sock
chmod-socket = 666
uid = vagrant
gid = vagrant
logto = /var/log/daimaduan/preview/uwsgi.log
virtualenv = /var/www/daimaduan/preview/venv
wsgi-file = deploy.wsgi

/etc/nginx/conf.d/daimaduan.conf

server {
    listen 80;
    server_name example.com;
    access_log /var/log/daimaduan/preview/access.log;
    error_log /var/log/daimaduan/preview/error.log;
    root /var/www/daimaduan/preview/current/daimaduan;

    location / {
        uwsgi_pass unix:/tmp/daimaduan-preview.sock;
        include uwsgi_params;
    }
}

但是,我通过访问http://127.0.0.1/来获取nginx的错误:

2015/10/06 14:14:04 [crit] 16946#0: *1 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 14:17:44 [crit] 16995#0: *1 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 14:28:13 [crit] 16995#0: *3 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:29:14 [crit] 16995#0: *5 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:30:52 [crit] 16995#0: *7 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:32:48 [crit] 16995#0: *9 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:37:14 [crit] 16995#0: *11 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:38:14 [crit] 16995#0: *13 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"
2015/10/06 15:38:21 [crit] 17577#0: *1 connect() to unix:/tmp/daimaduan-preview.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/daimaduan-preview.sock:", host: "127.0.0.1"

我很确定/tmp/daimaduan-preview.sock确实存在。我还检查了uwsgi日志:

*** Starting uWSGI 2.0.11.1 (64bit) on [Tue Oct  6 15:38:09 2015] ***
compiled with version: 4.8.3 20140911 (Red Hat 4.8.3-9) on 21 July 2015 16:01:10
os: Linux-3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014
nodename: localhost.localdomain
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /etc/uwsgi.d
detected binary path: /usr/sbin/uwsgi
chdir() to /var/www/daimaduan/preview/current
your processes number limit is 3826
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 inherited UNIX address /tmp/daimaduan-preview.sock fd 3
Python version: 2.7.5 (default, Jun 24 2015, 00:41:19)  [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]
Set PythonHome to /var/www/daimaduan/preview/venv
Python main interpreter initialized at 0x865410
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 1342720 bytes (1311 KB) for 80 cores
*** Operational MODE: preforking+threaded ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x865410 pid: 17132 (default app)
mountpoint  already configured. skip.
*** uWSGI is running in multiple interpreter mode ***
gracefully (RE)spawned uWSGI master process (pid: 17132)
spawned uWSGI worker 1 (pid: 17475, cores: 20)
spawned uWSGI worker 2 (pid: 17476, cores: 20)
spawned uWSGI worker 3 (pid: 17477, cores: 20)
spawned uWSGI worker 4 (pid: 17478, cores: 20)

看起来也很正常。

这里有一些问题:

  1. 为什么uid和gid不会在/etc/uwsgi.d/daimaduan.ini生效?
  2. 如何更改/tmp/daimaduan-preview.sock的所有权?我尝试了chown-socket但未通过
  3. 为什么No such file or directory中出现/var/log/daimaduan/preview/uwsgi.log错误?

2 个答案:

答案 0 :(得分:11)

daimaduan_preview.ini的套接字文件放入/run而不是/tmp。与this答案一样,您的系统可能使用命名空间的临时目录,这意味着每个服务只能在/tmp中看到自己的文件。

答案 1 :(得分:-1)

ngnix是一个独立的进程,因此在启动应用程序之前,您需要先停止ngnix。

sudo service ngnix stop。否则,套接字myapp.socket对ngnix是不可见的。即使您执行ls /var/www/myapp/myapp.socket时,也确实显示了ls命令的终端结果。因为ngnix是在使用uwsgi myapp.ini命令运行应用程序之前启动的,所以ngnix的进程不知道套接字myapp.socket是什么。因此,避免此问题的诀窍是。

  1. 使用sudo service ngnix stop停止ngnix
  2. 启动您的应用uwsgi myapp.ini
  3. 启动ngnix sudo service ngnix start