小编Tom*_*Tom的帖子

防止重复运行的 cron 作业

我已经安排了一个 cron 作业每分钟运行一次,但有时脚本需要超过一分钟才能完成,我不希望这些作业开始“堆积”。我猜这是一个并发问题 - 即脚本执行需要相互排斥。

为了解决这个问题,我让脚本查找特定文件(“ lockfile.txt ”)的存在touch,如果存在则退出,如果不存在则退出。但这是一个非常糟糕的信号量!是否有我应该知道的最佳实践?我应该写一个守护进程吗?

scheduling cron

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

在docker容器中运行时如何让php-fpm登录到stdout/stderr

我在 docker 容器中有 php-fpm,在Dockerfile我编辑 fpm 配置文件 ( /etc/php5/fpm/pool.d/www.conf) 以设置要访问的访问日志和要访问的/var/log/fpm-access.log错误日志/var/log/fpm-php.www.log

# Do some php-fpm config
#  Redirect worker stdout and stderr into main error log
#  Activate the fpm access log
#  Enable display errors
#  Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
    sed …
Run Code Online (Sandbox Code Playgroud)

logging php-fpm best-practices docker

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

可以使用内存缓存守护进程池更有效地共享会话吗?

我们正在从 1 个网络服务器设置转移到两个网络服务器设置,我需要开始在两台负载平衡机器之间共享 PHP 会话。我们已经安装(并启动)了memcached,所以我很高兴我可以通过只更改文件中的3 行(session.save_handlersession.save_path)来完成新服务器之间的共享会话:php.ini

我替换了:

session.save_handler = files
Run Code Online (Sandbox Code Playgroud)

和:

session.save_handler = memcache
Run Code Online (Sandbox Code Playgroud)

然后在主 Web 服务器上,我将session.save_path指向 localhost:

session.save_path="tcp://localhost:11211"
Run Code Online (Sandbox Code Playgroud)

在从属网络服务器上,我将 设置session.save_path为指向主服务器:

session.save_path="tcp://192.168.0.1:11211"
Run Code Online (Sandbox Code Playgroud)

工作完成,我测试了它并且它有效。但...

显然,使用 memcache 意味着会话在 RAM 中,如果机器重新启动或 memcache 守护进程崩溃,会话将会丢失 - 我对此有点担心,但我更担心两个网络服务器之间的网络流量(尤其是当我们扩大规模),因为每当有人负载平衡到从网络服务器时,他们的会话将从主网络服务器通过网络获取。我想知道是否可以定义两个,save_paths以便机器在使用网络之前查看自己的会话存储。例如:

掌握:

session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Run Code Online (Sandbox Code Playgroud)

奴隶:

session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
Run Code Online (Sandbox Code Playgroud)

这会成功地跨服务器共享会话并帮助提高性能吗?即节省 50% 的时间网络流量。还是这种技术仅适用于故障转移(例如,当一个内存缓存守护进程无法访问时)?

注意:我并不是特别询问内存缓存复制 - 更多关于 PHP 内存缓存客户端是否可以在池中的每个内存缓存守护进程内达到峰值,如果找到一个会话,则返回一个会话,如果没有找到,则只创建一个新会话在所有商店。在我写这篇文章的时候,我想我对 PHP 的要求有点高,哈哈...

假设:没有粘性会话、循环负载平衡、LAMP 服务器。

php performance lamp memcached

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

如何使用 Linux `find` 命令查看隐藏文件

在 Linux 服务器上,我需要在当前目录和所有子目录中查找具有特定文件扩展名的所有文件。

以前,我一直使用以下命令:

find . -type f | grep -i *.php
Run Code Online (Sandbox Code Playgroud)

但是,它找不到隐藏文件,例如.myhiddenphpfile.php。下面找到隐藏的 php 文件,而不是非隐藏的文件:

find . -type f | grep -i \.*.php
Run Code Online (Sandbox Code Playgroud)

如何在同一命令中同时找到隐藏和非隐藏的 php 文件?

linux files command-line-interface find grep

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

如何在不支付 600 美元的情况下将 https 与 AWS Cloudfront 一起使用来上传我的证书?

