On Aug 3, 7:39 pm, iceb...@21cn.com wrote:
> Well, actually I am not sure whether is a wsgi problem or a webfaction 
> problem. Anyway I just observe TWO separated instances of cache.ram inside 
> ONE web2py instance. How could this be?
>
> Detail description.
>
> One of my web2py app's action is to refresh cache.ram and then log the result.
>
>         def cron_job():
>                 session.forget() # otherwise session files will pile up 
> unnecessarily
>                 cache.ram('foo', lambda: time_consuming_job(), 
> time_expire=1800)
>
>                 # following code borrowed from appadmin.py's ccache()
>                 ram = { 'hits':0, 'misses':0 }
>                 for key, value in cache.ram.storage.items():
>                         if isinstance(value, dict):
>                                 ram['hits'] = value['hit_total'] - 
> value['misses']
>                                 ram['misses'] = value['misses']
>
>                 status = 'hit:%d, miss:%d' % (ram['hits'], ram['misses'])
>                 open('cron_job.log', 'a').write('... (%s), [%s]'% (..., 
> request.client, status))
>
> And there is an external web2py cron running this trigger script:
>         import urllib
>         urllib.urlopen('http://localhost:54321/myapp/default/cron_job').read()
>
> I setup web2py on webfaction days before. It is in wsgi mode, and I shrink 
> the working process from 2 to 1 (in order to use cache.ram supposedly). The 
> default apache2/conf/httpd.conf is very short and here is the important part 
> (I think):
>         LoadModule rewrite_module modules/mod_rewrite.so
>         Listen 54321
>         LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" 
> \"%{User-Agent}i\" %D" combined
>         CustomLog /home/iceberg1975/logs/user/access_web2py_1_81_5.log 
> combined
>         ServerLimit 1
>         WSGIScriptAlias / 
> /home/my_webfaction_account/webapps/web2py_1_81_5/web2py/wsgihandler.py
>
> Everything seemingly works fine, until I surprisingly notice that, web2py 
> uses one cache.ram instance when being visited by a real-world request, but 
> uses another separated cache.ram instance when being visited by the 
> localhost's cron job.
>
> Here is the apache log when being visited by a real-world request:
> 112.94.8.140 - - [03/Aug/2010:05:38:40 -0500] "GET /myapp/default/cron_job 
> HTTP/1.0" 200 15 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) 
> AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.125 Safari/533.4" 34391
>
> And here is the apache log when being visited by local cron script, note that 
> there is no incoming IP:
> - - - [03/Aug/2010:05:39:05 -0500] "GET /myapp/default/cron_job HTTP/1.0" 200 
> 19 "-" "Python-urllib/1.17" 33972
>
> Both generate similar log on web2py level:
> 127.0.0.1, 2010-08-03 05:38:40, GET, /myapp/default/cron_job, HTTP/1.0, 200, 
> 0.033933
> 127.0.0.1, 2010-08-03 05:39:05, GET, /myapp/default/cron_job, HTTP/1.0, 200, 
> 0.033501
>
> But the cron_job.log reveals the difference, they are hitting different 
> cache.ram instance. How come?
> Triggered at Tue Aug  3 05:38:40 2010, took 0.002 seconds. (112.94.8.140). 
> [hit:54, miss:64]
> Triggered at Tue Aug  3 05:39:05 2010, took 0.002 seconds. (127.0.0.1). 
> [hit:20727, miss:702]
>
> Oh yes, I guess one of the workaround/solution is to use cache.disk or 
> cache.memcache instead. But I am still curious to know what cause the above 
> "two cache.ram instances" problem even when I am running only one web2py 
> process. Or, do I?
> [my_wf_acco...@web150 conf]$ ps -ef|grep 1_81
> 528       3529     1  0 Aug01 ?        00:00:00 
> /home/MY_WF_ACCOUNT/webapps/web2py_1_81_5/apache2/bin/httpd -f 
> /home/MY_WF_ACCOUNT/webapps/web2py_1_81_5/apache2/conf/httpd.conf -k start
> 528       3531  3529  0 Aug01 ?        00:01:37 
> /home/MY_WF_ACCOUNT/webapps/web2py_1_81_5/apache2/bin/httpd -f 
> /home/MY_WF_ACCOUNT/webapps/web2py_1_81_5/apache2/conf/httpd.conf -k start
>
> Any feedback will be appreciated.
>
> Sincerely,
>              Iceberg, 2010-Aug-03, 18:39(PM), Tue


Mmm, I (partially) know the cause and solution. It is my cron script.
Change it from:
    urllib.urlopen('http://localhost:54321/myapp/default/
cron_job').read()
into:
    urllib.urlopen('http://MY_DOMAIN:80/myapp/default/
cron_job').read()
then the cron script DOES visit the server in exactly same way as end
user's browser, then serving by the same cache.ram instance. Problem
disappear.

I still don't know why a localhost:wsgi_port will cause problem. If
anyone has a theory or explanation, I will be more than happy to know.

That is it for today, my day X experience of web2py on webfaction.

Regards,
Iceberg

Reply via email to