Nginx 无法使用 Unicorn 找到 unix 套接字文件

Posted

技术标签:

【中文标题】Nginx 无法使用 Unicorn 找到 unix 套接字文件【英文标题】:Nginx cannot find unix socket file with Unicorn 【发布时间】:2014-12-02 13:02:22 【问题描述】:

我已经检查了应用程序,一切都很好(代码和应用程​​序配置方面),服务器、数据库也正常,在日志中我遇到了这个错误,我已经看过这个 nginx cannot find unix socket file with Unicorn (no such file or directory) 但我真的不知道从哪里开始以实现“只需修改 Unicorn 配置文件中的监听变量。例如:监听“/var/sockets/unicorn.[app name].sock”,然后将 Nginx 配置为代理所有连接到您的服务器到该套接字文件,例如服务器 unix:/var/sockets/unicorn.[app name].sock fail_timeout=0;"如果有人可以请指点我一些关于如何做到这一点的方向,那就太好了。

我更改了文件,但还是遇到了同样的错误,我的配置文件是(出于保密原因,我删除了部分文件):

root = ""
working_directory root
pid "#root/tmp/pids/unicorn.pid"
stderr_path "#root/log/unicorn.log"
stdout_path "#root/log/unicorn.log"

listen "/var/sockets/unicorn.camicase.sock"
worker_processes 2
timeout 30

和 nginx 配置

upstream unicorn 
  server unix:/var/sockets/unicorn.camicase.sock fail_timeout=0;


server 
   listen         80;
   server_name    _;
   rewrite        ^ https://$host$request_uri? permanent;


server 
  listen 443;
  server_name 
  root 

  ssl on;
  ssl_certificate         
  ssl_certificate_key     

  ssl_session_timeout  5m;

  ssl_protocols  SSLv2 SSLv3 TLSv1;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers  on;

  location ^~ /assets/ 
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  

  try_files $uri/index.html $uri @unicorn;
  location @unicorn 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;

【问题讨论】:

我设法找到了更改配置的文件...但我到了同一点 (2014/10/08 00:25:19 [crit] 727#0: *4 connect( )到 unix:/var/sockets/unicorn.camicase.sock 失败(2:没有这样的文件或目录),同时连接到上游,客户端:190.60.241.227,服务器:blast.clienttoolbox.com,请求:“GET / HTTP/ 1.1”,上游:“unix:/var/sockets/unicorn.camicase.sock:”,主机:“blast.clienttoolbox.com”)我错过了什么吗?文件夹应该有什么权限?有什么限制吗? 【参考方案1】:

所以终于让系统启动并运行起来了,对于所有面临类似问题的人来说,在没有独角兽或 nginx 知识的情况下,以下是步骤:

首先确保两个服务都在运行(unicorn 是应用服务器,nginx 是 http 服务器),两个服务都应该在 /etc/init.d/ 中配置。

停止这两个服务。

检查你在 selinux 中的策略,这是一个很好的问题,关于如何在 php nginx error connect to php5-fpm.sock failed (13: Permission denied) 中处理同样的错误,这个想法是确保 selinux 不会干扰套接字的读取过程(套接字由 unicorn 创建并由 nginx 读取)

那么你必须编辑你的配置文件 unicorn.rb 和 nginx.conf,它们都应该指向一个不同于 tmp 的文件夹,这就是为什么https://serverfault.com/questions/463993/nginx-unix-domain-socket-error/464025#464025

所以最后我的配置看起来像这样:

部分 nginx 配置文件

upstream unicorn 
  server unix:/home/myuser/apps/myapp/shared/socket/unicorn.camicase.sock fail_timeout=0;

独角兽配置文件​​的一部分

listen "/home/deployer/apps/stickystreet/shared/socket/unicorn.camicase.sock"

然后启动 unicorn 和 nginx,如果在连接到上游错误时收到 (13: Permission denied),只需执行 sudo chmod 775 socket/更改您放置 unicorn 套接字要存储的任何文件夹的套接字,然后重新启动nginx 服务。

【讨论】:

camicase 的回答自 SLJ 回复以来已得到更正。它现在将正确的文件名与文件匹配。

以上是关于Nginx 无法使用 Unicorn 找到 unix 套接字文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Unicorn 需要和 Nginx 一起部署?

Unicorn 和 nginx (13: Permission denied)

调试 502 Bad Gateway 错误 - Ubuntu、Nginx、Unicorn

nginx + Unicorn + rails 的 IP 地址错误

如何在生产中使用 Nginx 和 Unicorn 配置 ActionCable?

aws、django、unicorn 和 s3 - 那我需要 nginx 吗?