标签: django

哪个 Apache 包最适合 mod_wsgi Django 应用程序?

在 Ubuntu(和 Debian 和其他发行版)中有一些 Apache 包(mpm-event、mpm-prefork、mpm-worker)。哪个最适合在单 CPU 服务器上托管 Django mod_wsgi 应用程序?哪个包最适合 OpenVZ 容器?

openvz django apache-2.2

8
推荐指数
2
解决办法
5123
查看次数

Apache/wsgi“脚本在返回标头之前超时”

我有一个自定义的 Django 应用程序,大约每 5,000 个请求就会变得无响应。在 apache 日志中,我看到以下内容:

Apr 13 11:45:07 www3 apache2[27590]: **successful view render here**
...
Apr 13 11:47:11 www3 apache2[24032]: [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting
Apr 13 11:47:43 www3 apache2[24032]: [error] server reached MaxClients setting, consider raising the MaxClients setting
...
Apr 13 11:50:34 www3 apache2[27617]: [error] [client 10.177.0.204] Script timed out before returning headers: django.wsgi
(repeated 100 times, exactly)
Run Code Online (Sandbox Code Playgroud)

我相信我正在使用以下配置运行 WSGI 2.6 (/usr/lib/apache2/modules/mod_wsgi.so-2.6):

阿帕奇配置

WSGIDaemonProcess site-1 user=django group=django threads=50
WSGIProcessGroup …
Run Code Online (Sandbox Code Playgroud)

django wsgi

8
推荐指数
1
解决办法
8524
查看次数

使用 gunicorn + nginx 长时间运行的请求

我已经为我们的 Django 驱动的应用程序组合了一个集成服务器。一些功能仍处于试验阶段,会导致请求过长。

我现在可以接受糟糕的表现,但我需要能够整合。每当我们使用导致长请求的功能时,应用程序就会挂起(如预期的那样),然后在大约一分半钟后返回“502 - Bad Gateway”。该应用程序的其余部分工作正常。

我检查了 gunicorn 日志,每当发生这种情况时,我都会得到这样的一行

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128)
Traceback (most recent call last):
  File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run
    os.setpgrp()
OSError: [Errno 1] Operation not permitted
Run Code Online (Sandbox Code Playgroud)

但是,这发生在实际工作人员超时之前很久,我将其设置为 10 分钟只是为了确保。这是运行 gunicorn 的 upstart 脚本的一部分。

description "..."

start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 5 seconds
kill timeout 5
respawn

env VENV="/path/to/a/virtual/env/"

#how to know the pid
pid file $VENV/run/guniconr-8080.pid

script
exec sudo …
Run Code Online (Sandbox Code Playgroud)

nginx django gunicorn

8
推荐指数
2
解决办法
1万
查看次数

nginx 不提供管理静态文件?

澄清以下错误仅针对admin静态文件,即特定于Django admin对应的静态文件。其余的静态文件工作正常。

问题

基本上,我无法使用 ngix 服务器访问管理静态文件

它确实与 Django 的微型服务器一起工作,并且collectstatic正在完成它的工作,这意味着它将文件放在静态文件夹中的预期位置。

网址是正确的,但我无法直接访问管理静态文件,但其他人可以。因此,例如:

  1. 我可以访问这个网址(在浏览器中复制它): myserver.com:8080/static/css/base/base.css

  2. 但我无法访问这个其他 url(在浏览器中复制它): myserver.com:8080/static/admin/css/admin.css


我尝试了什么?

不工作,如果我复制admin/的目录结构为__other_admin_directory_name/__,然后我访问 myserver.com:8080/static/__other_admin_directory_name__/css/admin.css

而且,

  1. 我检查了权限,一切都很好。
  2. 我试图将 ADMIN_MEDIA_PREFIX = '/static/admin/' 更改为 ADMIN_MEDIA_PREFIX = '/static/ other_admin_directory_name /',它不起作用。

最后,这似乎是一个重要的线索:

我试图将admin/目录结构复制到__admin_and_then_any_suffix/__. 然后我无法访问 myserver.com:8080/static/__admin_and_then_any_suffix/__/css/admin.css. 因此,如果目录的名称以admin(例如管理或admin2)开头,则它不起作用


