我正在设计一个新的服务器设置来托管多个网站。(在SliceHost 上为我的客户共享主机。)我最近摆脱了传统的 LAMP 设置并选择了 Ubuntu、Nginx、php-fpm和 mysql。
我比我的旧 Apache、suphp、mysql 设置更喜欢它。它工作得很好,提供了站点之间的封装并且使用的内存显着减少。但是,我有一个主要的维护问题。为了拥有最新版本的 Nginx 并为了使用 php-fpm,我不得不从源代码编译这些程序。
我认为这是一个问题的原因是跟踪更新和构建配置最终将成为大量工作。对于两个程序(和一个补丁),我可以处理它,但是这个设置似乎无法扩展到许多包和服务器。有没有好的方法来管理这种情况?我相信人们一直都在这样做。
我最近购买了带有 Debian 5.0 Lenny (i386), 512MB RAM 的Xen VPS (linode.com) 。目前我只有三个小网站(用 Drupal 构建),每天大约有 600 个用户在这台服务器上运行。
作为 Web 服务器,我使用nginx 0.7.67(带有php-fpm 的PHP 5.3.3)。平均内存消耗约为100-105MB。这是穆宁图显示的内容:

这就是“top”命令显示的内容(按内存使用情况排序):

在我的 php5-fpm.conf 中:
pm = dynamic
pm.max_children = 50
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
Run Code Online (Sandbox Code Playgroud)
在将一些更大的项目迁移到这个 VPS 之前,我想知道这是否是这种服务器配置的正常内存消耗?这个 VPS 可以处理网站上的多少用户(比方说,用 Zend Framework 构建)?
谢谢!
我的服务器有 512 MB 内存。nginx.conf 设置是
user www-data;
worker_processes 2;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
#tcp_nopush on;
#tcp_nodelay on;
keepalive_timeout 3;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k; …Run Code Online (Sandbox Code Playgroud) 又一个重定向循环,是的。
看过其他问题,但似乎无法让它发挥作用。
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /srv/http/localhost/log/access.log;
error_log /srv/http/localhost/log/error.log;
location / {
root /srv/http/localhost/www;
index index.html index.php;
}
# prevent access to hidden files
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
# do not log assets
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}
# pass the PHP scripts to PHP-FPM socket
location ~* \.php$ {
try_files $uri /index.php;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
include fastcgi_params;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我server{}的主要主机的完整块,结果是: …
我试图添加$PATH为所有用户,包括网络服务器的用户(即,WWW的数据)用不同的方法,例如编辑/etc/profile,/etc/environment等。在所有的情况下,它工作在终端,但不与内壳PHP命令。
例如echo $PATH在终端中显示可用路径,包括我添加的路径;但是,shell_exec('echo $PATH')在 PHP 中显示了没有我添加的路径的原始路径:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
如何全局设置 $PATH 以供网络服务器用户使用?我在 Ubuntu/Debian 上使用 nginx。
我尝试编辑/etc/init.d/nginx,我认为这是nginx的起点,但没有效果。
phpinfo说文件位置是/etc/php5/fpm/php.ini.
.ini解析的其他文件
/etc/php5/fpm/conf.d/curl.ini,
/etc/php5/fpm/conf.d/gd.ini,
/etc/php5/fpm/conf.d/mcrypt.ini,
/etc/php5/fpm/conf.d/mysql.ini,
/etc/php5/fpm/conf.d/mysqli.ini,
/etc/php5/fpm/conf.d/pdo.ini,
/etc/php5/fpm/conf.d/pdo_mysql.ini,
/etc/php5/fpm/conf.d/xcache.ini
Run Code Online (Sandbox Code Playgroud)
看着他们,他们都没有任何处理post_max_filesize或 的东西upload_max_filesize。
我在php.ini文件中编辑它并重新启动nginx和php5-fpm服务。变化不会发生。文件仍在编辑中。我试过重新启动计算机。
NGINX是否将它缓存在我需要删除的某个地方以便这些更改生效?
我试过了 php -i | grep ".ini"
它告诉我路径 php.ini is Path => /etc/php5/cli/
phpinfo() 告诉我它的 /etc/php5/fpm/
我已经编辑了两个都没有运气。
如果我这样做,php -i | grep "post_max"
它告诉我它是20M,phpinfo 仍然说8M。
我看到一个奇怪的问题,php.ini如果我php-fpm在启动它时没有明确地将它传递给它,则不会使用它。
这是我正在使用的新贵脚本:
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [016]
pre-start script
mkdir -p /run/php
end script
expect fork
respawn
exec /usr/local/php/sbin/php-fpm --fpm-config /etc/php/php-fpm.conf
Run Code Online (Sandbox Code Playgroud)
如果 PHP 以上述开头,php.ini则永远不会使用my ,即使它在Configuration File (php.ini) Path.
这是来自phpinfo()以下内容的相关部分:
Configuration File (php.ini) Path /etc/php/
Loaded Configuration File (none)
Scan this dir for additional .ini files (none)
Additional .ini files parsed (none)
Run Code Online (Sandbox Code Playgroud)
如果我修改 upstart 脚本的最后一行php-fpm以 php.ini明确指向:
exec /usr/local/php/sbin/php-fpm --fpm-config /etc/php/php-fpm.conf -c /etc/php/php.ini
Run Code Online (Sandbox Code Playgroud)
然后我们看到 …
使用 apache+php_mod 就像放置一样简单:
php_value memory_limit 128M
Run Code Online (Sandbox Code Playgroud)
进入应用程序虚拟主机。
我怎样才能为 nginx+php-fpm 做这样的事情?
我有两台服务器,分别是 Ubuntu 12.04 和 Ubuntu 14.04。当我在新服务器中使用 Ubuntu 14.04 并启用 /etc/php5/fpm/php-fpm.conf 下的 php-fpm 日志文件时,其内容如下:
error_log = /var/log/php5-fpm.log
Run Code Online (Sandbox Code Playgroud)
我注意到我在 Ubuntu 12.04 中找到的大部分日志都不是用 14.04 写的。例如,如果我在 Ubuntu 12.04 中重新启动 php5-fpm,则会写入重新启动日志,但是,在 14.04 中不会发生这种情况。我在 14.04 中错过的另一个日志如下:
[23-Aug-2014 16:23:03] NOTICE: [pool web42] child 118098 exited with code 0 after 12983.480191 seconds from start
[23-Aug-2014 16:23:03] NOTICE: [pool web42] child 147653 started
[23-Aug-2014 17:27:31] WARNING: [pool web8] child 76743, script '/var/www/mysite.com/web/wp-comments-post.php' (request: "POST /wp-comments-post.php") executing too slow (12.923022 sec), logging
Run Code Online (Sandbox Code Playgroud)
我真的很想拥有这种日志,以便我知道慢速脚本执行的时间长度。
有谁知道除了 /etc/php5/fpm/php-fpm.conf 之外,Ubuntu 14.04 中是否还有其他设置需要更改?
更新:
这是我运行时的结果 …
我正在针对 Web 服务运行负载测试。这是一个运行在 php-fpm 和 nginx 上的 php 应用程序,带有 fastcgi。有一个 MySQL 后端仅用于小型读取。
我总是看到一个奇怪的模式:性能稳定并随着流量的增加而可预见地增加,但在高峰期变得不稳定:CPU 使用率不断波动。
这是我看到的性能模式(用 可视化nmon):

下降总是与我的负载测试工具 - locust.io - 在它完成上升到我为测试设置的峰值水平时的短暂暂停同时发生。
我的假设:在这短暂的时刻,php-fpm主人认为负载已经消失并开始杀死工人;当流量在片刻之后全面恢复时,它无法足够快地响应。
我不太明白的是为什么它永远无法完全回到它的摆动中:我看到负载均衡器后面的所有 4 个应用程序服务器无限期地出现这种波动。
这是我的 php-fpm 池配置:
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 100
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 100
pm.max_requests = 10000
Run Code Online (Sandbox Code Playgroud)
我已经确认这不是数据库的问题 - 在将 MySQL 读取从站的数量增加一倍后,我看到了完全相同的行为。
这是什么原因造成的?我怎样才能阻止它?
编辑:
这是一个图表,展示了我所看到的。请注意,故障率通常会在 user_count 达到峰值时出现峰值,然后逐渐回落。

php-fpm ×10
nginx ×8
ubuntu ×3
linux ×2
php ×2
debian-lenny ×1
load-testing ×1
logging ×1
performance ×1
php.ini ×1
php5 ×1
php53 ×1
source ×1
ubuntu-14.04 ×1
upstart ×1