Hi Graham,

Thank you for all the help you've provided, it's been crucial to fixing my 
installation and configuration of mod_wsgi. I managed to get a little help 
from a developer who proceeded to test the wsgi.py file we utilise and 
after a little debugging he found out that the issue stemmed from the 
inclusion of newrelic within the script. I proceeded to upgrade the package 
from version 2.16.0.12 to 2.80.1.61 which fixed the issue completely and 
page load times went from ~40 to ~5 seconds . I also checked the Apache 
access logs where I saw the line that points toward mod_wsgi loading the 
WSGI script.

Many Thanks,
David

On Monday, 6 March 2017 23:02:46 UTC, Graham Dumpleton wrote:
>
> If you have info set for LogLevel, you should see a line like:
>
> mod_wsgi (pid=85737, process='localhost:8000', application=''): Loading 
> WSGI script '/tmp/mod_wsgi-localhost:8000:502/handler.wsgi'.
>
> Are you saying you do not see that in the error log?
>
> When pre-loading is setup, you should see that when any process is first 
> loaded. If you are only see it on the first request, that isn't right.
>
> So take note of where you see that.
>
> Wait a full minute before doing the first request so can see whether it is 
> the global import of the WSGI script file on process start which takes a 
> long time and delaying first request because initial import still not 
> finished.
>
> Graham
>
> On 7 Mar 2017, at 12:48 AM, David <[email protected] <javascript:>> wrote:
>
> Hi Graham,
>
> I had mistyped the python-home directory location when I submitted my 
> response yesterday. The python-home configuration setting in the virtual 
> host file is indeed correct, sorry for the confusion. I've looked into and 
> fixed the "No module named site" issue thanks to the help of your advice 
> on another post using the commands seen below.
>
> ./configure  --with-python=/usr/local/bin/python2.7
> LD_RUN_PATH=/usr/local/lib make
> make install
>
> The installation procedure that configured it incorrectly before was via 
> configuration management software which I will now update. The overall 
> configuration is loadable and will respond to requests so it's great to 
> have everything setup as correctly as it can be now. 
>
> I have still to find out what the issue is regarding slow response times 
> when a request is made to the application after the processes have been 
> created. I have included snippets from Apaches logs to hopefully provide 
> some further information in case it shines a light on an issue that I can't 
> see for myself. 
>
> The logs show me restarting the httpd service using the "systemctl 
> restart httpd" command at 13:32:51. I then make a request at 13:33:03 at 
> which point I wait for roughly 30 seconds before I receive the response 
> from the server showing the page requested. It should be noted that the log 
> entry in the xxx.com.access.log file at 13:33:03 didn't actually appear 
> until 13:33:33 or so, so it's a bit misleading at a glance as well as the 
> wait time can be between 30 - 60 seconds but in the example below it is 
> roughly 30 seconds.
>
> ==> /var/log/httpd/error_log <==
> [Mon Mar 06 13:32:51.981992 2017] [core:info] [pid 11691:tid 
> 140191937927296] AH00096: removed PID file /run/httpd/httpd.pid (pid=11691)
> [Mon Mar 06 13:32:51.982022 2017] [mpm_worker:notice] [pid 11691:tid 
> 140191937927296] AH00296: caught SIGWINCH, shutting down gracefully
> [Mon Mar 06 13:32:52.999652 2017] [wsgi:info] [pid 11691:tid 
> 140191937927296] mod_wsgi (pid=11692): Process 'xxx.com' to be 
> deregistered, as server is restarting or being shutdown.
> [Mon Mar 06 13:32:52.999708 2017] [wsgi:info] [pid 11691:tid 
> 140191937927296] mod_wsgi (pid=11692): Process 'xxx.com' has been 
> deregistered and will no longer be monitored.
> [Mon Mar 06 13:32:54.583209 2017] [auth_digest:notice] [pid 11996:tid 
> 140146629888128] AH01757: generating secret for digest authentication ...
> [Mon Mar 06 13:32:54.588361 2017] [mpm_worker:notice] [pid 11996:tid 
> 140146629888128] AH00292: Apache/2.4.6 (CentOS) mod_wsgi/4.5.14 Python/2.7 
> configured -- resuming normal operations
> [Mon Mar 06 13:32:54.588382 2017] [mpm_worker:info] [pid 11996:tid 
> 140146629888128] AH00293: Server built: Nov 14 2016 18:04:44
> [Mon Mar 06 13:32:54.588397 2017] [core:notice] [pid 11996:tid 
> 140146629888128] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
> [Mon Mar 06 13:32:54.602488 2017] [wsgi:info] [pid 11997:tid 
> 140146629888128] mod_wsgi (pid=11997): Starting process 'xxx.com' with 
> uid=1001, gid=1003 and threads=2.
> [Mon Mar 06 13:32:54.602891 2017] [wsgi:info] [pid 11997:tid 
> 140146629888128] mod_wsgi (pid=11997): Python home /srv/django/xxx.com.
> [Mon Mar 06 13:32:54.602915 2017] [wsgi:info] [pid 11997:tid 
> 140146629888128] mod_wsgi (pid=11997): Initializing Python.
> [Mon Mar 06 13:32:54.616328 2017] [wsgi:info] [pid 11998:tid 
> 140146629888128] mod_wsgi (pid=11998): Starting process 'xxx.com' with 
> uid=1001, gid=1003 and threads=2.
> [Mon Mar 06 13:32:54.616745 2017] [wsgi:info] [pid 11998:tid 
> 140146629888128] mod_wsgi (pid=11998): Python home /srv/django/xxx.com.
> [Mon Mar 06 13:32:54.616767 2017] [wsgi:info] [pid 11998:tid 
> 140146629888128] mod_wsgi (pid=11998): Initializing Python.
>
> ==> /var/log/httpd/xxx.com.access.log <==
> xxx.com 222.222.222.222 "111.111.111.111" - [06/Mar/2017:13:33:03 +0000] 
> "GET / HTTP/1.1" 200 66126 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 
> 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 
> Safari/537.36" "-"
> xxx.com 222.222.222.222 "111.111.111.111" - [06/Mar/2017:13:33:37 +0000] 
> "GET /request2/ HTTP/1.1" 200 17570 "https://xxx.com/"; "Mozilla/5.0 
> (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) 
> Chrome/56.0.2924.87 Safari/537.36" "-"
>
> Thanks,
> David
>
> On Monday, 6 March 2017 00:06:45 UTC, Graham Dumpleton wrote:
>>
>>
>> On 6 Mar 2017, at 10:10 AM, David <[email protected]> wrote:
>>
>> Hi Graham,
>>
>> First off thank you very much for the support you have given, I really 
>> appreciate the time you've taken to help me. I read over the changes you 
>> kindly pointed out and have now amended the virtual host file to use the 
>> following configuration.
>>
>> *virtual host file*
>> WSGIRestrictEmbedded On
>> <VirtualHost *:80>
>>
>> ...
>>
>> WSGIPassAuthorization On
>>
>>     WSGIDaemonProcess xxx.com user=django group=admin processes=2 
>> threads=2 display-name=xxx.com python-home=/srv/django/xxx
>>
>>
>> Did you get the argument to python-home wrong here. Doesn't match below.
>>
>>     WSGIScriptAlias / /srv/django/xxx.com/xxx/xxx/wsgi.py process-group=
>> xxx.com application-group=%{GLOBAL}
>>
>>     <Directory /srv/django/xxx.com/xxx/>
>>         Order allow,deny
>>         Allow from all
>>     </Directory>
>>
>> </VirtualHost>
>>
>>
>> Once I had this configuration in place I received the following error.
>>
>> [wsgi:info] [pid 19595:tid 140504746649728] mod_wsgi (pid=19595): Python 
>> home /srv/django/xxx.com.
>> [wsgi:info] [pid 19595:tid 140504746649728] mod_wsgi (pid=19595): 
>> Initializing Python.
>> ImportError: No module named site
>>
>>
>> When using python-home, this can indicate that your mod_wsgi may not be 
>> compiled with the same Python base installation as the virtual environment 
>> was created from.
>>
>>     
>> http://modwsgi.readthedocs.io/en/develop/user-guides/checking-your-installation.html#python-installation-in-use
>>
>> or that is not picking up correct Python shared library.
>>
>> I double checked my installation of mod_wsgi and confirmed that it was 
>> indeed configured against my alternative installed python version that I 
>> had wanted and then checked my virtual environment was using the same 
>> alternative installed Python version and it was.
>>
>>
>> The problem is where your system Python installation is same major/minor 
>> version as an alternate Python installation. If you didn't override which 
>> Python library was being used, it could be picking up system Python library 
>> and not that for alternative installation.
>>
>> I then decided to pip install the mod_wsgi package within the virtual 
>> environment and then modified the "LoadModules" path for mod_wsgi to that 
>> of the virtual environments as can be seen below.
>>
>> LoadModule wsgi_module /srv/django/
>> xxx.com/lib/python2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so
>>
>>
>> If using that method, ensure you use the output of running:
>>
>>     mod_wsgi-express module-config
>>
>> This alleviated the issue of "No module named site"
>>
>>
>> When using pip install method, it tries to ensure that correct Python 
>> shared library is linked explicitly into the .so file. To be extra safe, 
>> don't calculate path of .so yourself. Include all the output from running:
>>
>>     mod_wsgi-express module-config 
>>
>> into Apache configuration. This can include a LoadFile line for force 
>> loads correct Python library.
>>
>> Also includes a global WSGIPythonHome to ensure using correct Python 
>> runtime directory.
>>
>> but it still left me page load times of roughly ~1 minute upon request.
>>
>>
>> Ensure you have LogLevel in Apache set to 'info' and not 'warn' or 
>> 'error'.
>>
>> The 'info' level will show when mod_wsgi loads WSGI script file initially 
>> so can verify occurs on process start.
>>
>> I restarted the server and waited roughly a minute before requesting a 
>> page, hoping to verify that the application had loaded into the processes 
>> by then but instead of seeing a response of 3 seconds or less I got ~1 
>> minute. This is leaving me to think that the application isn't being loaded 
>> into the processes until a request has been made whereas I though the 
>> configuration allowed the application to preload before a request was made?
>>
>> Is there any where else to look at this point that I may be overlooking, 
>> I have a feeling that it may be in and around the area that led me to pip 
>> install mod_wsgi instead of using my source installed version?
>>
>>
>> Check things about, but also enable logging at 'info' level so can see 
>> when things are loaded. Will then work out where to go next.
>>
>> Many Thanks,
>> David
>>
>> On Saturday, 4 March 2017 22:21:36 UTC, Graham Dumpleton wrote:
>>>
>>>
>>> On 5 Mar 2017, at 7:42 AM, David <[email protected]> wrote:
>>>
>>> I've found an issue in heavily increased loading time when mod_wsgi 
>>> loads the application for the first time. This has started since since 
>>> upgrading from my old setup of CentOS 6, Python 2.7.5, Apache 2.2.15, and 
>>> mod_wsgi 3.4 to my new setup of CentOS 7, Python 2.7.13, Apache 2.4.6, and 
>>> mod_wsgi 4.5.13.
>>>
>>> The change has caused the initial loading time of the application into 
>>> memory from ~5 seconds to ~1 minute. I have followed the "Checking Your 
>>> Installation" as much as I could, coming up with a blank as to what could 
>>> be causing this increase.
>>>
>>> The mod_wsgi and Apache configuration is the same across both the older 
>>> and new setup, configured to use the worker mpm module running in daemon 
>>> mode. Please find the configuration of both the virtualhost file and the 
>>> worker configuration found in the main httpd.conf file below.
>>>
>>> *httpd.conf*
>>> <IfModule mpm_worker_module>
>>>     StartServers         16
>>>     MaxClients           250
>>>     MinSpareThreads      10
>>>     MaxSpareThreads      10
>>>     ThreadsPerChild      25
>>>     MaxRequestsPerChild  0
>>> </IfModule>
>>>
>>>
>>> *virtualhost configuration*
>>>
>>> WSGISocketPrefix run/wsgi
>>> WSGILazyInitialization On
>>>
>>>
>>> This is the default, you don't need this directive.
>>>
>>> WSGIRestrictEmbedded Off
>>>
>>>
>>> You want to set this to On, not Off.
>>>
>>> <VitualHost *:80>
>>>
>>>     ...
>>>
>>>     WSGIPassAuthorization On
>>>     WSGIDaemonProcess xxx.com user=django group=admin processes=2 
>>> threads=2 display-name=xxx.com 
>>> python-path=/srv/django/xxx/lib/python2.7/site-packages
>>>
>>>
>>> Use:
>>>
>>>     WSGIDaemonProcess xxx.com user=django group=admin processes=2 
>>> threads=2 display-name=xxx.com python-home=/srv/django/xxx
>>>
>>> You should not use python-path for setting up a virtual environment, use 
>>> python-home instead.
>>>
>>>     WSGIProcessGroup xxx.com
>>>
>>>
>>> You don't need WSGIProcessGroup if set process-group as option to 
>>> WSGIScriptAlias. See below.
>>>
>>>     WSGIScriptAlias / /srv/django/xxx/xxx/xxx/wsgi.py
>>>     WSGIImportScript /srv/django/xxx/xxx/xxx/wsgi.py process-group=
>>> xxx.com application-group=xxx.com
>>>
>>>
>>> It is better to use:
>>>
>>>     WSGIScriptAlias / /srv/django/xxx/xxx/xxx/wsgi.py process-group=
>>> xxx.com application-group=%{GLOBAL}
>>>
>>> to force preloading. Remove the WSGIImportScript directive.
>>>
>>>     <Directory /srv/django/xxx/xxx/>
>>>         WSGIApplicationGroup xxx.com
>>>
>>>
>>> Since you only have the one application and are using daemon mode, you 
>>> should use:
>>>
>>>     WSGIApplicationGroup %{GLOBAL}
>>>
>>> But then you don't need this directive at all if you are forcing 
>>> pre-loading and have supplied application-group option to WSGIScriptAlias. 
>>> See above.
>>>
>>>         WSGIScriptReloading On
>>>
>>>
>>> This is the default, you don't need this directive.
>>>
>>>         Order allow,deny
>>>         Allow from all
>>>     </Directory>
>>>
>>>     ...
>>>
>>> </VirtualHost>
>>>
>>>
>>> Any help would be greatly appreciated and if anyone can point me in the 
>>> right direction as to how to debug this issue further I will gladly oblige 
>>> to the best of my ability!
>>>
>>>
>>> Make those changes and see how it goes.
>>>
>>> Because you have been force pre-loading, the WSGI application should be 
>>> getting loaded when daemon processes start, not on first request.
>>>
>>> Graham
>>>
>>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "modwsgi" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/modwsgi.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "modwsgi" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] <javascript:>.
> To post to this group, send email to [email protected] <javascript:>
> .
> Visit this group at https://groups.google.com/group/modwsgi.
> For more options, visit https://groups.google.com/d/optout.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/d/optout.

Reply via email to