基于Docker的环境configuration中的mod_wsgi

我需要设置:closuresWSGIRestrictSignal,因为我必须在调用正常关机后在我的python代码中执行一些操作。

从文档:

运行良好的Python WSGI应用程序通常不应该使用signal.signal()来注册任何自己的信号处理程序。 这样做的原因是,托pipeWSGI应用程序的Web服务器将更有可能注册自己的信号处理程序。 如果WSGI应用程序要覆盖这样的信号处理程序,它可能会干扰Web服务器的操作,从而阻止诸如服务器closures和重新启动等操作。

你知道如何在Docker中更改configuration文件吗?
我应该覆盖现有的文件吗?

这是我的Dockerfile:

FROM grahamdumpleton/mod-wsgi-docker:python-2.7 ADD requirements.txt requirements.txt RUN ["pip", "install", "-r", "requirements.txt"] WORKDIR /app COPY src/main/scripts/app.wsgi /app/app.wsgi ENTRYPOINT [ "mod_wsgi-docker-start" ] CMD [ "app.wsgi", "--processes", "1", "--port", "5000" ] 

我应该放这样的东西吗?

 ADD "httpd.conf" /tmp/mod_wsgi-localhost:5000:0/httpd.conf 

至于我得到了mod_wsgi-docker-start“通过select”默认“configuration来执行所有的事情。

由于WSGIRestrictSignal设置为On“Default”,因此如果引发信号就不可能捕获:

 Server URL : http://localhost:5000/ Server Root : /tmp/mod_wsgi-localhost:5000:0 Server Conf : /tmp/mod_wsgi-localhost:5000:0/httpd.conf Error Log File : /dev/stderr (warn) Startup Log File : /dev/stderr Request Capacity : 5 (1 process * 5 threads) Request Timeout : 60 (seconds) Startup Timeout : 15 (seconds) Queue Backlog : 100 (connections) Queue Timeout : 45 (seconds) Server Capacity : 20 (event/worker), 20 (prefork) Server Backlog : 500 (connections) Locale Setting : en_US.UTF-8 [Wed Sep 06 09:37:32.673894 2017] [mpm_event:notice] [pid 14:tid 140686654945024] AH00489: Apache/2.4.25 (Unix) mod_wsgi/4.5.7 Python/2.7 configured -- resuming normal operations [Wed Sep 06 09:37:32.674133 2017] [core:notice] [pid 14:tid 140686654945024] AH00094: Command line: 'httpd (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:5000:0/httpd.conf -E /dev/stderr -D MOD_WSGI_MULTIPROCESS -D MOD_WSGI_MPM_ENABLE_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_WORKER_MODULE -D MOD_WSGI_MPM_EXISTS_PREFORK_MODULE -D FOREGROUND' ^C[Wed Sep 06 09:37:33.106471 2017] [mpm_event:notice] [pid 14:tid 140686654945024] AH00491: caught SIGTERM, shutting down [Wed Sep 06 09:37:33.254507 2017] [wsgi:warn] [pid 16:tid 140686654945024] mod_wsgi (pid=16): Callback registration for signal 28 ignored. [Wed Sep 06 09:37:33.256509 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/tmp/mod_wsgi-localhost:5000:0/handler.wsgi", line 94, in <module> [Wed Sep 06 09:37:33.256546 2017] [wsgi:warn] [pid 16:tid 140686654945024] recorder_directory=recorder_directory) [Wed Sep 06 09:37:33.256563 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/usr/local/python/lib/python2.7/site-packages/mod_wsgi/server/__init__.py", line 1355, in __init__ [Wed Sep 06 09:37:33.256642 2017] [wsgi:warn] [pid 16:tid 140686654945024] exec(code, self.module.__dict__) [Wed Sep 06 09:37:33.256720 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/app/myapp.py", line 325, in <module> [Wed Sep 06 09:37:33.256770 2017] [wsgi:warn] [pid 16:tid 140686654945024] signal.signal(signal.SIGWINCH, on_exit) 

即使我解决了以下问题,官方文档所带来的信息也困扰着我:

请注意,如果启用了注册信号处理程序的function,则只能从代码中可靠地执行这种注册,代码将作为导入由WSGIImportScript指令标识的脚本文件的副作用来实现。 这是因为信号处理程序只能从主要的Python解释器线程注册,并且在使用embedded模式时请求处理程序,而multithreading的Apache MPM通常会从辅助线程执行。 同样,使用守护进程模式时,请求处理程序将从辅助线程执行。 只有作为WSGIImportScript副作用运行的代码才能保证在主Python解释器线程中执行。

不要使用信号。 使用Python中的atexit模块来注册callback。 当进程closures时,callback将被调用。