标签: php

如何让 Nginx 将对不存在的文件的所有请求重定向到单个 php 文件?

我有以下 nginx vhost 配置:

server {
    listen 80 default_server;

    access_log /path/to/site/dir/logs/access.log;
    error_log /path/to/site/dir/logs/error.log;

    root /path/to/site/dir/webroot;
    index index.php index.html;

    try_files $uri /index.php;

    location ~ \.php$ {
            if (!-f $request_filename) {
                    return 404;
            }

            fastcgi_pass localhost:9000;
            fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
            include /path/to/nginx/conf/fastcgi_params;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想重定向所有与 index.php 存在的文件不匹配的请求。这适用于目前大多数 URI,例如:

example.com/asd
example.com/asd/123/1.txt
Run Code Online (Sandbox Code Playgroud)

无论是中asd或asd/123/1.txt存在,所以他们重定向到的index.php和工作正常。但是,如果我输入 url example.com/asd.php,它会尝试查找asd.php,当找不到时,它会返回 404 而不是将请求发送到index.php。

有没有得到一个方式asd.php进行也发送到index.php如果asd.php不存在?

php nginx redirect php-fpm

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

网络服务器:chrooted PHP 在尝试访问 mysql 时出现 mysql.sock 错误

我已经用 Nginx + PHP5-FPM 配置了一个 Ubuntu 网络服务器。我创建了一个 chrooted 环境(使用 jailkit),我将我的开发人员投入其中,他们可以从那里开发他们的测试应用程序。

Chroot 监狱:/home/jail

Nginx 和 PHP5-FPM 在 chroot 之外运行,但被配置为在 chroot 环境中与网站一起运行。

到目前为止,Nginx 和 PHP5-FPM 提供文件没有问题,除了以下问题: 尝试连接到 MySQL 时,我们收到此错误:SQLSTATE[HY000] [2002] 无法通过套接字连接到本地 MySQL 服务器 ' /var/run/mysqld/mysqld.sock'

现在,我认为问题是由于非 chroot 的 php.ini 引用了 chroot 环境之外的 mysqld.sock(它目前实际上使用的是 MySQL 默认设置)。

我的问题是,如何配置 PHP 以通过环回或类似方式访问 MySQL?(在谷歌结果中发现这是一个建议,但没有任何说明)

或者,如果我遗漏了一些其他明显的设置,请告诉我。如果可以选择创建硬链接(即使重新启动 mysql 也将保持可用),那也会很方便。

mysql linux ubuntu php chroot

8
推荐指数
1
解决办法
8508
查看次数

如何防止 Apache 摔倒?

我有一对服务器托管一个流量适中的 Magento 电子商务网站(谷歌分析报告每天 60k 页面浏览量,我认为服务器本身报告了大约 80k)。数据库服务器运行平稳快速,除了偶尔偶尔打嗝外,但 apache 服务器经常发生故障。

我已将 magento 设置为使用推荐的 PHP 缓存 (APC),并将其自己的缓存文件保存在 1.5 gig tmpfs 中(此 tmpfs 经常变得非常满,我有一个脚本运行以在 tmpfs 为超过 80% 已满)。我提供来自亚马逊云前沿的大多数图像。我最近将 nginx 设置为 apache 的反向代理(nginx 也提供静态文件)。我已经尽我所能配置了 apache - keepalives 和 hostnamelookups 都关闭了,prefork 配置如下:

<IfModule prefork.c>
    StartServers      50
    MinSpareServers   50
    MaxSpareServers  100
    ServerLimit  512
    MaxClients   256
    MaxRequestsPerChild 400
</IfModule>
Run Code Online (Sandbox Code Playgroud)

我没有关闭 .htaccess 文件,并且访问日志是打开的。我知道有些模块我可以关闭。我不确定这三个变化中的任何一个会产生什么影响,如果有的话。

apache 服务器是一个 VPS,有 6 gig 的 RAM。截至撰写本文时,服务器正在报告load average: 17.77, 18.27, 49.76,但大约有 2 gig 的可用 RAM。当它变得非常糟糕时,负载会增加到 120+ 并保持在那里 - 重新启动 apache 会使站点重新启动并重新降低负载。

vmstat是(当服务器报告上面的负载时),我认为,显示 CPU …

php performance nginx magento apache-2.2

8
推荐指数
1
解决办法
3173
查看次数

IIS 7.5/W2K8 上的 PHP 使用 IUSR 帐户而不是 IIS_APPPOOL\DefaultAppPool

我正在设置一个新的 Web 服务器并尝试使用 Windows Server 2008 R2 中可用的新应用程序池标识(如下所述:http : //learn.iis.net/page.aspx/624/application-pool-identities/ ) 以保护文件夹结构。

但是,即使我在 php.ini 中将 FastCGI 模拟设置为 true,PHP 似乎仍在使用本地 IUSR 帐户 - 如何让 PHP 在应用程序池标识下运行?

有问题的文件夹是 c:\inetpub\wwwroot 之外的共享缓存目录。当我授予 IIS_APPPOOL\DefaultAppPool 修改权限时,PHP 文件无法访问该文件夹,但当我授予 SERVERNAME\IUSR(或用户组)权限时,它们可以访问。

PHP 5.3 是使用 IIS 中的 Web 平台安装程序安装的。

PHP 应用程序正在使用 Zend_Cache,如果这有所不同的话。

iis php application-pools iusr

7
推荐指数
1
解决办法
3555
查看次数

phpMyAdmin 在 RHEL 6 上的 nginx 和 php-fpm 上有问题

我们在Red Hat Linux 6 (RHEL)上使用 nginx 和 php-fpm 设置了 Web 服务器。这台机器已经安装了 WordPress,并且运行良好。我们已将 WordPress 设置为转到wptest.domain.local。然后,我们在启用了站点的名为servername.domain.local 的站点中创建了一个新站点,我们希望在其中托管各种工具。

PHP 始终运行良好,我们对 WordPress 没有任何问题。但是当尝试访问 phpMyAdmin 时,我们收到此错误:

2012/09/14 16:22:13 [error] 10065#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.15, server: servername, request: "GET /phpmyadmin/setup/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "servername"

这是我们网站的配置:

    server_name servername severname.domain.local;
    access_log /srv/www/severname/logs/access.log;
    error_log /srv/www/severname/logs/error.log;
    root /srv/www/severname/public_html;

    地点 / {
        index index.html index.htm index.php;
        try_files $uri $uri//index.php?q=$uri&$args;
    }

    位置 = /favicon.ico …

php nginx php-fpm

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

Php pdo_dblib - 找不到/无法加载 freetds

自托管盒子,
RHEL 6
PHP 5.3.3

PDO 安装了
freetds 安装了
pdo_dblib - 到目前为止没有运气安装

我的目标是在 sybase 中使用 PDO。试图从适当版本的 php 源代码安装 pdo_dblib。我尝试了多种方法并搜索了很多有关此主题的帮助,但尚未成功。

方法一

安装 freetds

$ ./configure
$ make
$ su root
Password: 
$ make install
Run Code Online (Sandbox Code Playgroud)

这是成功的

安装 pdo_dblib

在 /ext/pdo_dblib 文件夹中:

$ phpize
$ ./configure
$ make
$ make test
Run Code Online (Sandbox Code Playgroud)

错误输出:

PHP Warning:  PHP Startup: Unable to load dynamic library '/home/sybase/Install_items/php_533_src/php-5.3.3/ext/pdo_dblib/modules/pdo_dblib.so' - /home/sybase/Install_items/php_533_src/php-5.3.3/ext/pdo_dblib/modules/pdo_dblib.so: undefined symbol: php_pdo_register_driver in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/home/sybase/Install_items/php_533_src/php-5.3.3/ext/pdo_dblib/modules/pdo_dblib.so' - /home/sybase/Install_items/php_533_src/php-5.3.3/ext/pdo_dblib/modules/pdo_dblib.so: …
Run Code Online (Sandbox Code Playgroud)

php sybase pdo freetds rhel6

7
推荐指数
1
解决办法
7241
查看次数

更改 php 错误报告以仅隐藏特定站点的警告 [Debian|Ubuntu]

想象一下sites-enabled从/etc/apache2/sites-available. (只有基于 Debian 的发行版才能像这样工作。)

是否可以将warning来自特定站点的php 脚本的消息静音,而不触及实际htdocs?

通常有几个解决方案来实现一些相关的:

  1. 向执行的脚本添加一个error_reporting()指令,例如error_reporting(E_ERROR);。
  2. 在.htaccess文件中设置 php_flags,如下所示:php_flag display_errors off
  3. 使用ini_set内部脚本:

    ini_set('display_errors', 'Off');
    ini_set('display_startup_errors', 'Off');
    error_reporting(0);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 前置@到抛出警告或错误的函数。

  5. 更改php.ini到实说
    error_reporting = E_ALL ^ E_WARNING
    display_errors = 1

然而,这些都意味着接触 htdocs 或全局应用更改。想象一下,htdocs它们以只读方式安装。我将如何仅抑制某些站点的警告(或通知)?

我假设 Debian/Ubuntu 有a2ensite特定的配置是有原因的,我希望我可以改变这些。log_level示例“可用站点”配置中有一个指令,但它处理记录的消息量。不是 php 脚本输出的消息。

在php.iniorapache2.conf或 中手动添加部分httpd.conf也可以。如果可能的话。

也可以看看:

ubuntu php apache-2.2

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

我可以在 mod_php 中使用 worker MPM 吗?

阅读此答案后,我决定将服务器上 httpd 的 MPM 更改为 worker。但是在编辑时/etc/sysconfig/httpd,我注意到了这条评论:

# The default processing model (MPM) is the process-based
# 'prefork' model.  A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
#HTTPD=/usr/sbin/httpd.worker
Run Code Online (Sandbox Code Playgroud)

我可能解释错了,但它不是告诉我工人不能使用 mod_php 吗?因为这是我目前正在使用的。

服务器运行 CentOS 6.4 和 Apache 2.2。

php centos centos6 apache-2.2

7
推荐指数
1
解决办法
5034
查看次数

Apache 2.4 不关闭连接

我有一个运行在带有 CentOS 的 AWS 微型实例上的Apache 2.4网络服务器。
apache 正在运行带有 prefork MPM 模块的 PHP。
服务器通过 Amazon 负载均衡器访问,该负载均衡器具有健康检查功能,每 60 秒尝试访问服务器的 index.php 网页。

问题是在 1-2 天后,Apache 以某种方式使用 index.php 页面达到了 256 个打开的进程并给出以下错误:

[Sun Sep 08 02:13:00.356051 2013] [mpm_prefork:error] [pid 1201] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Sun Sep 08 02:13:13.656694 2013] [mpm_prefork:error] [pid 1201] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
Run Code Online (Sandbox Code Playgroud)

通常发生这种情况时,不再接受新的 http 连接。

Apache 可能不会关闭负载均衡器的所有连接。
我们有另一台使用 Apache 2.2 的服务器,它没有这个问题,所以问题可能出在 2.4 版本上,它与 2.2 有很大不同(我们没有更改 Apache 的任何默认配置)。 …

php mpm-prefork amazon-web-services apache-2.4

7
推荐指数
1
解决办法
6155
查看次数

如何以特定用户而不是任何人的身份运行 HTTPD?

目前,top向我展示了几乎所有httpd进程都由nobody. “几乎”,因为其中 2 个由root.

如果我有用户说:dartagnan, porthos, aramis,athos作为上述用户分别运行 httpd ,我如何才能做到这一点?

我希望在我跑步时看到这样的事情top:

PID 用户命令
第1234回
12 端口 /usr/local/apache/bin/httpd -k start -DSSL
342 aramis /usr/local/apache/bin/httpd -k 开始 -DSSL
214 athos /usr/local/apache/bin/httpd -k start -DSSL 

============>这是我目前有什么我DONT喜欢看:

PID 用户命令
第1234回
12 没有人 /usr/local/apache/bin/httpd -k 开始 -DSSL
第342话
第214回 
244 root /usr/local/apache/bin/httpd -k start -DSSL 
334 root /usr/local/apache/bin/httpd -k start -DSSL 

linux php redhat httpd apache-2.2

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