编辑 - 添加感谢@sarnold 观察:

问题似乎出在nginx配置文件/etc/nginx/sites-available/mysite

location /static/admin {
   alias /home/vl3/.virtualenvs/vl3/lib/python2.7/site-packages/django/contrib/admin/media/;
}
Run Code Online (Sandbox Code Playgroud)

nginx django

8
推荐指数
1
解决办法
3万
查看次数

gunicorn + django + nginx unix://socket failed (11: 资源暂时不可用)

在这些配置了 django、gunicorn、supervisor 和 nginx 的服务器上运行非常高的流量。但很多时候我往往会看到 502 错误。所以我检查了 nginx 日志以查看什么错误,这是记录的内容:

[错误] 2388#0:*208027 connect() to unix:/tmp/gunicorn-ourapp.socket 在连接到上游时失败(11:资源暂时不可用)

任何人都可以帮助调试可能导致这种情况发生的原因吗?

这是我们的 nginx 配置:

sendfile on;
tcp_nopush on;
tcp_nodelay off;

listen 80 default_server;
server_name imp.ourapp.com;
access_log /mnt/ebs/nginx-log/ourapp-access.log;
error_log /mnt/ebs/nginx-log/ourapp-error.log;

charset utf-8;
keepalive_timeout 60;
client_max_body_size 8m;

gzip_types text/plain text/xml text/css application/javascript application/x-javascript application/json;

location / {
    proxy_pass http://unix:/tmp/gunicorn-ourapp.socket;
    proxy_pass_request_headers on;
    proxy_read_timeout 600s;
    proxy_connect_timeout 600s;
    proxy_redirect http://localhost/ http://imp.ourapp.com/;
    #proxy_set_header Host              $host;
    #proxy_set_header X-Real-IP         $remote_addr;
    #proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    #proxy_set_header X-Forwarded-Proto $my_scheme;
    #proxy_set_header X-Forwarded-Ssl   $my_ssl;
}
Run Code Online (Sandbox Code Playgroud)

我们已经将 Django 配置为在 …

linux nginx django wsgi gunicorn

8
推荐指数
1
解决办法
8449
查看次数

Django + gunicorn + virtualenv + Supervisord 问题

我的 virtualenv + gunicorn 设置有一个奇怪的问题,只有当 gunicorn 通过 supervisord 启动时。我确实意识到这很可能是我的主管的问题,我将不胜感激任何有关寻求帮助的更好地方的反馈...

简而言之:当我从我的用户 shell 运行 gunicorn 时,在我的 virtualenv 中,一切都完美无缺。我能够访问我的 Django 项目的所有视图。

当系统启动时supervisord启动gunicorn时,一切正常。

但是,如果我必须终止 gunicorn_django 进程,或者如果我执行 supervisord 重新启动,一旦 gunicorn_django 重新启动,每个请求都会用奇怪的 Traceback 回答:

(...)
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/__init__.py", line 77, in
    connection = connections[DEFAULT_DB_ALIAS]
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 92, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 50, in load_backend
    raise ImproperlyConfigured(error_msg)
TemplateSyntaxError: Caught ImproperlyConfigured while rendering: 'django.db.backends.postgresql_psycopg2' isn't an available database backend.
Try using django.db.backends.XXX, where XXX is one of:
    'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3'
Error …
Run Code Online (Sandbox Code Playgroud)

python django virtualenv supervisord gunicorn

7
推荐指数
1
解决办法
5471
查看次数

如何让 nginx 将 HTTP_AUTHORIZATION 标头传递给 Apache

我使用 Nginx 作为使用 HTTP 身份验证的 Apache 服务器的反向代理。出于某种原因,我无法将 HTTP_AUTHORIZATION 标头传递给 Apache,它似乎被 Nginx 过滤掉了。因此,没有请求可以进行身份​​验证。

请注意,基本身份验证是动态的,因此我不想在我的 nginx 配置中对其进行硬编码。

我的 nginx 配置是:

