标签: php-fpm

Nginx + php5-fpm = "找不到文件"

我在使用 nginx/fpm 设置站点时遇到了麻烦。该页面显示“找不到文件”,这出现在 nginx error.log 中:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
Run Code Online (Sandbox Code Playgroud)

我是 nginx 和 fpm 的新手,该错误消息对我来说毫无意义(即使谷歌机器也没有帮助!)。任何人都可以对可能发生的事情有所了解吗?

nginx php-fpm socket

14
推荐指数
1
解决办法
5万
查看次数

Nginx 缓存符号链接

我的 Web 服务器上有一个部署系统,每次部署应用程序时,它都会创建一个新的带时间戳的目录,并将“当前”符号链接到新目录。这一切在 apache 上都运行良好,但在我设置的新 nginx 服务器上,看起来正在运行来自“旧”部署的脚本而不是新的符号链接脚本。

我已经阅读了一些关于如何解决这个问题的教程和帖子,但没有太多信息,似乎没有任何效果。这是我的 vhost 文件:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).testing.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }

    location ~ \.php$ {
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 fastcgi_params:

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD …
Run Code Online (Sandbox Code Playgroud)

nginx cache php-fpm php7

14
推荐指数
1
解决办法
1万
查看次数

将 apache 从 prefork 切换到 Ubuntu 16 中的事件,让 php 7 正常工作

Apache 在生产中运行缓慢。搜索了一段时间的答案后,我终于去了#apache IRC频道,专业人士让我用这个命令检查apache模式:

sudo apachectl -V
Run Code Online (Sandbox Code Playgroud)

并且惊讶地发现Server MPMprefork。他们强调说不要在生产服务器上使用 PREFORK。事实证明,Ubuntu 软件包(大概是从 Debian 继承的?)坚持在 prefork 模式下运行 apache,尽管推荐的使用 Apache 运行 PHP 的方法明确推荐了 proxy_fcgi 和 php-fpm,然后是 fcgid 并最终说你不应该使用预分叉:

为什么你不应该再将 mod_php 与 prefork mpm 一起使用

  • mod_php 一直加载到每个 httpd 进程中。即使当 httpd 提供静态/非 php 内容时,该内存也在使用中。
  • mod_php 不是线程安全的,并迫使您坚持使用 prefork mpm(多进程,无线程),这是最慢的配置

该页面还包含有关 PHP-FPM 的一些详细信息,但这似乎有点复杂和不清楚,并且似乎涉及很多手动配置。我很失望也很惊讶 Ubuntu 16 没有用于 fastCGI 模式或其他东西的包选项。

我尝试使用 a2enmod将 apache 切换到事件模式,当我尝试启动 apache 备份时,出现错误:

Apache 正在运行线程 MPM,但您的 PHP 模块未编译为线程安全的。你需要重新编译PHP

无论如何,我想知道是否有人有一些最小的分步说明,以通过尽可能依赖软件包安装程序在带有 PHP 7.0 …

php-fpm apache-2.4 php7 ubuntu-16.04 mpm-event

14
推荐指数
2
解决办法
3万
查看次数

PHP-FPM 的 chroot 和 chdir 目录

我正在设置启用 chrooting 的 php-fpm。现在我看到有两种选择,我想知道确切的区别是什么。

设置有:

chroot = /var/www/domains/domain.tld/
; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
chdir = /docroot/
Run Code Online (Sandbox Code Playgroud)

为什么这里有两个不同的位置,以及php允许访问的路径。php网站可以访问/var/www/domains/domain.tld/,还是只能访问docroot目录下的文件。

===

也许对我有一些具体的建议。我想要一个这样的设置:

网络根位置: /var/www/

domain.com/
 |---conf/
 |    |--nginx.conf
 |    |--php-fpm.conf
 |
 |---ssl/
 |---logs/
 |---session/
 |---domains/
       |---www/
       |---app/
       |---dev/
Run Code Online (Sandbox Code Playgroud)

现在这里的 php-fpm 设置将是:

chroot = /var/www/domain.com/
chdir  = /domains/www
Run Code Online (Sandbox Code Playgroud)

现在这里的主要问题是,位于www子域中的应用程序是否能够访问dev或 中的文件app。甚至位于会话中的文件,即会话保存路径,或其他文件夹,例如 ssl 和日志。

chroot php-fpm

13
推荐指数
1
解决办法
2万
查看次数

Nginx 仅在使用 php-fpm 的 php 脚本上抛出 404

我已经使用nginx+安装了一个测试服务器php-fpm。我已经尝试了以下所有方法:

Nginx + Php5-fpm 不渲染 php 文件

nginx + php fpm -> 404 php 页面 - 找不到文件

访问PHP文件时,nginx抛出404错误

总结一下我的尝试:

  • 重新安装。
  • 更改脚本权限(将它们更改为0777)。
  • fastcgi_intercept_errors on.
  • root在以下级别检查指令:server,locationlocation ~ \.php
  • 检查了fastcgi_param SCRIPT_FILENAME指令。

服务器在(并且仅在).php脚本上返回 404 。我可以将它们重命名为.html,它们会很好。我该怎么办?

这是我的nginx.conf

user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log;

pid        /run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" …
Run Code Online (Sandbox Code Playgroud)

nginx php-fpm

13
推荐指数
1
解决办法
5万
查看次数

如何以及在何处使用 Docker 为 php-fpm 配置 pm.max_children?

在使用 Nginx 和 PHP-FPM 的 Web 应用程序中,我注意到缓慢和分析日志的时刻,我发现了这条消息,它不时出现:

[19-Nov-2017 19:24:09] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我增加了 php.ini 配置文件中的值,停止并删除了 php 容器并重建它,因为设置为卷上文件的设置有效。

分析容器内的配置文件,它是我设置的新值,但是,关于 pm.max_children (5) 的错误消息继续出现。

Here is my docker-compose.yml

version: '2'

services:           

    pi_web:
        build: ./nginx
        ports:
            - "80:80"
            - "443:443"

        volumes:
            - ../src:/src
            - ./nginx/conf.d:/etc/nginx/conf.d
            - ./nginx/nginx.conf:/etc/nginx/nginx.conf
            - /etc/letsencrypt:/etc/letsencrypt

    pi_php:
        build: ./php
        volumes:
            - ../src:/src
            - ./php/config/php.ini:/usr/local/etc/php/php.ini
Run Code Online (Sandbox Code Playgroud)

这是 ./php/config/php.ini 的一个片段:

pm = dynamic
pm.max_children = 40
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers …
Run Code Online (Sandbox Code Playgroud)

nginx php-fpm docker docker-compose

13
推荐指数
2
解决办法
1万
查看次数

为什么PHP文件被下载而不是由Nginx处理?

我看到了同样的问题,许多解决方案都指向添加类型处理程序,但那是针对 Apache 的。

我正在使用 Arch Linux、Nginx、PHP 和 PHP-FMP,但我无法弄清楚为什么 php 文件正在下载而不是运行。

这是我的 nginx.conf:

#user http;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / { …
Run Code Online (Sandbox Code Playgroud)

php nginx php-fpm

12
推荐指数
2
解决办法
3万
查看次数

PHP FPM 授予权限被拒绝?

我阅读了几篇关于为什么 PHP-FPM 可能会拒绝我的权限但我无法解决它的条目。

错误日志如下:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"
Run Code Online (Sandbox Code Playgroud)

我有点但迷路了:

  1. 我已将 /var/lib/nginx/tmp 设置为 ec2-user(我什至 +777 需要检查的所有内容)
  2. 我已将 /tmp/php-fpm.sock 设置为 ec2-user
  3. nginx conf 文件设置为 ec2-user
  4. php-conf 设置为用户和组 ec2-user
  5. ps aux 为所有 php-fpm 和 nginx 进程提供 ec2-user

我的 Nginx 配置包括很多文件,基本配置是:

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types; …
Run Code Online (Sandbox Code Playgroud)

nginx php-fpm amazon-ec2

12
推荐指数
2
解决办法
3万
查看次数

php-fpm:日志中的数百秒

我有 nginx+php-fpm 网络服务器

所以我在 php5-fpm.log 中注意到了许多奇怪的行:

[03-Sep-2013 09:25:23] NOTICE: [pool www] child 23999 exited with code 0 after 321.832329 seconds from start
[03-Sep-2013 09:25:23] NOTICE: [pool www] child 24082 started
[03-Sep-2013 09:25:41] NOTICE: [pool www] child 24032 exited with code 0 after 259.247887 seconds from start
[03-Sep-2013 09:25:41] NOTICE: [pool www] child 24083 started
[03-Sep-2013 09:25:47] NOTICE: [pool www] child 24033 exited with code 0 after 255.954602 seconds from start
[03-Sep-2013 09:25:47] NOTICE: [pool www] child 24084 started
[03-Sep-2013 09:25:50] …
Run Code Online (Sandbox Code Playgroud)

php-fpm

12
推荐指数
1
解决办法
2万
查看次数

用另一个文件覆盖 php-fpm 池配置值

必须自定义新服务器的 php-fpm 池配置,我想知道是否可能/允许/建议有一个新的池文件,其名称按字母顺序排列在原始文件之后,该文件仅具有覆盖初始配置的值。

原始配置在/etc/php/7.0/fpm/pool.dnamed 中www.conf

看来,根据安装相关的页面,工程师直接修改原始值(保存初始值的副本)。例如

[www]
...
user www-data
group www-data
pm.max_children 2
Run Code Online (Sandbox Code Playgroud)

修改后给出

[www]
...
user myapp         ; was www-data
group myapp        ; was www-data
pm.max_children 8  ; was 2
Run Code Online (Sandbox Code Playgroud)

但似乎这可能是 php-fpm 下次升级后要重复的任务(而且配置在7.0路径中,这令人担忧)。

而不是修改原始文件,我想保持它不变,并添加另一个,说wwwmyapp.conf将声明相同的池,并且只有已更改的值

wwwmyapp.conf

[www]        ; same pool!
user myapp
group myapp
pm.max_children 8
Run Code Online (Sandbox Code Playgroud)

in pool.d, 文件列表

www.conf
wwwmyapp.conf
Run Code Online (Sandbox Code Playgroud)

因为在php-fpm.conf所有池 conf 文件中都加载了, 的值wwwmyapp将在www(在同一个www池中)之后读取,并且应该覆盖第一个值。

  • 它似乎在一些测试中工作并且没有报告错误,但是它会一直工作吗,并且适用于所有值?
  • 我们应该直接覆盖配置文件吗?

无法在任何文档中找到答案,即使在 php.net 上也是如此。

configuration php-fpm pool

12
推荐指数
1
解决办法
7868
查看次数