NGINX:connect() 到 unix:/var/run/php7.0-fpm.sock 失败(2:没有这样的文件或目录)
Posted
技术标签:
【中文标题】NGINX:connect() 到 unix:/var/run/php7.0-fpm.sock 失败(2:没有这样的文件或目录)【英文标题】:NGINX: connect() to unix:/var/run/php7.0-fpm.sock failed (2: No such file or directory) 【发布时间】:2017-02-24 20:45:07 【问题描述】:我正在尝试关注this Ansible tutorial,同时使用 php7 为 Ubuntu 16.04 调整它。在此消息下方,您会找到我的 Ansible 文件。运行它并尝试在浏览器中访问该页面后,我得到一个 404,并在 nginx 错误日志中显示以下内容:
2016/10/15 13:13:20 [暴击] 28771#28771: *7 connect() to unix:/var/run/php7.0-fpm.sock 失败(2:没有这样的文件或目录) 连接上游时,客户端:93.xxx.xxx.xx,服务器: 95.xx.xx.xx,请求:“GET / HTTP/1.1”,上游:“fastcgi://unix:/var/run/php7.0-fpm.sock:”,主机:“95.xx.xx .xx"
所以我检查了socket文件是否存在,它似乎存在,但是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
为什么ls
通过部分名称php
搜索可以找到套接字文件,而当我列出更多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
【参考方案1】:
遇到了同样的问题。 解决方法很简单。
在 nginx conf 文件中,您正在尝试上游
unix:/var/run/php7.0-fpm.sock
正确的路径是
unix:/var/run/php/php7.0-fpm.sock
documentation 中提到了这一点
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 上为我工作。很多网站不使用这条路径,它也不起作用。 检查你的 php 套接字:ls /var/run/php*/**.sock
并使用这个输出
什么是“nginx 配置文件”?请为其填写完整的路径文件名或正则表达式...它是/etc/nginx/nginx.conf
?
关于@SergioBelevskij ls
,我正在展示现代风格/var/run/php/php7.2-fpm.sock
...用它代替indecated?
两次救了我!非常感谢!【参考方案2】:
在 Ubuntu 18.04 中,我的问题是它当前使用的是 PHP 7.2,但站点可用的默认文件有:
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
更新该行的版本,使其成为 7.2 而不是 7.0 为我解决了这个问题。
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
【讨论】:
【参考方案3】:检查状态:
sudo service php7.0-fpm status
或
sudo systemctl status php7.0-fpm
如果已经运行则尝试
sudo service php7.0-fpm restart
或
sudo systemctl reload php7.0-fpm
其他尝试
sudo service php7.0-fpm start
或
sudo systemctl start php7.0-fpm
【讨论】:
状态出于某种原因给了我Active: failed
。我必须运行sudo service php7.2-fpm start
才能启动服务。什么可以将 php 服务置于 Active: failed 模式?没有线索。
@WojciechJakubas 你可以查看日志,也可以查看日志
在centos7上是systemctl status php-fpm
【参考方案4】:
编辑您的 /etc/php/7.0/fpm/pool.d/www.conf 文件并找到以下行:
listen = 127.0.0.1:9000
并将其注释掉或替换为以下内容:
listen = /var/run/php7.0-fpm.sock
【讨论】:
【参考方案5】:回答你的第一个问题:
为什么
ls
通过部分名称php
搜索可以找到套接字文件,而当我列出更多php7
甚至全名php7.0-fpm.sock
时找不到套接字文件?
因为当您运行sudo ls -l /var/run/php
时,您正在显示/var/run/php
目录的内容,但是当您运行sudo ls -l /var/run/php7
或sudo ls -l /var/run/php7.0-fpm.sock
时,您要求其父目录/var/run
中不存在的特定文件。
至于第二个问题,貌似不是Ansible的问题,但是考虑到上述情况,需要排查文件放置问题。
【讨论】:
【参考方案6】:在 /etc/nginx/nginx.conf 中
用户 nginx;
如果你的网络服务器工作在用户 www-data 需要写
用户 www-data;
【讨论】:
以上是关于NGINX:connect() 到 unix:/var/run/php7.0-fpm.sock 失败(2:没有这样的文件或目录)的主要内容,如果未能解决你的问题,请参考以下文章
Nginx + Docker Compose-连接到上游时connect()失败(111:连接被拒绝)
AWS弹性Beanstalk / nginx:connect()失败(111:连接被拒绝
502 错误 django + nginx + gunicorn - connect() recv()
nginx 报错 connect() failed (111: Connection refused) while connecting to upstream