标签: php

如何在短时间内自动和临时阻止在服务器上造成过多点击的 IP 地址?

我的一个 LAMP 服务器最近被某种寻找漏洞利用的脚本机器人关闭了。从它的外观来看,它每秒发出如此多的请求,它使服务器上的 RAM 过载并使我的整个站点停机一个小时。那个“攻击”都来自一个单一的 IP 地址。

那么如何在短时间内自动暂时阻止一个 IP 地址在我的 LAMP 服务器上造成过多点击?什么是这项工作的最佳工具,我应该在操作系统级别还是通过 PHP 解决这个问题?

scripting linux php lamp ip-blocking

22
推荐指数
2
解决办法
5万
查看次数

如何使用 yum 在 CentOS 中升级到最新的 PHP 版本?

我发现了一些关于这个的博客文章,但它相当缺乏对可能的副作用的描述。

我真的可以在这些步骤中使用一些详细信息:

  1. 如何将提供 PHP 5.4 的 repo 添加到 yum
  2. 这可以无缝替换 CentOS 中当前的 PHP 版本吗?
  3. 当它支持 PHP 5.4 时,如何切换回官方存储库?(我系统中的当前 5.3.3)
  4. 是否有可能破坏我目前使用的 PHP 模块?

笔记

人们在较新版本上使用相同的方法成功升级,并建议删除问题中的特定版本。虽然最好确定版本以防新版本确实破坏某些内容,但我希望保留社区建议的最新成功版本作为注释。

如果您已在其他版本上成功升级,请随时更新。

  • PHP 版本:5.4、5.5、5.6
  • CentOS 版本:5、6

linux php centos yum centos6

22
推荐指数
2
解决办法
6万
查看次数

php mail() 函数在本地开发机器上非常缓慢

背景:如果您为开发目的设置了本地 apache 服务器,您可能会遇到 sendmail 发送电子邮件需要很长时间(至少一分钟)的问题。如果您试图调试已生成的电子邮件的问题,这将非常令人沮丧。

互联网上有几个论坛帖子讨论了这个问题。但是,对于我有限的知识,没有一个主题足够详细地描述要做什么。以下是对我有用的步骤:

1) 使用以下命令找到您的主机名(以防您忘记了):

:~$ cat /hosts/hostname

myhostname

2)编辑文件/etc/hosts并确保第一行如下:

127.0.0.1 localhost.localdomain localhost myhostname

3)编辑sendmail配置文件(/etc/mail/sendmail.cf在Ubuntu中)并取消注释该行#O HostsFile=/etc/hosts

4) 重新启动计算机。计算机现在应该启动得更快,并且 mail() 函数应该几乎立即返回。但是,除非您按照第 5 步操作,否则实际上不会发送电子邮件。

5) 无论何时使用邮件功能,您都必须重新使用 sendmail '-f' 选项。例如:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

我对我的服务器故障者的问题是:

可以进行哪些进一步更改,以便我不必使用 sendmail -f 选项?虽然添加 -f 选项不是很难,但是当你的 CMS(比如 Drupal)在发送邮件时没有使用 -f 选项时就会出现问题。你需要破解一个核心模块来添加这个选项。

email php sendmail

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

php脚本无法访问/tmp文件夹

我没有 open_basedir,php 可以访问 /etc /usr /proc /home 等......但不能访问 /tmp。

tmpfs 安装在 /tmp (/tmp type tmpfs (rw)) 这也是我想使用 /tmp 文件夹的原因。

我的文件归 http(nginx 和 php 的用户)所有,每个人都可以阅读。

sudo -u http cat /tmp/file 正在运行,但 php 脚本中的任何内容都不起作用(如 file_exist() 或 file())。

编辑:日志中显示的错误:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267
Run Code Online (Sandbox Code Playgroud)

编辑2:我以另一种方式测试了这个问题。我做了

touch("/tmp/boo");
file_exist("/tmp/boo");
Run Code Online (Sandbox Code Playgroud)

和 file_exist 返回 true 以便创建文件。然后我在 /tmp 里面看了看,在那里找不到“boo”文件。这就是我所害怕的,php 看不到挂载点。为什么会这样,我该如何解决?

php tmp tmpfs file-permissions centos7

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

运行 FastCGI/PHP-FPM(作为用户“nobody”)时,在 PHP Sessions 文件夹上设置什么权限/所有权?

我在运行多个脚本时遇到问题,因为 PHP-FPM 无法写入我的会话文件夹:

"2009/10/01 23:54:07 [error] 17830#0: *24 FastCGI 在 stderr 中发送:"PHP 警告:
    未知:打开(/var/lib/php/session/sess_cskfq4godj4ka2a637i5lq41o5,O_RDWR)
    失败:第 0 行未知中的权限被拒绝 (13)
PHP 警告:未知:无法写入会话数据(文件)。请验证
    session.save_path 的当前设置是正确的
    (/var/lib/php/session) 在第 0 行的 Unknown 中“同时读取上游”

显然这是一个许可问题;我的会话文件夹的所有者/组是网络服务器的用户 NGINX。PHP-FPM 就像运行一样nobody,因此将它添加到 nginx 组并不是那么简单。

一个临时的解决办法是设置的权限/var/lib/php/session777-我有一种感觉,这不是“最佳实践”虽然。

当您需要为文件夹分配守护程序写入权限但它作为 运行时,最佳实践是nobody什么?

security linux php centos

19
推荐指数
3
解决办法
8万
查看次数

无法通过 pecl install APC 安装 APC

当我尝试通过以下方式安装 APC 时,pecl install APC-3.1.5 甚至pecl install APC当包执行make命令时出现以下错误:

running: make
/bin/sh /var/tmp/pear-build-root/APC-3.1.5/libtool --mode=compile cc  -I. -I/var/tmp/APC -DPHP_ATOM_INC -I/var/tmp/pear-build-root/APC-3.1.5/include -I/var/tmp/pear-build-root/APC-3.1.5/main -I/var/tmp/APC -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /var/tmp/APC/apc.c -o apc.lo
mkdir .libs
 cc -I. -I/var/tmp/APC -DPHP_ATOM_INC -I/var/tmp/pear-build-root/APC-3.1.5/include -I/var/tmp/pear-build-root/APC-3.1.5/main -I/var/tmp/APC -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /var/tmp/APC/apc.c  -fPIC -DPIC -o .libs/apc.o
In file included from /var/tmp/APC/apc.c:44:
/usr/include/php/ext/pcre/php_pcre.h:29:18: error: pcre.h: No such file or directory
In file included from /var/tmp/APC/apc.c:44: …
Run Code Online (Sandbox Code Playgroud)

php centos centos5

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

如何确定基于 Apache/PHP 的 Web 应用程序中明显内存泄漏的原因?

大约每周一次,但有时甚至一天几次在正常运行几天后,我的 EC2 实例变得无响应。Munin 的内存图讲述了一个非常简单的故事:分配给“应用程序”的内存开始增长并且不会停止,直到交换完全使用并且实例有效地降低到膝盖为止。另一个自定义图显示不断增长的进程​​是apache2。

我使用 mod_php 和一些 PHP 脚本运行标准的 prefork Apache 设置。正如您在下图中所看到的,发生一些事情会触发 apache2 进程开始消耗越来越多的内存。我及时发现了第一个绿色尖峰,并在事情失控之前重新启动了 Apache。第二个峰值变得更远了,实例必须彻底重启。

穆宁记忆图

我想知道的是如何最好地调试它。除了使用 FastCGI 设置 PHP 并让它在自己的进程中运行之外,有什么好方法可以找出是 Apache 还是 PHP 和我的代码的组合导致内存使用过多?你们会采取什么步骤来追踪这个问题?


更新:正如马特在下面建议的那样,在涉及 strace 后,我能够追踪泄漏。

在找到内存中逐渐且持续增长的 apache2 进程后,我向我的 PHP 脚本添加了更多的 error_log() 调用,以打印出在其执行过程中各个点使用的 RSS 总量(使用 ps 的输出)。然而,结果证明这是一种误导——虽然 RSS 似乎只有在我的脚本执行完毕后才会跳转,但后来的调试表明情况并非如此。当心!

幸运的是,所有这些 error_log() 调用最终都证明是有用的。当我启动 strace ( strace -p <pid> -tt -o trace.log -s 256) 时,我看到对于每个请求,进程分配了大约 400k 的内存(查找 'brk' 系统调用并从最后一个调用的参数中减去第一个调用的参数——一些通常是一个之后)。然后,我搜索了包含我的 error_log() 消息的最新“写入”系统调用,它告诉我在脚本中的哪个点分配了内存。通过一些更具策略性的 error_log() 调用来更准确地查明位置,我终于找到了罪魁祸首。

当我们从 PHP 脚本调用 curl_exec() 时,内存正在泄漏。一些与处理 SSL 连接相关的 curl 代码做错了——当我切换到 HTTP 时,泄漏就消失了。Curl 的更新日志引用了一些在 7.19.5 中修复的 SSL 内存泄漏(我们在 …

php memory apache-2.2

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

如何在 Ubuntu 上为 PHP 安装/启用 GMP(数学函数)?

当调用一个 gmp 数学函数时gmp_mod,我得到:

Fatal error: Call to undefined function gmp_mod()
Run Code Online (Sandbox Code Playgroud)

我已经安装了php5-gmp软件包并重新启动了网络服务器,但该功能仍未定义。服务器运行 Ubuntu 10.04,PHP 作为 Apache 模块运行。所有软件都是从官方软件包安装的。

如何在 PHP 中启用 GMP 数学函数?我正在寻找一种使用官方软件包的解决方案,而不是从源代码编译。

ubuntu php packages apache-2.2

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

如何为 Homebrew 安装的 PHP 添加 Postgres 支持?

我已经使用 Homebrew 安装并配置了新版本的 PHP,包括 MySQL 支持和 XDebug。这很好用。但是,我还需要安装对 PostgreSQL 的支持。我该怎么做?

我发现第一次安装 PHP 时很容易,只需添加选项:

homebrew install php53 --with-pgsql
Run Code Online (Sandbox Code Playgroud)

当我的 PHP 已经安装时,如何在不完全重新安装的情况下实现类似的功能?或者,如果我重新安装,是否会保留所有配置和其他设置(例如 XDebug)?

php mac-osx

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

nginx / php-fpm 错误日志

我试图找出 PHP 错误在我的设置中的位置。我正在运行 nginx 作为 PHP-FPM 的反向代理,但我没有看到我的应用程序生成的各种E_NOTICEE_WARNING消息。我知道它们正在发生的唯一原因是响应失败和 NewRelic 捕获堆栈跟踪。

这是日志配置:

配置文件

proxy_intercept_errors on;
fastcgi_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)

配置文件

error_reporting  =  E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = On
error_log = syslog
Run Code Online (Sandbox Code Playgroud)

php-fpm.conf

[global]
error_log = /var/log/php-fpm/fpm-error.log

[www]
access.log = /var/log/php-fpm/access.log
access.format = "%t \"%m %r%Q%q\" %s %{mili}dms %{kilo}Mkb %C%%"
catch_workers_output = yes

php_flag[display_errors] = on
php_admin_flag[log_errors] = true
Run Code Online (Sandbox Code Playgroud)

配置文件

:syslogtag, contains, …
Run Code Online (Sandbox Code Playgroud)

php logging php5 php-fpm

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