Yeah it is working fine what I did was step1. Unlinked existing symlink Step2. Create new symlink Step3. Managed permissions and shell context of files
Therefore no reload or restart is needed. But I have doubt up to how many mod_wsgi daemons we can efficiently without any disturbance and up to what extent we can trust this deployment process using mod_wsgi in daemon mode for production environment. Thankyou, RajKumar On Thursday 25 July 2024 at 13:04:18 UTC+5:30 RajKumar Ambadipelli wrote: > Sorry that uoadmin is actually admin. > > Ok I will try this one. > > Thankyou, > RajKumar > > On Thursday 25 July 2024 at 12:59:13 UTC+5:30 Graham Dumpleton wrote: > >> You have two different directories which may complicate it a little, but >> what you can do is have something like: >> >> Listen 9002 <VirtualHost *:9002> >> ServerName test.myapp.com >> ErrorLog /var/log/webservice_error.log >> WSGIPassAuthorization On >> WSGIDaemonProcess Tes9002 >> python-path=/home/uoadmin/releases/test/students:/home/admin/releases/test/shared >> >> display-name=%{GROUP} >> WSGIProcessGroup Tes9002 WSGIApplicationGroup %{GLOBAL} >> WSGIScriptAlias / /home/admin/releases/test/students/conf/wsgi.py >> <Directory /home/admin/releases/test/students/conf> >> <Files wsgi.py> Require all granted </Files> >> </Directory> >> </VirtualHost> >> >> <VirtualHost *:9002> >> ServerName dev.myapp.com >> ErrorLog /var/log/webservice_error.log >> WSGIPassAuthorization On >> WSGIDaemonProcess Dev9002 >> python-path=/home/uoadmin/releases/dev/students:/home/admin/releases/dev/shared >> >> display-name=%{GROUP} >> WSGIProcessGroup Dev9002 WSGIApplicationGroup %{GLOBAL} >> WSGIScriptAlias / /home/admin/releases/dev/students/conf/wsgi.py >> <Directory /home/admin/releases/dev/students/conf> >> <Files wsgi.py> Require all granted </Files> >> </Directory> >> </VirtualHost> >> >> In this case /home/admin/releases/dev would actually be a symlink to the >> versioned directory. >> >> Not sure why have separate uoadmin directory, but also have >> /home/uoadmin/releases/dev as symlink to the versioned directory. >> >> To change what is used, remove/recreate symlinks so point to the >> directory for the new version. >> >> That the wsgi.py has changed should trigger a process restart if auto >> reloading is on (default). >> >> Alternatively could disable auto reloading and manually send SIGUSR1 to >> process to trigger a graceful reload after changing the symlink. >> >> That all said, I can't remember if you might have to configure Apache to >> tell it to allow following symlinks (Options FollowSymLinks). If it were >> static file handling would definitely be needed, but can't remember if >> would be required in this case where is WSGI application handling things. >> >> Graham >> >> On 25 Jul 2024, at 5:21 PM, RajKumar Ambadipelli <arkki...@gmail.com> >> wrote: >> >> Ok, If I have only two virtualhosts all the time and I am going to change >> only python-path will that work with the direct signal using SIGUSR1. >> >> If the above is possible then I think I have some kind of solution. >> >> Thankyou, >> RajKumar >> >> On Thursday 25 July 2024 at 12:35:09 UTC+5:30 Graham Dumpleton wrote: >> >>> Are you always using the same two virtual host server names and just >>> updating the version number in the paths? >>> >>> On 25 Jul 2024, at 4:21 PM, RajKumar Ambadipelli <arkki...@gmail.com> >>> wrote: >>> >>> Yes I am adding new virtual hosts when ever I want to release a new >>> version of that services lets say initially my virtualhost config will be >>> like >>> >>> #Students Webservice Config >>> Listen 9002 <VirtualHost *:9002> >>> ServerName test.myapp.com >>> ErrorLog /var/log/webservice_error.log >>> WSGIPassAuthorization On >>> WSGIDaemonProcess Tes9002 python-path=/home/uoadmin/releases/1.0.0 >>> /students:/home/admin/releases/1.0.0/shared display-name=%{GROUP} >>> WSGIProcessGroup Tes9002 WSGIApplicationGroup %{GLOBAL} >>> WSGIScriptAlias / /home/admin/releases/1.0.0/students/conf/wsgi.py >>> <Directory /home/admin/releases/1.0.0/students/conf> >>> <Files wsgi.py> Require all granted </Files> >>> </Directory> >>> </VirtualHost> >>> >>> When i want to go for new releases the down part is appended to above >>> part >>> >>> <VirtualHost *:9002> >>> ServerName dev.myapp.com >>> ErrorLog /var/log/webservice_error.log >>> WSGIPassAuthorization On >>> WSGIDaemonProcess Dev9002 python- path=/home/uoadmin/releases/1.1.0 >>> /students:/home/admin/releases/1.1.0/shared display-name=%{GROUP} >>> WSGIProcessGroup Dev9002 WSGIApplicationGroup %{GLOBAL} >>> WSGIScriptAlias / /home/admin/releases/1.1.0/students/conf/wsgi.py >>> <Directory /home/admin/releases/1.1.0/students/conf> >>> <Files wsgi.py> Require all granted </Files> >>> </Directory> >>> </VirtualHost> >>> >>> >>> Now I am going to have two virtualhosts with two daemons 1st is already >>> recognized by apache server where as second one is not yet recognized by >>> apache server >>> >>> Thankyou, >>> RajKumar >>> >>> On Thursday 25 July 2024 at 11:40:31 UTC+5:30 Graham Dumpleton wrote: >>> >>>> What is the reason for doing the graceful restart? Is it because you >>>> are adding/removing virtual hosts, or making some other Apache config >>>> change. >>>> >>>> You do not need to do a complete Apache restart if just want to force a >>>> daemon process to restart, you can instead send the processes a signal >>>> directly. From memory it is SIGUSR1 that triggers a graceful restart of >>>> processes, but you will need to confirm that. >>>> >>>> On 25 Jul 2024, at 3:28 PM, RajKumar Ambadipelli <arkki...@gmail.com> >>>> wrote: >>>> >>>> When i have 260 microservices those all are light weight applications >>>> using same python interpreter and with django rest api framework, and >>>> currently each application hosted on apache server usign mod_wsgi daemon >>>> mode and my main problem is while making changes to one of application >>>> virtualhost other ongoing daemons are distured as i need to reload or >>>> restart. >>>> All those 260 services very light weight each listen to http request on >>>> unique ports. >>>> >>>> ThankYou >>>> RajKumar >>>> >>>> On Tuesday 23 July 2024 at 16:37:42 UTC+5:30 Graham Dumpleton wrote: >>>> >>>>> One can optimise embedded mode for better performance, but I would put >>>>> a big caveat on that and say is only probably a good idea to tackle if >>>>> you >>>>> have the one web service. >>>>> >>>>> Running 260 micro services in one Apache httpd instance with mod_wsgi >>>>> sounds rather scary either way. >>>>> >>>>> If you use mod_wsgi daemon mode where each micro service is in its own >>>>> daemon process group (with a single process and small number of threads), >>>>> then you might get away with it if these aren't high volume sites. That >>>>> said, it is still a lot of managed daemon mode processes and not sure how >>>>> well Apache will handle that, especially on restarts. >>>>> >>>>> Running them all in embedded mode would be a bad idea if each needs a >>>>> separate Python interpreter context because the Apache worker process >>>>> would >>>>> be huge in size. If Apache httpd was configured for prefork MPM it would >>>>> be >>>>> even worse because you would have a potentially large number of worker >>>>> processes since all are single thread. You also run a big risk with micro >>>>> services interfering with each other in strange ways if running in >>>>> different sub interpreter contexts of the one process due to how Python >>>>> imports C extensions, and process wide environment variables work. >>>>> Various >>>>> third party Python packages with C extensions will not even work in >>>>> Python >>>>> sub interpreters (eg., anything related to numpy). >>>>> >>>>> You definitely want event or worker MPM, but even then, for 260 micro >>>>> services, if they need separate Python interpreter context I can't really >>>>> recommend it still because of size concerns for processes and potential >>>>> cross sub interpreter interference. >>>>> >>>>> So the question is whether when you said 260 micro services you really >>>>> mean independent web applications, or whether you just mean you have 260 >>>>> different unique HTTP handlers as part of the one application, and thus >>>>> in >>>>> the same Python interpreter context. >>>>> >>>>> When people talk about such large number of micro services, usually >>>>> you would not be aiming to host them in a single Apache instance but >>>>> would >>>>> instead be looking at running something which can handle things at scale >>>>> like Kubernetes and creating separate deployments for them in that, >>>>> relying >>>>> on the ingress routing Kubernetes provides to get traffic to the >>>>> appropriate micro service. >>>>> >>>>> Graham >>>>> >>>>> On 23 Jul 2024, at 7:13 PM, RajKumar Ambadipelli <arkki...@gmail.com> >>>>> wrote: >>>>> >>>>> mod_wsgi in embeded mode allows graceful restart, >>>>> What are the potential issues that I will face if I use mod_wsgi in >>>>> embedded mode instead of daemon mode, >>>>> I have to host around 260 python micro services. >>>>> >>>>> I have saw your blog on 'why are you using mod_wsgi in embedded mode?' >>>>> But, I unable to understand it very well in that you mentioned if we >>>>> configure mpm settings correctly then mod_wsgi in embedded mode is better >>>>> than daemon mode but not mentioned any configurations. >>>>> >>>>> Thanking you, >>>>> RajKumar >>>>> >>>>> On Tuesday 23 July 2024 at 13:04:50 UTC+5:30 Graham Dumpleton wrote: >>>>> >>>>>> On 23 Jul 2024, at 4:09 PM, RajKumar Ambadipelli <arkki...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> I am using Apache Server with mod_wsgi for hosting my python django >>>>>> applications. Versions: Python 3.9.18 Server version: Apache/2.4.57 >>>>>> mod-wsgi==4.7.1 >>>>>> >>>>>> One of my application virtual host configuration with two different >>>>>> versions: >>>>>> >>>>>> ... >>>>>> >>>>>> So, When the source code is modified I can referesh the wsgi daemon >>>>>> using touch /home/uoadmin/releases/1.1.0/students/conf/wsgi.py touch >>>>>> /home/uoadmin/releases/1.0.0/students/conf/wsgi.py But when I added new >>>>>> virtualhost to the above configuration file or else when I modify above >>>>>> file the apache server unable to recognize modifications made the >>>>>> existing >>>>>> virtualhost or newly added virtualhost until doing apachectl graceful >>>>>> (or) >>>>>> apachectl restart (or) systemctl reload httpd but all the commands above >>>>>> killing the ongoing requests forcefully directly terminating them. >>>>>> >>>>>> How to handle above situation. >>>>>> >>>>>> I want to know how will apache server recognize modifications to >>>>>> virtualhost or newly added virtual host without reloading or restarting. >>>>>> >>>>>> It can't, Apache httpd requires you to perform a restart (reload) in >>>>>> order to read changes to the Apache configuration files. That is how it >>>>>> works. >>>>>> >>>>>> If above is not possible then is there anyway for restarting or >>>>>> reloading apache server gracefully that is without terminating or >>>>>> killing >>>>>> other ongoing requests or daemons while using apache server + mod_wsgi >>>>>> for >>>>>> serving python with django? >>>>>> >>>>>> Unfortunately not. The way Apache httpd manages the mod_wsgi daemon >>>>>> processes it will force a restart of those as well and even though >>>>>> Apache >>>>>> has a concept of graceful restart for it's own worker child processes, >>>>>> it >>>>>> doesn't extend that to managed process like the mod_wsgi daemon process >>>>>> and >>>>>> always restarts them immediately even when it is a graceful restart. >>>>>> There >>>>>> is nothing that can be done about this. >>>>>> >>>>>> The only way you could handle it if you need to be able to freely >>>>>> restart the main Apache server and have it not affect your Python web >>>>>> applications, is to run the Python web applications in distinct >>>>>> secondary >>>>>> web server processes and use the main Apache server to only proxy >>>>>> requests >>>>>> through to the secondary web servers. >>>>>> >>>>>> For the second web servers you could use mod_wsgi-express to make >>>>>> things easier, but you could also just not use mod_wsgi for the >>>>>> secondary >>>>>> web servers and use gunicorn or some other standalone Python >>>>>> WSGI/asyncio >>>>>> web server. >>>>>> >>>>>> 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 modwsgi+u...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/modwsgi/d28663bc-a143-4e4f-949d-38e065c5ac9fn%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/modwsgi/d28663bc-a143-4e4f-949d-38e065c5ac9fn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>>> >>>>> >>>> -- >>>> 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 modwsgi+u...@googlegroups.com. >>>> >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/modwsgi/1fffb2f7-ed8a-4d88-a52b-00e7e82e98d5n%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/modwsgi/1fffb2f7-ed8a-4d88-a52b-00e7e82e98d5n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> >>>> >>> -- >>> 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 modwsgi+u...@googlegroups.com. >>> >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/modwsgi/27697b57-c903-4881-bddd-691060d62b47n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/modwsgi/27697b57-c903-4881-bddd-691060d62b47n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> >> -- >> 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 modwsgi+u...@googlegroups.com. >> >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/modwsgi/0794a799-7f70-4d68-affe-b2b7a4f43529n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/modwsgi/0794a799-7f70-4d68-affe-b2b7a4f43529n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> >> -- 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 modwsgi+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/modwsgi/7edb7907-915b-41a6-a581-097ea1b87dc0n%40googlegroups.com.