python - 基于 Docker 的环境配置中带有 mod_wsgi 的 Apache

标签 python apache docker signals mod-wsgi

我需要设置:WSGIRestrictSignal Off,因为一旦调用正常关闭,我必须在 python 代码中执行一些操作。

来自文档:

行为良好的 Python WSGI 应用程序通常不应使用 signal.signal() 注册其自己的任何信号处理程序。原因是托管 WSGI 应用程序的 Web 服务器很可能会注册自己的信号处理程序。如果 WSGI 应用程序要覆盖此类信号处理程序,它可能会干扰 Web 服务器的操作,从而阻止服务器关闭和重新启动等操作。

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

这是我的 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”正在通过选择“默认”配置来执行所有操作。

由于 WSGIRestrictSignal 设置为“默认”,因此如果引发信号则无法捕获信号:

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)

即使我解决了以下问题,官方文档中的信息仍然困扰着我:

Do note that if enabling the ability to register signal handlers, such a registration can only reliably be done from within code which is implemented as a side effect of importing a script file identified by the WSGIImportScript directive. This is because signal handlers can only be registered from the main Python interpreter thread, and request handlers when using embedded mode and a multithreaded Apache MPM would generally execute from secondary threads. Similarly, when using daemon mode, request handlers would executed from secondary threads. Only code run as a side effect of WSGIImportScript is guaranteed to be executed in main Python interpreter thread.

最佳答案

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

关于python - 基于 Docker 的环境配置中带有 mod_wsgi 的 Apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46070085/

相关文章:

python - 定义用于更改列值和创建新数据集的函数

php - localhost htdocs 文件夹锁定,这可能吗?

python - 基于诗人 tensorflow 的图像分类器再训练期间运行retrain.py时出错

docker - packer docker builder 在docker镜像中配置docker

python - 将 pandas Dataframe 转换为字典时保留行的顺序

python - 在没有显示的Linux服务器上运行Python2应用程序时保存matplotlib绘图

python - 搜索具有许多不同值的多行

java - Java 中的 Docx 到 Pdf 转换器

apache - 配置错误页面以显示 modsecurity 的日志

docker - Docker的Windows基本镜像