server {

    listen   80;
    server_name  example.co.uk ;

    access_log  /var/log/nginx/access.cdk-dev.tangentlabs.co.uk.log;

    gzip on;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 120;

    location / {
            proxy_pass http://localhost:81/;
    }

    location ~* \.(jpg|png|gif|jpeg|js|css|mp3|wav|swf|mov|doc|xls|ppt|docx|pptx|xlsx|swf)$ {
    if (!-f $request_filename) {
        break;
                proxy_pass http://localhost:81;
    }

            root /var/www/example;
    }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?

更新- 原来这个问题是我在我的原始问题中忽略的:mod_wsgi。这里有问题的站点是一个 Django 站点,事实证明 Apache 确实通过了 auth 变量,但是 mod_wsgi 将它们过滤掉了。

决议是使用:

WSGIPassAuthorization On
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅http://www.arnebrodowski.de/blog/508-Django,-mod_wsgi-and-HTTP-Authentication.html

nginx django wsgi mod-wsgi

7
推荐指数
1
解决办法
3万
查看次数

ubuntu + nginx + uwsgi + django 找不到 Python 应用程序

我正在尝试使用 nginx 设置我的服务器到 uwsgi 到 django 堆栈,但是我遇到了 uwsgi 部分的问题。

当我运行 uwsgi 并在命令行中传入所有参数时,它可以正常工作。我的 uwsgi 调用如下所示:

uwsgi --socket /tmp/uwsgi.sock --chdir ~/web/test.com --wsgi-file ~/web/test.com/store/wsgi.py --virtualenv ~/web/test.com/testenv --chmod-socket=666 --enable-threads
Run Code Online (Sandbox Code Playgroud)

然后我将这些参数复制到一个如下所示的 ini 文件中:

# django.ini file
[uwsgi]
master          = true 
socket          = /tmp/uwsgi.sock
chmod-socket    = 666
chdir           = /home/ubuntu/web/test.com
wsgi_file       = /home/ubuntu/web/test.com/store/wsgi.py
virtualenv      = /home/ubuntu/web/test.com/causumptionenv
vacuum          = true
enable-threads  = true
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 django.ini 文件运行 uwsgi 时,我得到了这个输出。

[uWSGI] getting INI configuration from django.ini
*** Starting uWSGI 1.9.11 (64bit) on [Fri May 31 14:52:44 2013] ***
compiled …
Run Code Online (Sandbox Code Playgroud)

ubuntu nginx django uwsgi

7
推荐指数
1
解决办法
3万
查看次数

通过虚拟环境运行 Django Python 命令的 Cron 作业不起作用

我有一个 crontab 文件,据说在加载项目虚拟环境后执行 Django 命令:

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand
Run Code Online (Sandbox Code Playgroud)

...但它绝对没有任何作用。cron 日志输出没有特别的问题:

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)
Run Code Online (Sandbox Code Playgroud)

不用说,当复制粘贴到 shell 中时,命令本身可以完美运行。

我知道它与我的 crontab 的环境变量有关,但我对这件事非常缺乏教育,而且我不知道该怎么做,尤其是当它在 python 虚拟环境下运行时。它应该使用我的用户环境变量吗?来自 virtualenv 的那些?如何实施?谢谢!

注意:如果有帮助,我的 crontab 环境变量有以下输出(当通过 crontab 将“env”导出到文件时):

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root
Run Code Online (Sandbox Code Playgroud)

以及项目虚拟环境下的以下环境变量:

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22 …
Run Code Online (Sandbox Code Playgroud)

python environment-variables django cron

7
推荐指数
1
解决办法
3494
查看次数

如何让 apache 处理 .well-known/acme-challenge 并仍然将 / 传递给 wsgi

为了支持自动 LetsEncrypt 证书续订,certbot 使用--apache处理程序。

例如

certbot renew --apache
Run Code Online (Sandbox Code Playgroud)

该处理程序在 Apache 服务器上为*/.well-known/acme-challenge/安装一个临时 VirtualHost ,以验证续订。

问题是,如果现有虚拟服务器使用安装在 http 服务器根目录上的 HTTPS 和 Django over WSGI,则此机制不起作用。

临时 VirtualHost 无法捕获 URL,因此 Django 尝试为请求提供服务(但失败),因为该 URL 不在其 URL 列表中。

django wsgi lets-encrypt apache2

7
推荐指数
1
解决办法
7226
查看次数