我可以通过 Amazon CloudFront 托管一个动态网站,因为它们具有CNAME Wildcard Support。但是,我网站的某些页面使用 HTTPS。Amazon有一些关于如何将您的 SSL 证书与 CloudFront 分配相关联的文档,但定价显示每月花费600 美元,对我来说太多了。

我的问题是...是否可以配置 CloudFront 以便从 CloudFront 提供 HTTP 请求,但 CloudFront 忽略 HTTPS 请求并直接传递到源(在我的情况下,弹性负载均衡器可以免费解密 SSL) ?

ssl https amazon-cloudfront amazon-elb

15
推荐指数
2
解决办法
5094
查看次数

我可以在 nginx 服务的静态文件中使用 nginx 环境变量吗?

如果我在 nginx 配置中使用环境变量,并且将 nginx 配置为仅提供静态文件(html、js、css - 例如 AngularJs 应用程序),有什么方法可以在 nginx 提供的 JS 文件中使用环境变量? 或者是运行非静态服务器(例如 io.js、php 等)的唯一方法。


顺便说一句,您不能在 nginx 的配置中本地使用环境变量。

当我在 nginx 配置中谈论环境变量时,我的意思是在这篇文章中:如何在 Nginx.conf使用环境变量,它们使用env APP_WEB_1_PORT_5000_TCP_ADDR;$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


准确解释您的用例

我的具体用例是我在 docker 容器中有一个由 nginx 驱动的 AngularJS 应用程序。该应用程序是一个“单页应用程序”,它完全使用在另一个系统上运行的 API。目前我在生产和暂存之间运行不同的 docker 容器,因为该应用程序有一些不同的配置,例如 Google-Analtyics 代码。这个特定于环境的数据保存在一个config.js文件中,这些值当前是硬编码的,mastergit 中的分支有一个值,而分支的值不同staging。我想更改设计,以便我可以将相同的容器用于生产和暂存。我想在运行它时将一个 ENV 变量传递到容器中 ( docker run -e GACODE=UA-12345-6 ...) 并让 nginx 使用 ENV 变量(通过env GACODE;$ENV{"GACODE"}这样的config.js文件可以使用传入的 GoogleAnaltyics 代码,而不是对其进行硬编码)。我不知道这是否可能(因此问题;))。仅使用 nginx 使我的容器成为单进程,而如果我必须使用 io.js 那么我将需要多个链接的容器,并且更多的移动部件更复杂)。

nginx environment-variables static-content docker

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

Nginx - 提供来自无 cookie 域的静态内容

我正在使用Firebug的“页面速度”扩展来尝试优化网站,我目前正在研究以下建议:“从无 cookie 的域中提供静态内容”。

我为某些内容创建了一个单独的子域,以便我拥有www.example.comimages.example.com但如何指定它images.example.com是无 cookie 的?我可以强制它在诸如 Nginx 或 Apache 之类的网络服务器中是无 cookie 的,还是仅仅是确保不在服务器端代码(例如 PHP)中在此域中设置任何 cookie 的问题?

我问的原因是因为即使在我尝试修复它之后“Page Speed”仍然显示相同的建议 - 所以我想一些 cookie 一定已经漏掉了。我在浏览器 cookie 搜索中看不到任何 cookie,但如果我检查资源的 HTTP 标头,我可以看到:

Cookie  __utma=73051794.676740941.1271792323.1277710025.1277900715.20; __utmz=73051794.1271792323.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmx=73051794.00009825591030858779:3:0; __utmxx=73051794.00009825591030858779:2295429:2592000; __gads=ID=0a768e3407302ff8:T=1272608001:S=ALNI_MZ-GKhg3ETniU0TVftk0DdGyUypkQ
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何阻止来自我的子域的 cookie?

http nginx cookies static-content cookieless

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

mysql init-file 配置选项给出找不到文件错误

我想在 mysql 启动时运行一个 SQL 脚本,但我无法在 Ubuntu 11.10 中运行它。

我在 mysql 配置文件中添加了一个“ init-file ”选项:

> sudo emacs -nw /etc/mysql/my.cnf
...
[mysqld]
init-file=/etc/mysql/mysqlinit.sql
...
Run Code Online (Sandbox Code Playgroud)

