什么可能导致Apache的时间/时区间歇性地改变?

我运行一个服务器上有一些基于PHP的论坛( 香草 1.1.5a),最近我注意到他们发布的post。 一些挖掘发现,Apache似乎正在改变当前时区从+0000到-0500来回请求没有明显的模式,这可以在这样的日志条目中看到:

38.104.58.202 - - [15/Jun/2009:22:40:05 +0000] "GET /extensions/MembersList/library/paginate.js HTTP/1.1" 200 22880 "http://mysite.com/" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b99) Gecko/20090605 Firefox/3.5b99" 38.104.58.202 - - [15/Jun/2009:17:40:05 -0500] "GET /extensions/JQuery/jquery-1.2.6.min.js HTTP/1.1" 200 55804 "http://mysite.com/" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b99) Gecko/20090605 Firefox/3.5b99" 

虽然调整时区差异的时间是相同的,但它似乎导致PHP的date函数返回本地,未调整的时间(随着时间的颠簸混乱发生在论坛的数据)。

我也在同一个VirtualHost上运行一个基于Django的mod_python应用程序。 configuration看起来像这样:

 <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> Alias /media/ "/usr/share/python-support/python-django/django/contrib/admin/media/" <Directory /usr/share/python-support/python-django/django/contrib/admin/media/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> RedirectMatch ^/raid-scheduler$ "/raid-scheduler/" <Location "/raid-scheduler/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE raid_scheduler.settings PythonOption django.root /raid-scheduler PythonDebug On PythonPath "['/opt', '/opt/raid_scheduler'] + sys.path" </Location> </VirtualHost> 

任何想法可能是什么原因造成的?

难道是一些其他的要求是设置TZ,它是左躺吗? 在每个请求开始时logginggetenv('TZ')会validation这一点, putenv可以用来解决这个问题。

在Unix / Linux中,每个进程都可以在不同的时区运行。 这是因为根据$ TZvariables的内容可以在进程的环境中存在系统时间相关的函数改变它们的返回值(这不是PHP或Apache特定的)。 可能$ TZ在一个或多个Apache进程中被修改。 mod_php和mod_python都是Apache进程的一部分,所以他们可以自由修改$ TZ。

您可以通过posix_getpid()将getenv('TZ')和Apache进程id一起打印到日志中,因此可以用来匹配各种用户请求吗?

我认为这与你的php设置有关。 看看mod_php的“TZ”环境variables。

TZ环境variables以及与语言和区域设置相关的各种环境variables是全局的。 因此,在同一个进程中运行多个应用程序实例,无论它们是Python还是PHP,都希望以不同的方式进行设置将会导致问题。 这个问题也影响mod_wsgi,并在下面讨论:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Timezone_and_Locale_Settings

请注意,通过从Python Web应用程序内部查看os.environ来尝试validation事物可能没有帮助,因为在创buildPython(子)解释器实例时,os.environ是进程环境variables的副本。 因此,任何对TZ或其他环境variables的更改都不会反映在Python os.environ字典中。 唯一的时间同步的特定值发生时,os.environ中的值更新,在这种情况下,Python也调用C级putenv()函数。