使用 Apache bench 在 AWS 小实例 (Ubuntu 10.04) 上对 django 1.21/Apache/mod_wsgi 配置进行负载测试时,在低并发请求下显示出极高的 CPU 负载(使用正常运行时间和 vmstat):
ab -c 5 -n 1000 "my_url"
Run Code Online (Sandbox Code Playgroud)
...导致此正常运行时间输出:
18:04:54 up 9 days, 16:54, 3 users, load average: 5.33, 2.45, 1.91
Run Code Online (Sandbox Code Playgroud)
即使 Apache bench 并发值为 2,CPU 仍为 100%。我正在同一区域/区域中的不同 AWS 实例中运行 Apache bench。关于问题出在哪里的想法,或者我应该如何继续调试?
细节:
这是负载测试之前/期间/之后的 vmstat 输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 …Run Code Online (Sandbox Code Playgroud) 我正在使用 FastCGI 在 nginx 后面运行 Django。我发现在发送给客户端的一些响应中,响应中间发生了随机数据损坏(中间可能有几百个字节左右)。
在这一点上,我已将其范围缩小为 nginx 的 FastCGI 处理程序或 Django 的 FastCGI 处理程序中的错误(即可能是 flup 中的错误),因为当我在独立(即runserver)模式下运行 Django 服务器时,从未发生此问题。它只发生在 FastCGI 模式下。
其他有趣的趋势:
它往往发生在较大的响应上。当客户端第一次登录时,它们会被发送一堆 1MB 块以将它们同步到服务器数据库。在第一次同步之后,响应要小得多(通常一次只有几 KB)。损坏似乎总是发生在开始时发送的那些 1MB 块上。
当客户端通过 LAN 连接到服务器(即低延迟、高带宽连接)时,这种情况发生得更频繁。这让我觉得在 nginx 或 flup 中存在某种竞争条件,并且会因数据速率的增加而加剧。
现在,我不得不通过在响应标头中放置一个额外的 SHA1 摘要来解决这个问题,并让客户端拒绝标头与正文校验和不匹配的响应,但这是一种可怕的解决方案。
有没有其他人经历过这样的事情,或者有任何关于如何确定是 flup 还是 nginx 有问题的指示,以便我可以向适当的团队提交错误?
在此先感谢您的帮助。
注意:我也在 lighttpd + FastCGI + Django 中发布了一个类似的错误:https : //stackoverflow.com/questions/3714489/lighttpd-fastcgi-django-truncated-response-sent-to-client-due-to - 出乎意料......即使这不是一回事(截断与损坏),它开始看起来像共同的罪魁祸首是 flup / Django 而不是 web 服务器..
编辑:我还应该注意我的环境是什么:
Mac Mini 上的 OSX 10.6.6
Python 2.6.1(系统)
Django 1.3(来自官方压缩包)
flup 1.0.2(来自 flup 站点上的 Python …
由于我无法控制的原因,我们的网站由托管服务提供商托管,该提供商将 IIS 用于其服务器。他们目前通过 cgi-scripts 提供 PHP 和 ASP,以及 Python 和 Perl。
我想重新设计、重新编写我们的网站,并想从 PHP 更改为 Python/Django 设置。托管服务提供商对建议持开放态度,但明确表示“我们真的不知道 Python 是什么,也不知道它是如何工作的,但如果您能向我们解释,我们会尽力为您设置所需的一切” .
但是,我可能知道如何在 apache/mod_python 上的共享托管环境中设置 Django,但我不知道如何在 IIS 上设置它,当然也不知道如何为共享托管环境设置它。我用谷歌搜索了一下,但我找到的大部分资源都假设系统管理员 1) 知道 Python/Django 和 2) 正在为他的站点使用专用的 IIS 托管。
有人可以解释我如何向我的托管服务提供商解释这个过程,或者给我指点我可以转发给我的托管服务提供商的好的、详细的资源吗?请记住,运行主机的人可能知道关于 IIS 的“一切”,但不知道如何处理 Python。
我按照官方教程/文档的说明为我的 Django 项目安装了 Celery。当我在命令行启动 celery 时它工作正常,我可以看到它接收任务并执行它们。但是一旦一切正常,我决定更多地遵循文档来守护芹菜并让它一直运行。因此,我也使用 /etc/default/celeryd 脚本在 Ubuntu 系统上尝试了提供的 celeryd init 脚本。我相应地更改了值并正确启动,但是当它收到任务时,日志显示:
ERROR/MainProcess] Received unregistered task of type 'likes.tasks.test'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
Run Code Online (Sandbox Code Playgroud)
然后我得到了任务要求的细节。同样,当我在没有任何配置的情况下在命令行上启动 celery 时,此任务可以完美运行。那时可能出了什么问题?我使用虚拟环境以防万一它会改变任何东西,但我也在配置文件中指定了它。
我有一个 Django 站点,我试图通过 uWSGI 为其提供服务。我已经像这样启动了服务器:
uwsgi --emperor .
Ctrl+Z
bg 1
Run Code Online (Sandbox Code Playgroud)
(有两个.ini文件,分别指向网站的测试版和生产版,分别服务于9001和9002)
然后我尝试获取我的网站:
curl http://localhost:9002
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到一条消息,说 vassel 是忠诚的,但没有实际响应。然后 uwsgi.log 包含以下内容:
[pid: 5071|app: 0|req: 2/2] 127.0.0.1 () {26 vars in 357 bytes} [Tue Jul 23 13:20:21 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 302) 2 headers in 96 bytes (1 switches on core 1)
Run Code Online (Sandbox Code Playgroud)
没有错误记录。
我应该说,这在重新启动之前工作正常,因此 uwsgi.ini 文件应该没问题。
我应该从哪里开始诊断的任何想法?
我的服务器上收到无效的 HTTP_HOST 标头错误。我不明白为什么会发生这种情况以及如何解决它。每次发生这种情况时,后端都会停止工作,我必须重新启动服务器。
任何帮助将不胜感激。
提前致谢!
仅供参考:服务器是aws ec2;前端是 Angular 的,后端是带有 Gunicorn 的 django/drf 。Angular 和 DRF 都部署在同一台服务器上。
错误 0。如果我没有在 nginx.conf 中设置 Host 变量,我会多次收到以下错误。无效的 HTTP_HOST 标头:“/run/gunicorn.sock:”。根据 RFC 1034/1035,提供的域名无效。
如果我在 nginx.conf 中设置 Host 变量,则会出现以下错误。
错误1. proxy_set_header 主机$http_host;
无效的 HTTP_HOST 标头:“127.0.0.1:8000,127.0.0.1:8000”。根据 RFC 1034/1035,提供的域名无效。
错误2. proxy_set_header 主机$host;
无效的 HTTP_HOST 标头:“127.0.0.1:8000,127.0.0.1”。根据 RFC 1034/1035,提供的域名无效。
错误 3. proxy_set_header 主机 $server_name;
无效的 HTTP_HOST 标头:“13.234.187.18,13.234.187.18:8000”。根据 RFC 1034/1035,提供的域名无效。
nginx.conf 如下。
server {
listen 8000;
server_name 13.234.187.18;
location / {
proxy_set_header Host $host;
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Run Code Online (Sandbox Code Playgroud)
我在 nginx 网站上找到了以下代码。它会解决这个问题吗? …
我正在尝试部署 Django 应用程序,但遇到了障碍。在 Debian(最新)上,到目前为止我已经运行了这些命令:
apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-python python-django
Run Code Online (Sandbox Code Playgroud)
我已经尝试在 Apache 2 配置文件中手动添加模块,但老实说我完全迷失了。它与我多年前使用的 Apache 版本 1 完全不同。
Syntax error on line 7 of /etc/apache2/sites-enabled/000-default:
Invalid command 'PythonHandler', perhaps misspelled or defined by a module not included in the server configuration
Run Code Online (Sandbox Code Playgroud)
我已将以下内容添加到我的sites-available/default文件中的标签之间。
<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE hellodjango1.settings
PythonDebug Off
</Location>
Run Code Online (Sandbox Code Playgroud)
以下是我到目前为止使用过的教程,但运气不佳:
我正在尝试在我的本地 ubuntu 机器上使用 django 应用程序。但是,该站点无法正常工作,并且我的站点中/var/log/apache2/errors.log充满了如下消息:
ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)
我的/var/log/apache2/error.log(今天)看起来像这样:
$ cat error.log | uniq -c
1 [Wed Jun 29 09:37:37 2011] [notice] Apache/2.2.17 (Ubuntu) mod_wsgi/3.3 Python/2.7.1+ configured -- resuming normal operations
12966 ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)
这是当我打开机器时它启动的通知,然后是 12,966 行都在说no module named site消息
请注意缺少日期时间字段。即使不访问网站(即,即使不发出网络请求),也会重复这些错误。在浏览器中访问网站时,它只是挂起,好像在等待大量下载。
我正在使用 python 2.5 virtualenv,其中安装了很多包(包括 django 1.1)和 pip。我已经加载了 mod_wsgi:
$ ls -l /etc/apache2/mods-enabled/wsgi*
lrwxrwxrwx 1 root root 27 2010-10-04 16:50 /etc/apache2/mods-enabled/wsgi.conf -> ../mods-available/wsgi.conf
lrwxrwxrwx 1 root …Run Code Online (Sandbox Code Playgroud) 我想将 postgresql 与 django 一起使用,因此执行了以下操作:
sudo apt-get install libpq-dev python-dev
sudo apt-get update
workon myenv
sudo pip install psycopg2
Run Code Online (Sandbox Code Playgroud)
在settings.py正确配置我之后,我运行
./manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
但是会抛出异常:
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2
Run Code Online (Sandbox Code Playgroud)
数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mydb',
'USER': 'postgres',
'PASSWORD': 'password1234',
'HOST': 'localhost',
'PORT': '',
}
}
Run Code Online (Sandbox Code Playgroud) 我这里有很多活动部件,所以,我不确定出了什么问题。我这样设置我的变量:
但是在构建阶段,我遇到了这个失败(这是一个 Django 应用程序):
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
! Error while running '$ python manage.py collectstatic --noinput'.
See traceback above for details.
You may need to update application code to resolve this error.
Or, you can disable collectstatic for this application:
$ heroku config:set DISABLE_COLLECTSTATIC=1
https://devcenter.heroku.com/articles/django-assets
Run Code Online (Sandbox Code Playgroud)
如果 UI 中的其他地方有我遗漏的线索,这是输出:
我创建了一个公共骨架应用程序来展示和调试这个问题:https : //gitlab.com/pupeno/example/-/jobs/113402553
我错过了什么将环境变量暴露给构建过程?
我复制了 Auto DevOps他们的.gitlab-ci.yml模板并添加了:
variables:
# ...
SECRET_KEY: $SECRET_KEY
Run Code Online (Sandbox Code Playgroud)
以及硬编码以防万一$SECRET_KEY …
django ×10
apache-2.2 ×3
mod-wsgi ×2
nginx ×2
python ×2
celery ×1
corruption ×1
debian ×1
fastcgi ×1
gitlab ×1
gunicorn ×1
iis ×1
mod-python ×1
postgresql ×1
ubuntu ×1
uwsgi ×1
virtualenv ×1
web-hosting ×1
wsgi ×1