2

我在 Linux 机器上的 Apache 上通过 mod_python 运行 Django。我有一个自定义身份验证后端,以及需要对所有页面进行身份验证的中间件,静态内容除外。

我的问题是登录后,我仍然会时不时地随机进入登录屏幕。在我看来,每个 apache 进程都有自己的 python 进程,而 python 进程又拥有自己的内部结构。因此,只要我得到与登录相同的流程的服务,一切都很好而且花花公子。但是,如果我的请求由不同的 apache 进程提供服务,我将不再通过身份验证。

我检查了我用 FireBug 发送的 HTTP 标头,它们每次都是相同的,即。同样的饼干。

这是一个已知问题吗?是否有解决方法/修复?

编辑:我有一个显示大量生成图像的页面。有些关闭这些将不会显示。这是因为他们太落后于认证中间件,所以他们会随机放一个登录图像。但是,刷新此页面足够多次,它最终会起作用,这意味着所有进程都会识别我的会话。

4

5 回答 5

2

您对 Apache 处理进程的方式是正确的,有时您会得到另一个进程的服务。当您对您的网站进行更改时,您可以看到这一点;新流程将接受更改,但旧流程将为您提供旧站点。要获得一致性,您必须重新启动 Apache。

假设重新启动不能解决问题,我猜这是“自定义身份验证后端”中的一些东西,将部分身份验证存储在内存中(这对于 Web 服务器来说效果不佳)。我会尝试MaxRequestsPerChild在您的 Apache 配置中设置为 1 并查看您是否仍然获得登录屏幕。如果你这样做了,有些东西被存储在内存中,也许模型没有被保存?

希望有帮助!

PS 只是出于好奇,您为什么要使用自定义身份验证后端和中间件来确保用户登录?似乎 Django 的 contrib.auth 和 @login_required 会更容易......

于 2008-10-03T12:15:14.397 回答
0

如果您使用一些全局变量来保存自定义身份验证会话的数据,则需要将其更改为使用文件、数据库或 memcached。如上所述,mod_python 启动的进程很少,它们之间没有共享内存。

我建议为此使用 memcached,还可以使用 cookie 存储会话 ID 或将其作为 GET 参数传递,以便稍后您可以轻松地从缓存中提取会话数据。

于 2009-03-30T21:12:26.017 回答
0

我强烈建议您不要将 MaxRequestsPerChild 设置为 1,因为这会导致大量开销,因为每个进程都会被杀死并随每个请求重新生成。

您使用的是 apaches preform MPM 还是 worker MPM?

看看http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs可能会给你一些帮助

于 2008-10-05T04:00:50.227 回答
0

您有标准的数据库驱动会话吗?设置中是否启用缓存?

于 2008-10-03T12:04:32.920 回答
0

如何确保 Apache 重启(或停止和启动)后会话不被清除?

因为当我升级我的源代码并重新启动 Apache 时,我刷新了网页,我必须再次登录。会话丢失。

会话存储在 Memcache 中。不知道它是如何以及为什么被清除的。如何保留会话以便用户在 apache 重启后无需登录?

于 2013-02-12T10:53:25.387 回答