NGINX:连接到unix:/var/run/php7.0-fpm.sock失败(2:没有这个文件或目录)

50

我正在尝试按照这个Ansible教程,并将其调整为在Ubuntu 16.04上使用php7。 在此消息下方,您将找到我的Ansible文件。 运行后,在浏览器中尝试访问页面后,我遇到了404错误,并在nginx错误日志中找到了以下内容:

2016/10/15 13:13:20 [crit] 28771#28771: *7 connect() to unix:/var/run/php7.0-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 93.xxx.xxx.xx, server: 95.xx.xx.xx, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php7.0-fpm.sock:", host: "95.xx.xx.xx"

所以我检查了套接字文件是否存在,似乎确实存在,但是ls行为怪异:

$ sudo ls -l /var/run/php
total 4
-rw-r--r-- 1 root     root     5 Oct 15 13:00 php7.0-fpm.pid
srw-rw---- 1 www-data www-data 0 Oct 15 13:00 php7.0-fpm.sock
$ sudo ls -l /var/run/php7
ls: cannot access '/var/run/php7': No such file or directory
$ sudo ls -l /var/run/php7.0-fpm.sock
ls: cannot access '/var/run/php7.0-fpm.sock': No such file or directory

如果我用部分名字php搜索,为什么ls可以找到套接字文件,但是当我列出大于那个名称php7甚至完整的名称php7.0-fpm.sock时,无法找到套接字文件呢?

最重要的是,我如何使它与nginx配合使用?欢迎所有提示!

下面是我粘贴的Ansible文件

---
- hosts: php
  become: true

  tasks:
  - name: install packages
    apt: name={{ item }} update_cache=yes state=latest
    with_items:
      - git
      - mcrypt
      - nginx
      - php-cli
      - php-curl
      - php-fpm
      - php-intl
      - php-json
      - php-mcrypt
      - php-mbstring
      - php-sqlite3
      - php-xml
      - sqlite3

  - name: enable mbstring
    shell: phpenmod mbstring
    notify:
      - restart php7.0-fpm
      - restart nginx

  - name: create /var/www/ directory
    file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700

  - name: Clone git repository
    git: >
      dest=/var/www/laravel
      repo=https://github.com/laravel/laravel.git
      update=no
    become: true
    become_user: www-data
    register: cloned

  - name: install composer
    shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    args:
      creates: /usr/local/bin/composer

  - name: composer create-project
    composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
    become: true
    become_user: www-data
    when: cloned|changed

  - name: set APP_DEBUG=false
    lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false

  - name: set APP_ENV=production
    lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production

  - name: Configure nginx
    template: src=nginx.conf dest=/etc/nginx/sites-available/default
    notify:
      - restart php5-fpm
      - restart nginx

  handlers:
    - name: restart php7.0-fpm
      service: name=php7.0-fpm state=restarted

    - name: restart nginx
      service: name=nginx state=restarted

    - name: reload nginx
      service: name=nginx state=reloaded

您正在使用 ls -l /var/run/php 列出目录内容。 请尝试 ls -l /var/run/php/php7.0-fpm.sock - oneindelijk
6个回答

77

我遇到了同样的问题。

解决方案非常简单。

在nginx配置文件中,您正在尝试上游连接到

unix:/var/run/php7.0-fpm.sock

正确的路径是

unix:/var/run/php/php7.0-fpm.sock


文档中提到了这一点。

Nginx使用Unix域套接字与PHP-FPM通信。套接字映射到文件系统上的路径,我们的PHP 7安装默认使用一个新路径:

PHP 5 /var/run/php5-fpm.sock

PHP 7 /var/run/php/php7.0-fpm.sock


不错!在我的Debian 8 + php7.2-fpm上运行良好。许多网站不使用此路径,因此它无法正常工作。 - Vincent Decaux
1
检查您的 PHP Socket:ls /var/run/php*/**.sock 并使用此输出。 - Sergio Belevskij
“nginx conf file”是什么?请提供完整的文件路径或正则表达式...它是/etc/nginx/nginx.conf吗? - Peter Krauss
关于 @SergioBelevskij 的 ls,我展示了现代的 /var/run/php/php7.2-fpm.sock... 是否可以使用它来替代指定的内容? - Peter Krauss
两次都救了我!非常感谢! - Oleg Reym

17
在Ubuntu 18.04中,我的问题是它当前使用的是PHP 7.2,但sites-available默认文件的设置为: fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 将该行中的版本更新为7.2而不是7.0,这就为我解决了问题。 fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

12

检查状态:

sudo service php7.0-fpm status

或者

sudo systemctl status php7.0-fpm

如果已经在运行,请尝试

sudo service php7.0-fpm restart

OR
sudo systemctl reload php7.0-fpm

尝试其他

sudo service php7.0-fpm start

OR
sudo systemctl start php7.0-fpm

状态出现了“Active: failed”,原因不明。 我不得不运行sudo service php7.2-fpm start才能启动服务。 是什么导致php服务处于“Active: failed”模式?毫无头绪。 - Wojciech Jakubas
@WojciechJakubas 你可以检查日志,还可以在日志中查看。 - itsazzad
在CentOS 7上,它是 systemctl status php-fpm - Frederick Álvarez

7

请编辑您的/etc/php/7.0/fpm/pool.d/www.conf文件并找到以下行:

listen = 127.0.0.1:9000

请将其注释或替换为以下内容:

listen = /var/run/php7.0-fpm.sock

4

在 /etc/nginx/nginx.conf 中

user nginx;

如果你的网络服务器工作在用户www-data下,需要进行写操作

user www-data;


4

回答您的第一个问题:

为什么当我通过部分名称 php 搜索套接字文件时,ls 能够找到它,而当我列出更多内容如 php7 或者甚至是完整名称 php7.0-fpm.sock 时,就不能找到它了?

因为当您运行 sudo ls -l /var/run/php 时,您正在显示 /var/run/php 目录的内容,但是当您运行 sudo ls -l /var/run/php7sudo ls -l /var/run/php7.0-fpm.sock 时,您要求在其父目录 /var/run 中查找特定文件,但这些文件并不存在。

至于第二个问题,它似乎不是 Ansible 的问题,而是需要考虑上述内容来排除文件位置问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接