我需要在 Ubuntu 16.0.4 上将其中一台 VM 上的 PHP 从 7.2 降级到 7.1。上次我尝试仅删除 PHP 并用不同版本替换它时,我遇到了 Apache 和 MySQL 的各种问题。是否有一种快速的方法可以将 PHP 从 7.2 降级到 7.1,而无需完全重新安装和配置 Apache(撰写本文时的最新版本)以及服务器上的其他所有内容?
由于我从声称他们的应用程序在 PHP 7.2 上运行的软件供应商那里收到的错误信息,我不得不降级。原来它必须有7.1。
我尝试寻找有关如何从 7.2 降级到 7.1 的信息,但只能获得“升级”结果。
感谢您的帮助。
我正在使用 PHP7.0 运行 LEMP。
我的服务器块中有这个
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Run Code Online (Sandbox Code Playgroud)
但是当我打开网站时,它返回一个 502 Bad Gateway。下面是错误日志。
*1 connect() to unix:/var/run/php/php7.0-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: example.com, request: "GET / HTTP1.1", upstream: "fsatcgi://unix:/var/run/php/php7.0-fpm.sock:", host: "example.com"
Run Code Online (Sandbox Code Playgroud)
它说Permission Denied。这里有什么问题?我已经检查过,但我似乎无法找到需要给予什么样的许可。
谢谢你。
我的 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 …
这与这些问题基本相同:
但是那里的答案似乎不适用于带有 PHP 7 的 Ubuntu 16.04。
/etc/php/7.0/fpm/pool.d/www.conf:
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
Run Code Online (Sandbox Code Playgroud)
/var/log/fpm-php.www.log存在并归www-data.
/etc/php/7.0/fpm/php.ini:
log_errors = On
Run Code Online (Sandbox Code Playgroud)
Nginx 虚拟主机的服务器块
access_log /var/log/myapp/access.log;
error_log /var/log/myapp/error.log error;
Run Code Online (Sandbox Code Playgroud)
/var/log/myapp/access.log 存在并归www-data.
但是当发生错误时,我在任何指定的日志文件中都没有收到错误,并且在任何其他地方也找不到它。
我浏览了关于另一个问题的所有建议,但没有找到任何有效的答案。我假设自从这些答案发布以来,情况已经发生了变化。有什么建议?
我的网络服务器上的 opcache 一直达到我设置的限制,即使我觉得我没有那么多 PHP 代码,它真的应该有足够的空间。
更糟糕的是,即使在清除 opcache 时,它也会立即显示超过 2/3 的可用空间已被填充。
刚才的例子:
运行 opcache_reset() 之前的 phpinfo 片段:
Used memory 122958472
Free memory 5552
Run Code Online (Sandbox Code Playgroud)
运行 opcache_reset() 后的 phpinfo 片段:
Used memory 90691312
Free memory 43526416
Run Code Online (Sandbox Code Playgroud)
我知道在 PHP7 中,opcache(显然)备份到磁盘,所以也许东西正在自动重新加载?但这似乎违背了重置 opcache 的目的,我不知道 opcache 备份到磁盘上的哪个位置,所以我无法检查。
我正在 nginx 上运行 PHP-FPM,准确地说是 vesion 7.0.15-0ubuntu0.16.04.4。
我做了一些调查,发现这个可以计算和调整pm.max_children值
https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/
但例如:
如果我应用这个:
pm.max_children = 专用于 Web 服务器的总 RAM / 最大子进程大小
所以在我的情况下:
pm.max_children = 5120 / 80 = 64
但是如果我在每个 php-fpm 网站 conf 文件上添加pm.max_children = 64,这意味着每个网站都可以使用64个子进程X 1 个进程的大小(例如40mb)= 2560Mb
如果我们想象,同时所有 30 个网站都达到了 pm.max_children 值,我们将有:2560Mb(每个网站的最大值)x 30 个网站 = 76 800 Mb
我对么?
Si 是的,这意味着当许多网站托管在同一台服务器上时,我们必须将计算结果pm.max_children = 5120 / 80 = …
我已将 php 升级到第 7 版,现在我在使用 pecl 命令时遇到了问题。当我运行时,sudo pecl install mongo我得到一长串错误:
Warning: Invalid argument supplied for foreach() in Command.php on line 249
Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249
Warning: Invalid argument supplied for foreach() in Command.php on line 249
Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249
Warning: Invalid argument supplied for foreach() in Command.php on line 249
Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个问题的解决方案:PECL …
经过一些研究,我找不到答案:如何将Apache/httpd更新到最新版本以在我的 VPS 上使用 HTTP/2 协议。我正在使用 PHP7 和基于 Apache - CentOS 7 的服务器。
CentOS 默认存储库上没有软件包更新。
[root@vps270238 ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 19 2015 21:43:13
Run Code Online (Sandbox Code Playgroud)
我真的想保留我的实际设置和虚拟主机。
我想在 php.ini 中启用 sqlite3 但是当我尝试加载 PHP 脚本时会发生此错误:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/sqlite.so' - /usr/lib/php/20151012/sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/pdo_sqlite.so' - /usr/lib/php/20151012/pdo_sqlite.so: undefined symbol: php_pdo_unregister_driver in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)
但是这个路径中的库是存在的
/usr/lib/php/20151012/sqlite.so
Run Code Online (Sandbox Code Playgroud)
在我的 php.ini 中只更改这一行
extension=pdo_sqlite.so
Run Code Online (Sandbox Code Playgroud)
我的操作系统是:Debian GNU/Linux 9.4 (stretch)