配置 nginx 和 uwsgi 时出现 'No such file or directory' 错误

Got 'No such file or directory' error while configuring nginx and 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. 为什么我在 /var/log/daimaduan/preview/uwsgi.log 中出现 No such file or directory 错误?

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

中看到自己的文件

ngnix 运行s 作为一个单独的进程,因此在启动应用程序之前,您需要停止 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
  2. 停止 ngnix
  3. 启动您的应用程序uwsgi myapp.ini
  4. 启动 ngnix sudo service ngnix start