但是当我重新启动 mysql 时,它失败并显示“找不到文件”错误:

> tail /var/log/mysql/error.log
111111  7:41:06 [ERROR] /usr/sbin/mysqld: File '/etc/mysql/mysqlinit.sql' not found (Errcode: 13)
111111  7:41:06 [ERROR] Aborting
Run Code Online (Sandbox Code Playgroud)

但该文件肯定存在并且是可读的:

> ls -l /etc/mysql/mysqlinit.sql
-rwxr-xr-x 1 mysql mysql 30 2011-11-09 05:06 /etc/mysql/mysqlinit.sql
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?这是 Ubuntu 的怪癖还是我做了一些愚蠢的事情?


信息:

我正在运行 Ubuntu 11.10 和 MySQL 5.1。

> mysqld --version
mysqld  Ver 5.1.58-1ubuntu1 for debian-linux-gnu on x86_64 ((Ubuntu))
Run Code Online (Sandbox Code Playgroud)

mysql ubuntu apparmor

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

使用 Apache 时,PHP 中 DOCUMENT_ROOT 变量的尾部斜杠不一致

在不同的服务器环境中,PHP $_SERVER['DOCUMENT_ROOT']super global 有时尾部有斜线,有时没有。我原以为这个问题与文件中ApacheDocumentRoot的定义方式直接相关httpd.conf

即我会认为如果不httpd.conf包含尾部斜杠:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...
Run Code Online (Sandbox Code Playgroud)

然后echo $_SERVER['DOCUMENT_ROOT']应该给/var/www/live/current

如果httpd.conf确实包含尾部斜杠:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...
Run Code Online (Sandbox Code Playgroud)

然后echo $_SERVER['DOCUMENT_ROOT']应该给/var/www/live/current/

在 Ubuntu 10.04 上就是这种情况,但在 RHEL 5.5 上,$_SERVER['DOCUMENT_ROOT']即使在 Apache 上没有定义任何斜杠,也会添加尾部斜杠。

知道为什么会这样吗?是否有我遗漏的配置参数?


以供参考:

  • RHEL 的 PHP 5.3.3(出现问题):PHP 5.3.3 (cli)(构建时间:2010 年 7 月 23 日 16:26:53)
  • Ubuntu 的 PHP 版本(没有问题):PHP 5.3.2-1ubuntu4.2 with Suhosin-Patch (cli)(构建时间:2010 年 5 月 13 日 20:03:45)

php configuration documentroot apache-2.2

10
推荐指数
1
解决办法
8497
查看次数

如何更改以批处理模式运行的“top”linux 命令的输出行长度

以下命令可用于捕获当前占用 CPU 最多的进程并将其存储到文件中:

top -c -b -n 1 > top.log
Run Code Online (Sandbox Code Playgroud)

-c标志特别有用,因为它为您提供每个进程的命令行参数,而不仅仅是进程名称。

没有-c

2497 root      18   0 11264 5888 1524 S  0.0  0.1   0:03.31 miniserv.pl
Run Code Online (Sandbox Code Playgroud)

使用-c(附加有用的命令信息):

2497 root      18   0 11264 5888 1524 S  0.0  0.1   0:03.31 /usr/bin/perl /usr/libexec/webmin/miniserv.pl /etc/webmin/miniserv.conf
Run Code Online (Sandbox Code Playgroud)

问题是每一行输出都会被截断以适合当前的终端窗口。如果您可以拥有一个宽终端,那么这是可以的,因为您有很多输出,但如果您的终端只有 165 个字符宽,则每个进程只能获得 165 个字符的信息,并且通常没有足够的字符来显示完整的进程命令。当命令在没有终端的情况下执行时(例如通过 cron 作业执行),这是一个特殊问题。

有谁知道如何停止top截断数据或强制top每行显示一定数量的字符?

这并不紧急,因为还有另一种方法可以获取按 CPU 使用率排序的前 10 个进程:

ps -eo pcpu,pmem,user,args | sort -r -k1 | head -n 10
Run Code Online (Sandbox Code Playgroud)

linux command-line-interface top

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