在 Ubuntu(和 Debian 和其他发行版)中有一些 Apache 包(mpm-event、mpm-prefork、mpm-worker)。哪个最适合在单 CPU 服务器上托管 Django mod_wsgi 应用程序?哪个包最适合 OpenVZ 容器?
我有一个自定义的 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 驱动的应用程序组合了一个集成服务器。一些功能仍处于试验阶段,会导致请求过长。
我现在可以接受糟糕的表现,但我需要能够整合。每当我们使用导致长请求的功能时,应用程序就会挂起(如预期的那样),然后在大约一分半钟后返回“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) 澄清:以下错误仅针对admin静态文件,即特定于Django admin对应的静态文件。其余的静态文件工作正常。
基本上,我无法使用 ngix 服务器访问管理静态文件。
它确实与 Django 的微型服务器一起工作,并且collectstatic正在完成它的工作,这意味着它将文件放在静态文件夹中的预期位置。
网址是正确的,但我无法直接访问管理静态文件,但其他人可以。因此,例如:
我可以访问这个网址(在浏览器中复制它):
myserver.com:8080/static/css/base/base.css
但我无法访问这个其他 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
而且,
最后,这似乎是一个重要的线索:
我试图将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) 在这些配置了 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 配置为在 …
我的 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) 我使用 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 设置我的服务器到 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) 我有一个 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) 为了支持自动 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 ×10
nginx ×5
wsgi ×4
gunicorn ×3
python ×2
apache-2.2 ×1
apache2 ×1
cron ×1
lets-encrypt ×1
linux ×1
mod-wsgi ×1
openvz ×1
supervisord ×1
ubuntu ×1
uwsgi ×1
virtualenv ×1