我在使用 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 的新手,该错误消息对我来说毫无意义(即使谷歌机器也没有帮助!)。任何人都可以对可能发生的事情有所了解吗?
我的 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) Apache 在生产中运行缓慢。搜索了一段时间的答案后,我终于去了#apache IRC频道,专业人士让我用这个命令检查apache模式:
sudo apachectl -V
Run Code Online (Sandbox Code Playgroud)
并且惊讶地发现Server MPM是prefork。他们强调说不要在生产服务器上使用 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 …
我正在设置启用 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 和日志。
我已经使用nginx+安装了一个测试服务器php-fpm。我已经尝试了以下所有方法:
nginx + php fpm -> 404 php 页面 - 找不到文件
总结一下我的尝试:
0777)。fastcgi_intercept_errors on.root在以下级别检查指令:server,location和location ~ \.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 的 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) 我看到了同样的问题,许多解决方案都指向添加类型处理程序,但那是针对 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-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)
我有点但迷路了:
我的 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 网络服务器
所以我在 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 池配置,我想知道是否可能/允许/建议有一个新的池文件,其名称按字母顺序排列在原始文件之后,该文件仅具有覆盖初始配置的值。
原始配置在/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 上也是如此。
php-fpm ×10
nginx ×6
php7 ×2
amazon-ec2 ×1
apache-2.4 ×1
cache ×1
chroot ×1
docker ×1
mpm-event ×1
php ×1
pool ×1
socket ×1
ubuntu-16.04 ×1